X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbackends%2Fopengl%2Fcommands_backend.cpp;h=76469ab395be70ef4da6c8273eacf9604af91159;hp=adecd5c87bc71baeb9059332dc57b1535d8b8403;hb=cebf1330ef6773b7b4496dc279ec02a7ca4351bb;hpb=38712d8ecc57d043a2419ffbaeeb57f7a6586f14 diff --git a/source/backends/opengl/commands_backend.cpp b/source/backends/opengl/commands_backend.cpp index adecd5c8..76469ab3 100644 --- a/source/backends/opengl/commands_backend.cpp +++ b/source/backends/opengl/commands_backend.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -18,6 +19,11 @@ using namespace std; namespace Msp { namespace GL { +void OpenGLCommands::submit_frame() +{ + glFlush(); +} + void OpenGLCommands::use_pipeline(const PipelineState *ps) { pipeline_state = ps; @@ -27,10 +33,13 @@ 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(); @@ -50,6 +59,9 @@ void OpenGLCommands::clear(const ClearValue *values) void OpenGLCommands::draw(const Batch &batch) { + if(!pipeline_state) + throw invalid_operation("OpenGLCommands::draw"); + pipeline_state->apply(); void *data_ptr = reinterpret_cast(batch.get_offset()); glDrawElements(batch.gl_prim_type, batch.size(), batch.gl_index_type, data_ptr); @@ -57,6 +69,9 @@ void OpenGLCommands::draw(const Batch &batch) 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(); @@ -64,18 +79,34 @@ void OpenGLCommands::draw_instanced(const Batch &batch, unsigned count) glDrawElementsInstanced(batch.gl_prim_type, batch.size(), batch.gl_index_type, data_ptr, count); } +void OpenGLCommands::dispatch(unsigned count_x, unsigned count_y, unsigned count_z) +{ + if(!pipeline_state) + throw invalid_operation("OpenGLCommands::dispatch_compute"); + + static Require req(ARB_compute_shader); + + pipeline_state->apply(); + glDispatchCompute(count_x, count_y, count_z); +} + 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);