X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fopengl%2Fcommands_backend.cpp;h=0a4416c69814bea21aa00fda272c09642743e55f;hb=94cadd1618f93239b1cb0acbd4f958257c035c98;hp=fd66b99cacf35c63b2f0eb8394828d939aabb76a;hpb=160e9eea29bd10034733d59507fa1bcca36be401;p=libs%2Fgl.git diff --git a/source/backends/opengl/commands_backend.cpp b/source/backends/opengl/commands_backend.cpp index fd66b99c..0a4416c6 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,9 +19,10 @@ using namespace std; namespace Msp { namespace GL { -OpenGLCommands::OpenGLCommands(): - pipeline_state(0) -{ } +void OpenGLCommands::submit_frame() +{ + glFlush(); +} void OpenGLCommands::use_pipeline(const PipelineState *ps) { @@ -31,46 +33,35 @@ 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(!ARB_direct_state_access) - { - static Require _req(MSP_clear_buffer); - pipeline_state->apply(); - } + if(!values) + return; + + static Require _req(MSP_clear_buffer); + + pipeline_state->apply(); unsigned i = 0; for(FrameAttachment a: target->get_format()) { if(get_attach_point(a)==get_attach_point(DEPTH_ATTACHMENT)) - { - if(ARB_direct_state_access) - glClearNamedFramebufferfv(target->id, GL_DEPTH, 0, &values->depth_stencil.depth); - else - glClearBufferfv(GL_DEPTH, 0, &values->depth_stencil.depth); - } + glClearBufferfv(GL_DEPTH, 0, &values->depth_stencil.depth); else if(get_attach_point(a)==get_attach_point(STENCIL_ATTACHMENT)) - { - if(ARB_direct_state_access) - glClearNamedFramebufferiv(target->id, GL_STENCIL, 0, &values->depth_stencil.stencil); - else - glClearBufferiv(GL_STENCIL, 0, &values->depth_stencil.stencil); - } + glClearBufferiv(GL_STENCIL, 0, &values->depth_stencil.stencil); else - { - if(ARB_direct_state_access) - glClearNamedFramebufferfv(target->id, GL_COLOR, i++, &values->color.r); - else - glClearBufferfv(GL_COLOR, i++, &values->color.r); - } + glClearBufferfv(GL_COLOR, i++, &values->color.r); ++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); @@ -78,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(); @@ -85,28 +79,43 @@ 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::resolve_multisample(Framebuffer &target) +void OpenGLCommands::dispatch(unsigned count_x, unsigned count_y, unsigned count_z) { - static Require _req(EXT_framebuffer_blit); + if(!pipeline_state) + throw invalid_operation("OpenGLCommands::dispatch_compute"); + + static Require req(ARB_compute_shader); - const Framebuffer *source = pipeline_state->get_framebuffer(); + pipeline_state->apply(); + glDispatchCompute(count_x, count_y, count_z); +} - 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()); +void OpenGLCommands::resolve_multisample() +{ + const Framebuffer *framebuffer = (pipeline_state ? pipeline_state->get_framebuffer() : 0); + if(!framebuffer) + throw invalid_operation("OpenGLCommands::resolve_multisample"); + + static Require _req(EXT_framebuffer_blit); + + unsigned width = framebuffer->get_width(); + unsigned height = framebuffer->get_height(); + unsigned buffers = get_gl_buffer_bits(framebuffer->get_format()); if(ARB_direct_state_access) - glBlitNamedFramebuffer(source->id, target.id, 0, 0, width, height, 0, 0, width, height, buffers, GL_NEAREST); + { + framebuffer->refresh(); + glBlitNamedFramebuffer(framebuffer->id, framebuffer->resolve_id, 0, 0, width, height, 0, 0, width, height, buffers, GL_NEAREST); + } else { - glBindFramebuffer(GL_READ_FRAMEBUFFER, source->id); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, target.id); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer->id); - target.refresh(); + framebuffer->refresh(); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer->resolve_id); glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, buffers, GL_NEAREST); - - glBindFramebuffer(GL_FRAMEBUFFER, source->id); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer->id); } }