vector<int> OpenGLPipelineState::bound_tex_targets;
vector<char> OpenGLPipelineState::bound_uniform_blocks;
unsigned OpenGLPipelineState::restart_index = 0;
+unsigned OpenGLPipelineState::n_clip_distances = 0;
OpenGLPipelineState::OpenGLPipelineState()
{
}
if(mask&PipelineState::SHPROG)
+ {
glUseProgram(self->shprog ? self->shprog->id : 0);
+ unsigned ncd = (self->shprog ? self->shprog->get_n_clip_distances() : 0);
+ if(ncd!=n_clip_distances)
+ {
+ for(unsigned i=0; (i<ncd || i<n_clip_distances); ++i)
+ {
+ if(i<ncd)
+ glEnable(GL_CLIP_PLANE0+i);
+ else
+ glDisable(GL_CLIP_PLANE0+i);
+ }
+ n_clip_distances = ncd;
+ }
+ }
+
if(mask&PipelineState::VERTEX_SETUP)
{
const VertexSetup *vertex_setup = self->vertex_setup;
glDisable(GL_CULL_FACE);
}
- if(mask&PipelineState::CLIP_PLANES)
- {
- unsigned max_clip_planes = DeviceInfo::get_global().limits.max_clip_planes;
- for(unsigned i=0; i<max_clip_planes; ++i)
- {
- if((self->enabled_clip_planes>>i)&1)
- glEnable(GL_CLIP_PLANE0+i);
- else
- glDisable(GL_CLIP_PLANE0+i);
- }
- }
-
if(mask&PipelineState::TEXTURES)
{
for(const PipelineState::BoundTexture &t: self->textures)
glUseProgram(0);
glBindVertexArray(0);
- unsigned max_clip_planes = DeviceInfo::get_global().limits.max_clip_planes;
- unsigned enabled_clip_planes = static_cast<const PipelineState *>(last_applied)->enabled_clip_planes;
- for(unsigned i=0; i<max_clip_planes; ++i)
- if((enabled_clip_planes>>i)&1)
- glDisable(GL_CLIP_PLANE0+i);
+ for(unsigned i=0; i<n_clip_distances; ++i)
+ glDisable(GL_CLIP_PLANE0+i);
+ n_clip_distances = 0;
for(unsigned i=0; i<bound_tex_targets.size(); ++i)
if(bound_tex_targets[i])