namespace Msp {
namespace GL {
-OpenGLCommands::OpenGLCommands():
- pipeline_state(0)
-{ }
+void OpenGLCommands::submit_frame()
+{
+ glFlush();
+}
void OpenGLCommands::use_pipeline(const PipelineState *ps)
{
void OpenGLCommands::clear(const ClearValue *values)
{
- const Framebuffer *target = pipeline_state->get_framebuffer();
+ const Framebuffer *target = (pipeline_state ? pipeline_state->get_framebuffer() : 0);
if(!target)
throw invalid_operation("OpenGLCommands::clear");
+ if(!values)
+ return;
+
static Require _req(MSP_clear_buffer);
pipeline_state->apply();
void OpenGLCommands::draw(const Batch &batch)
{
+ if(!pipeline_state)
+ throw invalid_operation("OpenGLCommands::draw");
+
pipeline_state->apply();
void *data_ptr = reinterpret_cast<void *>(batch.get_offset());
glDrawElements(batch.gl_prim_type, batch.size(), batch.gl_index_type, data_ptr);
void OpenGLCommands::draw_instanced(const Batch &batch, unsigned count)
{
+ if(!pipeline_state)
+ throw invalid_operation("OpenGLCommands::draw_instanced");
+
static Require req(ARB_draw_instanced);
pipeline_state->apply();
void OpenGLCommands::resolve_multisample(Framebuffer &target)
{
- static Require _req(EXT_framebuffer_blit);
+ const Framebuffer *source = (pipeline_state ? pipeline_state->get_framebuffer() : 0);
+ if(!source)
+ throw invalid_operation("OpenGLCommands::draw");
- const Framebuffer *source = pipeline_state->get_framebuffer();
+ static Require _req(EXT_framebuffer_blit);
unsigned width = min(source->get_width(), target.get_width());
unsigned height = min(source->get_height(), target.get_height());
unsigned buffers = get_gl_buffer_bits(source->get_format())&get_gl_buffer_bits(target.get_format());
if(ARB_direct_state_access)
+ {
+ target.refresh();
glBlitNamedFramebuffer(source->id, target.id, 0, 0, width, height, 0, 0, width, height, buffers, GL_NEAREST);
+ }
else
{
glBindFramebuffer(GL_READ_FRAMEBUFFER, source->id);