#include "blend.h"
#include "buffer.h"
#include "depthtest.h"
-#include "deviceinfo.h"
+#include "device.h"
#include "framebuffer.h"
#include "gl.h"
#include "pipelinestate.h"
OpenGLPipelineState::OpenGLPipelineState()
{
if(bound_tex_targets.empty())
- bound_tex_targets.resize(DeviceInfo::get_global().limits.max_texture_bindings);
+ bound_tex_targets.resize(Device::get_current().get_info().limits.max_texture_bindings);
if(bound_uniform_blocks.empty())
- bound_uniform_blocks.resize(DeviceInfo::get_global().limits.max_uniform_bindings);
+ bound_uniform_blocks.resize(Device::get_current().get_info().limits.max_uniform_bindings);
}
OpenGLPipelineState::~OpenGLPipelineState()
}
}
- if(mask&PipelineState::VERTEX_SETUP)
+ if(mask&PipelineState::UNIFORMS)
{
- const VertexSetup *vertex_setup = self->vertex_setup;
- glBindVertexArray(vertex_setup ? vertex_setup->id : 0);
- if(vertex_setup)
- {
- static Require _req(MSP_primitive_restart);
-
- vertex_setup->refresh();
- unsigned ri = (vertex_setup->get_index_type()==UNSIGNED_INT ? 0xFFFFFFFF : 0xFFFF);
- if(ri!=restart_index)
+ for(const PipelineState::BoundUniformBlock &u: self->uniform_blocks)
+ if(u.changed || mask==~0U)
{
- if(!restart_index)
- glEnable(GL_PRIMITIVE_RESTART);
- glPrimitiveRestartIndex(ri);
- restart_index = ri;
- }
- }
- }
-
- if(mask&PipelineState::FACE_CULL)
- {
- glFrontFace(self->front_face==CLOCKWISE ? GL_CW : GL_CCW);
+ 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);
+ }
+ }
- if(self->face_cull!=NO_CULL && self->front_face!=NON_MANIFOLD)
- {
- glEnable(GL_CULL_FACE);
- glCullFace(self->face_cull==CULL_FRONT ? GL_FRONT : GL_BACK);
- }
- else
- glDisable(GL_CULL_FACE);
+ u.changed = false;
+ }
}
if(mask&PipelineState::TEXTURES)
}
}
- if(mask&PipelineState::UNIFORMS)
+ if(mask&PipelineState::VERTEX_SETUP)
{
- 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);
- }
- }
+ const VertexSetup *vertex_setup = self->vertex_setup;
+ glBindVertexArray(vertex_setup ? vertex_setup->id : 0);
+ if(vertex_setup)
+ {
+ static Require _req(MSP_primitive_restart);
- u.changed = false;
+ vertex_setup->refresh();
+ unsigned ri = (vertex_setup->get_index_type()==UNSIGNED_INT ? 0xFFFFFFFF : 0xFFFF);
+ if(ri!=restart_index)
+ {
+ if(!restart_index)
+ glEnable(GL_PRIMITIVE_RESTART);
+ glPrimitiveRestartIndex(ri);
+ restart_index = ri;
}
+ }
+ }
+
+ if(mask&PipelineState::FACE_CULL)
+ {
+ glFrontFace(self->front_face==CLOCKWISE ? GL_CW : GL_CCW);
+
+ if(self->face_cull!=NO_CULL && self->front_face!=NON_MANIFOLD)
+ {
+ glEnable(GL_CULL_FACE);
+ glCullFace(self->face_cull==CULL_FRONT ? GL_FRONT : GL_BACK);
+ }
+ else
+ glDisable(GL_CULL_FACE);
}
if(mask&PipelineState::DEPTH_TEST)