- if(mask&PipelineState::TEXTURES)
- {
- for(const PipelineState::BoundTexture &t: self->textures)
- if(t.changed || mask==~0U)
- {
- if(t.texture && t.sampler)
- {
- if(ARB_direct_state_access)
- glBindTextureUnit(t.binding, t.texture->id);
- else
- {
- glActiveTexture(GL_TEXTURE0+t.binding);
- if(bound_tex_targets[t.binding] && static_cast<int>(t.texture->target)!=bound_tex_targets[t.binding])
- glBindTexture(bound_tex_targets[t.binding], 0);
- glBindTexture(t.texture->target, t.texture->id);
- }
-
- bound_tex_targets[t.binding] = t.texture->target;
-
- glBindSampler(t.binding, t.sampler->id);
- t.sampler->refresh();
- }
-
- t.changed = false;
- }
- }
-
- if(mask&PipelineState::UNIFORMS)
- {
- for(const PipelineState::BoundUniformBlock &u: self->uniform_blocks)
- if(u.changed || mask==~0U)
- {
- if(u.block)
- {
- if(u.binding>=0)
- {
- glBindBufferRange(GL_UNIFORM_BUFFER, u.binding, u.block->get_buffer()->id, u.block->get_offset(), u.block->get_data_size());
- bound_uniform_blocks[u.binding] = 1;
- }
- else if(self->shprog)
- {
- const char *data = static_cast<const char *>(u.block->get_data_pointer());
- for(const Program::UniformCall &call: self->shprog->uniform_calls)
- call.func(call.location, call.size, data+call.location*16);
- }
- }
-
- u.changed = false;
- }
- }
-
- if(mask&PipelineState::DEPTH_TEST)