From 5fcff6988ba26d4345b51a83890b1871e4d1e59e Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 27 Apr 2008 03:47:15 -0400 Subject: [PATCH] Cache attribute locations for GLSL programs at link time. --HG-- branch : trunk --- mojoshader_opengl.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/mojoshader_opengl.c b/mojoshader_opengl.c index 2687ee44..71e0717d 100644 --- a/mojoshader_opengl.c +++ b/mojoshader_opengl.c @@ -93,6 +93,12 @@ typedef struct GLint location; } UniformMap; +typedef struct +{ + MOJOSHADER_attribute *attribute; + GLint location; +} AttributeMap; + struct MOJOSHADER_glProgram { const MOJOSHADER_glShader *vertex; @@ -100,6 +106,8 @@ struct MOJOSHADER_glProgram GLhandleARB handle; uint32 uniform_count; UniformMap uniforms; + uint32 attribute_count; + AttributeMap attributes; uint32 refcount; }; @@ -248,6 +256,7 @@ static void program_unref(MOJOSHADER_glProgram *program) pglDeleteObjectARB(program->handle); shader_unref(program->vertex); shader_unref(program->fragment); + Free(program->attributes); Free(program->uniforms); Free(program); } // else @@ -278,6 +287,26 @@ static void lookup_uniforms(MOJOSHADER_glProgram *program, } // lookup_uniforms +static void lookup_attributes(MOJOSHADER_glProgram *program) +{ + int i; + const MOJOSHADER_parseData *pd = program->vertex->parseData; + const MOJOSHADER_attributes *a = pd->attributes; + + for (i = 0; i < pd->attribute_count; i++) + { + const GLint loc = pglGetAttribLocationARB(program->handle, a->name); + if (loc != -1) // maybe the Attribute was optimized out? + { + AttributeMap *map = &program->attributes[program->attribute_count]; + map->attribute = &a[i]; + map->location = loc; + program->attribute_count++; + } // if + } // for +} // lookup_attributes + + MOJOSHADER_glProgram *MOJOSHADER_glLinkProgram(MOJOSHADER_glShader *vshader, MOJOSHADER_glShader *pshader) { @@ -323,6 +352,12 @@ MOJOSHADER_glProgram *MOJOSHADER_glLinkProgram(MOJOSHADER_glShader *vshader, if (vshader != NULL) { + retval->attributes = (AttributeMap *) Malloc(sizeof (AttributeMap) * + vshader->parseData->attribute_count); + if (retval->attributes == NULL) + goto link_program_fail; + + lookup_attributes(retval); lookup_uniforms(retval, vshader); vshader->refcount++; } // if @@ -338,8 +373,8 @@ MOJOSHADER_glProgram *MOJOSHADER_glLinkProgram(MOJOSHADER_glShader *vshader, link_program_fail: if (retval != NULL) { - if (retval->uniforms != NULL) - Free(retval->uniforms); + Free(retval->uniforms); + Free(retval->attributes); Free(retval); } // if