|
|
|
@ -20,9 +20,9 @@ |
|
|
|
// NOTE: forward declarations
|
|
|
|
// NOTE: forward declarations
|
|
|
|
|
|
|
|
|
|
|
|
const std::string dumpTextFile(const char* filepath); |
|
|
|
const std::string dumpTextFile(const char* filepath); |
|
|
|
bool parseShader(MemoryArena* arena, GLContext* gl_ctx, shader_program* s); |
|
|
|
bool parseShader(MemoryArena* arena, GLContext* gl_ctx, ShaderProgram* s); |
|
|
|
void initCTXSizes(GLContext* gl_ctx); |
|
|
|
void initCTXSizes(GLContext* gl_ctx); |
|
|
|
bool compileAndLinkShader(shader_program* shader, |
|
|
|
bool compileAndLinkShader(ShaderProgram* shader, |
|
|
|
const char* vert_src, |
|
|
|
const char* vert_src, |
|
|
|
const char* frag_src, |
|
|
|
const char* frag_src, |
|
|
|
GLuint& vs_id, |
|
|
|
GLuint& vs_id, |
|
|
|
@ -53,7 +53,7 @@ addShaderProgram(MemoryArena* arena, |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
shader_program* s = getFreeShader(gl_ctx); |
|
|
|
ShaderProgram* s = getFreeShader(gl_ctx); |
|
|
|
|
|
|
|
|
|
|
|
if (s) { |
|
|
|
if (s) { |
|
|
|
s->name = arenaCopyCStr(arena, name); |
|
|
|
s->name = arenaCopyCStr(arena, name); |
|
|
|
@ -87,7 +87,7 @@ addShaderProgram(MemoryArena* arena, |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
shader_program* |
|
|
|
ShaderProgram* |
|
|
|
getFreeShader(GLContext* gl_ctx) |
|
|
|
getFreeShader(GLContext* gl_ctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (gl_ctx->num_shaders >= gl_ctx->max_shaders) { |
|
|
|
if (gl_ctx->num_shaders >= gl_ctx->max_shaders) { |
|
|
|
@ -95,11 +95,11 @@ getFreeShader(GLContext* gl_ctx) |
|
|
|
return nullptr; |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
shader_program* s = &gl_ctx->shaders[gl_ctx->num_shaders++]; |
|
|
|
ShaderProgram* s = &gl_ctx->shaders[gl_ctx->num_shaders++]; |
|
|
|
return s; |
|
|
|
return s; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
shader_program* |
|
|
|
ShaderProgram* |
|
|
|
getShaderByHash(GLContext* gl_ctx, u64 hash) |
|
|
|
getShaderByHash(GLContext* gl_ctx, u64 hash) |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (u32 i; i < gl_ctx->num_shaders; i++) { |
|
|
|
for (u32 i; i < gl_ctx->num_shaders; i++) { |
|
|
|
@ -110,7 +110,7 @@ getShaderByHash(GLContext* gl_ctx, u64 hash) |
|
|
|
return nullptr; |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
shader_program* |
|
|
|
ShaderProgram* |
|
|
|
getShaderByName(const char* name, GLContext* gl_ctx) |
|
|
|
getShaderByName(const char* name, GLContext* gl_ctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// FIXME: no reason to use hashes here. should use std::strncmp instead
|
|
|
|
// FIXME: no reason to use hashes here. should use std::strncmp instead
|
|
|
|
@ -125,7 +125,7 @@ getShaderByName(const char* name, GLContext* gl_ctx) |
|
|
|
return nullptr; |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
shader_program* |
|
|
|
ShaderProgram* |
|
|
|
getShaderByID(GLContext* gl_ctx, GLuint prog_id) |
|
|
|
getShaderByID(GLContext* gl_ctx, GLuint prog_id) |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (u32 i = 0; i < gl_ctx->num_shaders; i++) { |
|
|
|
for (u32 i = 0; i < gl_ctx->num_shaders; i++) { |
|
|
|
@ -167,7 +167,7 @@ getGLTexture(GLContext* gl_ctx, util_image* diffuse_img) |
|
|
|
void |
|
|
|
void |
|
|
|
renderVAO(GLmesh* glmesh, |
|
|
|
renderVAO(GLmesh* glmesh, |
|
|
|
glm::mat4* model_xform, |
|
|
|
glm::mat4* model_xform, |
|
|
|
shader_program* shader, |
|
|
|
ShaderProgram* shader, |
|
|
|
GLuint tex_id) |
|
|
|
GLuint tex_id) |
|
|
|
{ |
|
|
|
{ |
|
|
|
glUseProgram(shader->prog_id); |
|
|
|
glUseProgram(shader->prog_id); |
|
|
|
@ -188,8 +188,8 @@ renderVAO(GLmesh* glmesh, |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
initTransforms(MemoryArena* arena, |
|
|
|
initTransforms(MemoryArena* arena, |
|
|
|
transforms* xforms, |
|
|
|
Transforms* xforms, |
|
|
|
gl_buffer* xform_ubo, |
|
|
|
GLBuffer* xform_ubo, |
|
|
|
GLContext* gl_ctx, |
|
|
|
GLContext* gl_ctx, |
|
|
|
float fov, |
|
|
|
float fov, |
|
|
|
float near_clip_plane, |
|
|
|
float near_clip_plane, |
|
|
|
@ -216,7 +216,7 @@ initTransforms(MemoryArena* arena, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
GLVertexAttrib* |
|
|
|
GLVertexAttrib* |
|
|
|
getVertexAttribByName(shader_program* shader, const char* name) |
|
|
|
getVertexAttribByName(ShaderProgram* shader, const char* name) |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (u32 i = 0; i < shader->num_vertex_attribs; i++) { |
|
|
|
for (u32 i = 0; i < shader->num_vertex_attribs; i++) { |
|
|
|
if (strncmp(shader->vertex_attribs[i].name, name, 256) == 0) |
|
|
|
if (strncmp(shader->vertex_attribs[i].name, name, 256) == 0) |
|
|
|
@ -235,8 +235,8 @@ initGLmesh(const mesh& m, u32 num_mappings, GLenum draw_mode) |
|
|
|
glm.draw_mode = draw_mode; |
|
|
|
glm.draw_mode = draw_mode; |
|
|
|
glm.usage = GL_STATIC_DRAW; // TODO: logic for updating dynamic meshes
|
|
|
|
glm.usage = GL_STATIC_DRAW; // TODO: logic for updating dynamic meshes
|
|
|
|
glm.num_vertex_attrib_buffers = num_mappings; |
|
|
|
glm.num_vertex_attrib_buffers = num_mappings; |
|
|
|
glm.vertex_attrib_buffers = UTIL_ALLOC(num_mappings, gl_buffer); |
|
|
|
glm.vertex_attrib_buffers = UTIL_ALLOC(num_mappings, GLBuffer); |
|
|
|
glm.element_buf = UTIL_ALLOC(1, gl_buffer); |
|
|
|
glm.element_buf = UTIL_ALLOC(1, GLBuffer); |
|
|
|
glm.model_xform = UTIL_ALLOC(1, glm::mat4); |
|
|
|
glm.model_xform = UTIL_ALLOC(1, glm::mat4); |
|
|
|
*glm.model_xform = glm::mat4(1); |
|
|
|
*glm.model_xform = glm::mat4(1); |
|
|
|
|
|
|
|
|
|
|
|
@ -244,7 +244,7 @@ initGLmesh(const mesh& m, u32 num_mappings, GLenum draw_mode) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
initGLAttribBuffer(gl_buffer* buf, GLenum target, GLVertexAttrib* attrib) |
|
|
|
initGLAttribBuffer(GLBuffer* buf, GLenum target, GLVertexAttrib* attrib) |
|
|
|
{ |
|
|
|
{ |
|
|
|
glGenBuffers(1, &buf->id); |
|
|
|
glGenBuffers(1, &buf->id); |
|
|
|
buf->target = target; |
|
|
|
buf->target = target; |
|
|
|
@ -263,14 +263,14 @@ loadGLMesh(const mesh& m, |
|
|
|
GLBufferToAttribMapping mappings[]) |
|
|
|
GLBufferToAttribMapping mappings[]) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// NOTE: need to use freeGLMesh() when freeing because we're not storing
|
|
|
|
// NOTE: need to use freeGLMesh() when freeing because we're not storing
|
|
|
|
// the gl_buffers on a memory arean (yet)
|
|
|
|
// the GLBuffers on a memory arean (yet)
|
|
|
|
GLmesh glm = initGLmesh(m, num_mappings, draw_mode); |
|
|
|
GLmesh glm = initGLmesh(m, num_mappings, draw_mode); |
|
|
|
glm.tex_id = diffuse_texture_id; |
|
|
|
glm.tex_id = diffuse_texture_id; |
|
|
|
glGenVertexArrays(1, &glm.vao_id); |
|
|
|
glGenVertexArrays(1, &glm.vao_id); |
|
|
|
glBindVertexArray(glm.vao_id); |
|
|
|
glBindVertexArray(glm.vao_id); |
|
|
|
|
|
|
|
|
|
|
|
for (u32 i = 0; i < num_mappings; i++) { |
|
|
|
for (u32 i = 0; i < num_mappings; i++) { |
|
|
|
gl_buffer& buf = glm.vertex_attrib_buffers[i]; |
|
|
|
GLBuffer& buf = glm.vertex_attrib_buffers[i]; |
|
|
|
GLVertexAttrib* attrib = mappings[i].attrib; |
|
|
|
GLVertexAttrib* attrib = mappings[i].attrib; |
|
|
|
u32 type_size = getGLTypeSize(attrib->data_type); |
|
|
|
u32 type_size = getGLTypeSize(attrib->data_type); |
|
|
|
assert(type_size > 0); |
|
|
|
assert(type_size > 0); |
|
|
|
@ -359,7 +359,7 @@ loadGLTexture(util_image* image, GLuint& tex_id) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
bool |
|
|
|
compileAndLinkShader(shader_program* shader, |
|
|
|
compileAndLinkShader(ShaderProgram* shader, |
|
|
|
const char* vert_src, |
|
|
|
const char* vert_src, |
|
|
|
const char* frag_src, |
|
|
|
const char* frag_src, |
|
|
|
GLuint& vs_id, |
|
|
|
GLuint& vs_id, |
|
|
|
@ -435,10 +435,10 @@ getGLTypeSizeStd140(GLenum e) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const gl_uniform |
|
|
|
const GLUniform |
|
|
|
parseUniform(MemoryArena* arena, shader_program* s, u32 uniform_idx) |
|
|
|
parseUniform(MemoryArena* arena, ShaderProgram* s, u32 uniform_idx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
gl_uniform unif = {0}; |
|
|
|
GLUniform unif = {0}; |
|
|
|
GLchar unif_name[256] = {0}; |
|
|
|
GLchar unif_name[256] = {0}; |
|
|
|
GLsizei name_len = 0; |
|
|
|
GLsizei name_len = 0; |
|
|
|
|
|
|
|
|
|
|
|
@ -460,7 +460,7 @@ parseUniform(MemoryArena* arena, shader_program* s, u32 uniform_idx) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
bool |
|
|
|
parseShaderUniforms(MemoryArena* arena, shader_program* s, GLContext* gl_ctx) |
|
|
|
parseShaderUniforms(MemoryArena* arena, ShaderProgram* s, GLContext* gl_ctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// NOTE: only add uniforms in the default block to the base uniform array
|
|
|
|
// NOTE: only add uniforms in the default block to the base uniform array
|
|
|
|
GLint num_uniforms_total = 0; |
|
|
|
GLint num_uniforms_total = 0; |
|
|
|
@ -478,10 +478,10 @@ parseShaderUniforms(MemoryArena* arena, shader_program* s, GLContext* gl_ctx) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
s->uniforms = ARENA_ALLOC(arena, gl_uniform, s->num_uniforms); |
|
|
|
s->uniforms = ARENA_ALLOC(arena, GLUniform, s->num_uniforms); |
|
|
|
|
|
|
|
|
|
|
|
for (u32 i = 0; i < s->num_uniforms; i++) { |
|
|
|
for (u32 i = 0; i < s->num_uniforms; i++) { |
|
|
|
const gl_uniform unif = parseUniform(arena, s, indices[i]); |
|
|
|
const GLUniform unif = parseUniform(arena, s, indices[i]); |
|
|
|
std::memcpy(&s->uniforms[i], &unif, sizeof(unif)); |
|
|
|
std::memcpy(&s->uniforms[i], &unif, sizeof(unif)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -520,7 +520,7 @@ i32 |
|
|
|
ctxGetUniformBlockBinding(GLContext* gl_ctx, const char* name) |
|
|
|
ctxGetUniformBlockBinding(GLContext* gl_ctx, const char* name) |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (u32 i = 0; i < gl_ctx->num_ubos; i++) { |
|
|
|
for (u32 i = 0; i < gl_ctx->num_ubos; i++) { |
|
|
|
gl_buffer& ubo = gl_ctx->uniform_buffers[i]; |
|
|
|
GLBuffer& ubo = gl_ctx->uniform_buffers[i]; |
|
|
|
|
|
|
|
|
|
|
|
if (std::strstr(ubo.name, name)) |
|
|
|
if (std::strstr(ubo.name, name)) |
|
|
|
return ubo.binding_idx; |
|
|
|
return ubo.binding_idx; |
|
|
|
@ -531,7 +531,7 @@ ctxGetUniformBlockBinding(GLContext* gl_ctx, const char* name) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
bool |
|
|
|
parseUniformBlocks(MemoryArena* arena, shader_program* s, GLContext* gl_ctx) |
|
|
|
parseUniformBlocks(MemoryArena* arena, ShaderProgram* s, GLContext* gl_ctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
glGetProgramiv(s->prog_id, GL_ACTIVE_UNIFORM_BLOCKS, |
|
|
|
glGetProgramiv(s->prog_id, GL_ACTIVE_UNIFORM_BLOCKS, |
|
|
|
(GLint*) &s->num_blocks); |
|
|
|
(GLint*) &s->num_blocks); |
|
|
|
@ -549,13 +549,13 @@ parseUniformBlocks(MemoryArena* arena, shader_program* s, GLContext* gl_ctx) |
|
|
|
|
|
|
|
|
|
|
|
glGetActiveUniformBlockiv(s->prog_id, i, |
|
|
|
glGetActiveUniformBlockiv(s->prog_id, i, |
|
|
|
GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, (GLint*) &ub.num_uniforms); |
|
|
|
GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, (GLint*) &ub.num_uniforms); |
|
|
|
ub.uniforms = ARENA_ALLOC(arena, gl_uniform, ub.num_uniforms); |
|
|
|
ub.uniforms = ARENA_ALLOC(arena, GLUniform, ub.num_uniforms); |
|
|
|
GLint indices[ub.num_uniforms] = {0}; |
|
|
|
GLint indices[ub.num_uniforms] = {0}; |
|
|
|
glGetActiveUniformBlockiv(s->prog_id, i, |
|
|
|
glGetActiveUniformBlockiv(s->prog_id, i, |
|
|
|
GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, (GLint*) &indices); |
|
|
|
GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, (GLint*) &indices); |
|
|
|
|
|
|
|
|
|
|
|
for (u32 j = 0; j < ub.num_uniforms; j++) { |
|
|
|
for (u32 j = 0; j < ub.num_uniforms; j++) { |
|
|
|
const gl_uniform unif = parseUniform(arena, s, indices[j]); |
|
|
|
const GLUniform unif = parseUniform(arena, s, indices[j]); |
|
|
|
std::memcpy(&ub.uniforms[j], &unif, sizeof(unif)); |
|
|
|
std::memcpy(&ub.uniforms[j], &unif, sizeof(unif)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -598,7 +598,7 @@ getAttribComponentType(GLenum type) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
bool |
|
|
|
parseAttributes(MemoryArena* arena, shader_program* s, GLContext* gl_ctx) |
|
|
|
parseAttributes(MemoryArena* arena, ShaderProgram* s, GLContext* gl_ctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
GLint num_attribs; |
|
|
|
GLint num_attribs; |
|
|
|
glGetProgramiv(s->prog_id, GL_ACTIVE_ATTRIBUTES, &num_attribs); |
|
|
|
glGetProgramiv(s->prog_id, GL_ACTIVE_ATTRIBUTES, &num_attribs); |
|
|
|
@ -630,7 +630,7 @@ parseAttributes(MemoryArena* arena, shader_program* s, GLContext* gl_ctx) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
bool |
|
|
|
parseShader(MemoryArena* arena, GLContext* gl_ctx, shader_program* s) |
|
|
|
parseShader(MemoryArena* arena, GLContext* gl_ctx, ShaderProgram* s) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (parseShaderUniforms(arena, s, gl_ctx) |
|
|
|
if (parseShaderUniforms(arena, s, gl_ctx) |
|
|
|
&& parseUniformBlocks(arena, s, gl_ctx) |
|
|
|
&& parseUniformBlocks(arena, s, gl_ctx) |
|
|
|
|