<html>
<body>
  <div id="body" style="background-color:#ffffff;" >
<table cellspacing="0" cellpadding="0" border="0" rules="cols">
<tr class="head" style="border-bottom-width:1px;border-bottom-style:solid;" ><td class="headtd" style="padding:0;padding-top:.2em;" colspan="4">Commit in <b><tt>lxdream/src</tt></b></td></tr>
<tr><td><tt>pvr2/<a href="#file1">gl_sl.c</a></tt></td><td id="added" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ddffdd;" align="right">+33</td><td></td><td class="headtd2" style="padding-left:.3em;padding-right:.3em;" nowrap="nowrap">f7ca985659c6 -> 6955202d6408</td></tr>
<tr class="alt" style=";" ><td><tt>tools/<a href="#file2">genglsl.c</a></tt></td><td id="addedalt" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ccf7cc;" align="right">+21</td><td id="removed" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ffdddd;" align="right">-2</td><td class="headtd2" style="padding-left:.3em;padding-right:.3em;" nowrap="nowrap">f7ca985659c6 -> 6955202d6408</td></tr>
<tr><td></td><td id="added" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ddffdd;" align="right">+54</td><td id="removed" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ffdddd;" align="right">-2</td><td></td></tr>
</table>
<small id="info" style="color: #888888;" >2 modified files</small><br />
<pre class="comment" style="white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;padding:4px;border:1px dashed #000000;background-color:#ffffdd;" >
Add enable/disable vertex attribute calls when making a shader active
</pre>
<hr /><a name="file1" /><div class="file" style="border:1px solid #eeeeee;margin-top:1em;margin-bottom:1em;" >
<span class="pathname" style="font-family:monospace; float:right;" >lxdream/src/pvr2</span><br />
<div class="fileheader" style="margin-bottom:.5em;" ><big><b>gl_sl.c</b></big> <small id="info" style="color: #888888;" >f7ca985659c6 -> 6955202d6408</small></div>
<pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >--- lxdream/src/pvr2/gl_sl.c
+++ lxdream/src/pvr2/gl_sl.c
@@ -43,6 +43,9 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > void glsl_destroy_shader(gl_shader_t shader);
 void glsl_destroy_program(gl_program_t program);
 
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+typedef void (*program_cleanup_fn_t)();
+static void glsl_set_cleanup_fn( program_cleanup_fn_t );
+
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > #ifdef HAVE_OPENGL_SHADER_ARB
 
 gboolean glsl_is_supported()
</pre><pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >@@ -168,6 +171,8 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > #define glsl_set_uniform_mat4(id,v) glUniformMatrix4fvARB(id,1,GL_FALSE,v)
 #define glsl_set_attrib_vec3(id,stride,v) glVertexAttribPointerARB(id, 3, GL_FLOAT, GL_FALSE, stride, v)
 #define glsl_set_attrib_vec4(id,stride,v) glVertexAttribPointerARB(id, 4, GL_FLOAT, GL_FALSE, stride, v)
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+#define glsl_enable_attrib(id) glEnableVertexAttribArrayARB(id)
+#define glsl_disable_attrib(id) glDisableVertexAttribArrayARB(id)
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > 
 #elif HAVE_OPENGL_SHADER
 
</pre><pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >@@ -292,6 +297,8 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > #define glsl_set_uniform_mat4(id,v) glUniformMatrix4fv(id,1,GL_FALSE,v)
 #define glsl_set_attrib_vec3(id,stride,v) glVertexAttribPointer(id, 3, GL_FLOAT, GL_FALSE, stride, v)
 #define glsl_set_attrib_vec4(id,stride,v) glVertexAttribPointer(id, 4, GL_FLOAT, GL_FALSE, stride, v)
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+#define glsl_enable_attrib(id) glEnableVertexAttribArray(id)
+#define glsl_disable_attrib(id) glDisableVertexAttribArray(id)
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > 
 
 #else
</pre><pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >@@ -347,18 +354,23 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > #define glsl_set_uniform_mat4(id,v)
 #define glsl_set_attrib_vec3(id,stride,v)
 #define glsl_set_attrib_vec4(id,stride,v)
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+#define glsl_enable_attrib(id)
+#define glsl_disable_attrib(id)
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > 
 
 #endif
 
 /****************************************************************************/
 
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+program_cleanup_fn_t current_cleanup_fn = NULL;
+
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > /* Pull in the auto-generated shader definitions */
 
 #include "pvr2/shaders.def"
 
 static gl_program_t program_array[GLSL_NUM_PROGRAMS];
 
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > gboolean glsl_load_shaders()
 {
     gl_shader_t shader_array[GLSL_NUM_SHADERS];
</pre><pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >@@ -431,9 +443,28 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >     return TRUE;
 }
 
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+static void glsl_set_cleanup_fn( program_cleanup_fn_t fn )
+{
+    if( fn != current_cleanup_fn ) {
+        if( current_cleanup_fn != NULL ) {
+            current_cleanup_fn();
+        }
+        current_cleanup_fn = fn;
+    }
+}
+
+static void glsl_run_cleanup_fn()
+{
+    if( current_cleanup_fn ) {
+        current_cleanup_fn();
+    }
+    current_cleanup_fn = NULL;
+}
+
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > void glsl_unload_shaders()
 {
     unsigned i;
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+    glsl_run_cleanup_fn();
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >     for( i=0; i<GLSL_NUM_PROGRAMS; i++ ) {
         if( program_array[i] != INVALID_PROGRAM ) {
             glsl_destroy_program(program_array[i]);
</pre><pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >@@ -444,5 +475,7 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > 
 void glsl_clear_shader()
 {
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+    glsl_run_cleanup_fn();
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >     glsl_use_program(0);
 }
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+
</pre></div>
<hr /><a name="file2" /><div class="file" style="border:1px solid #eeeeee;margin-top:1em;margin-bottom:1em;" >
<span class="pathname" style="font-family:monospace; float:right;" >lxdream/src/tools</span><br />
<div class="fileheader" style="margin-bottom:.5em;" ><big><b>genglsl.c</b></big> <small id="info" style="color: #888888;" >f7ca985659c6 -> 6955202d6408</small></div>
<pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >--- lxdream/src/tools/genglsl.c
+++ lxdream/src/tools/genglsl.c
@@ -316,7 +316,7 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >             if( var->uniform ) {
                 fprintf( f, "void glsl_set_%s_%s(%s value); /* uniform %s %s */ \n", program->name, var->name, getCType(var->type,var->uniform), var->type, var->name );
             } else {
</pre><pre id="removed" class="diff" style="margin:0; background-color:#ffdddd;" >-                fprintf( f, "void glsl_set_%s_%s_pointer(%s ptr); /* attribute %s %s */ \n", program->name, var->name, getCType(var->type,var->uniform), var->type, var->name);
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+                fprintf( f, "void glsl_set_%s_%s_pointer(%s ptr<span id="addedchars" style="background-color:#99ff99;font-weight:bolder;" >, GLint stride</span>); /* attribute %s %s */ \n", program->name, var->name, getCType(var->type,var->uniform), var->type, var->name);
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >             }
         }
     }
</pre><pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >@@ -373,7 +373,26 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >     }
     for( program_ptr = data->programs; program_ptr != NULL; program_ptr = program_ptr->next ) {
         program_t program = program_ptr->data;
</pre><pre id="removed" class="diff" style="margin:0; background-color:#ffdddd;" >-        fprintf( f, "\nvoid glsl_use_%s() {\n    glsl_use_program(prog_%s_id);\n}\n", program->name, program->name );
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+        fprintf( f, "\nstatic void glsl_cleanup_%s() {\n", program->name );
+        for( var_ptr = program->variables; var_ptr != NULL; var_ptr = var_ptr->next ) {
+            variable_t var = var_ptr->data;
+            if( !var->uniform ) {
+                fprintf( f, "    glsl_disable_attrib(var_%s_%s_loc);\n", program->name, var->name );
+            }
+        }
+        fprintf( f, "}\n");
+
+        fprintf( f, "\nvoid glsl_use_%s() {\n", program->name );
+        fprintf( f, "    glsl_use_program(prog_%s_id);\n", program->name );
+        for( var_ptr = program->variables; var_ptr != NULL; var_ptr = var_ptr->next ) {
+            variable_t var = var_ptr->data;
+            if( !var->uniform ) {
+                fprintf( f, "    glsl_enable_attrib(var_%s_%s_loc);\n", program->name, var->name );
+            }
+        }
+        fprintf( f, "    glsl_set_cleanup_fn(glsl_cleanup_%s);\n", program->name );
+        fprintf( f, "}\n");
+
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > 
         for( var_ptr = program->variables; var_ptr != NULL; var_ptr = var_ptr->next ) {
             variable_t var = var_ptr->data;
</pre></div>
<center><small>Chaos Theory</small></center>
</div></body></html>