+ get_state().scissor = s;
+}
+
+void Renderer::set_shader_program(const Program *p, const ProgramData *d)
+{
+ get_state().shprog = p;
+ if(p && d)
+ add_shader_data(*d);
+}
+
+void Renderer::add_shader_data(const ProgramData &d)
+{
+ State &state = get_state();
+
+ if(state.shdata_count<shdata_stack.size())
+ {
+ 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;