]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/renderer.cpp
Use a generation number to track if ProgramData has changed
[libs/gl.git] / source / render / renderer.cpp
index 15e4437ffe962c479f082487d5875299b3939d2a..8e8e215f4237fe48444b3a98e257c1d331413e7d 100644 (file)
@@ -187,15 +187,20 @@ void Renderer::set_shader_program(const Program *p, const ProgramData *d)
 
 void Renderer::add_shader_data(const ProgramData &d)
 {
-       if(state->shdata_count<shdata_stack.size() && shdata_stack[state->shdata_count]==&d)
-               ++state->shdata_count;
-       else
+       if(state->shdata_count<shdata_stack.size())
        {
-               flush_shader_data();
-               shdata_stack.push_back(&d);
-               state->shdata_count = shdata_stack.size();
-               changed |= SHADER_DATA;
+               const BoundProgramData &top = shdata_stack.back();
+               if(top.shdata==&d && top.generation==d.get_generation())
+               {
+                       ++state->shdata_count;
+                       return;
+               }
        }
+
+       flush_shader_data();
+       shdata_stack.push_back(&d);
+       state->shdata_count = shdata_stack.size();
+       changed |= SHADER_DATA;
 }
 
 void Renderer::flush_shader_data()
@@ -392,8 +397,8 @@ void Renderer::apply_state()
        {
                if(extra_shdata)
                        shdata_stack.erase(shdata_stack.begin()+state->shdata_count, shdata_stack.end());
-               for(vector<const ProgramData *>::const_iterator i=shdata_stack.begin(); i!=shdata_stack.end(); ++i)
-                       (*i)->apply();
+               for(vector<BoundProgramData>::const_iterator i=shdata_stack.begin(); i!=shdata_stack.end(); ++i)
+                       i->shdata->apply();
                changed &= ~SHADER_DATA;
        }
 
@@ -422,6 +427,12 @@ Renderer::BoundTexture::BoundTexture():
 { }
 
 
+Renderer::BoundProgramData::BoundProgramData(const ProgramData *d):
+       shdata(d),
+       generation(0)
+{ }
+
+
 Renderer::State::State():
        camera(0),
        texture_count(0),