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()
{
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;
}
{ }
+Renderer::BoundProgramData::BoundProgramData(const ProgramData *d):
+ shdata(d),
+ generation(0)
+{ }
+
+
Renderer::State::State():
camera(0),
texture_count(0),