X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fcommands.cpp;h=a0a4336ade77c6951a1fd511e884e7f6e9dd0f7c;hb=052b85720688900bc36f8844a94269cb1c0cdd52;hp=97da5dadbe9cbc29dcfcbf22a36009decdd79072;hpb=b6dbbbee0c7e6a3af10391f2d9f4bb9e007afb29;p=libs%2Fgl.git diff --git a/source/core/commands.cpp b/source/core/commands.cpp index 97da5dad..a0a4336a 100644 --- a/source/core/commands.cpp +++ b/source/core/commands.cpp @@ -1,12 +1,16 @@ #include #include #include +#include #include #include +#include #include "batch.h" #include "commands.h" +#include "error.h" #include "gl.h" #include "pipelinestate.h" +#include "query.h" using namespace std; @@ -17,15 +21,51 @@ Commands::Commands(): pipeline_state(0) { } -void Commands::use_pipeline(const PipelineState &ps) +void Commands::use_pipeline(const PipelineState *ps) { - pipeline_state = &ps; + pipeline_state = ps; + if(!pipeline_state) + PipelineState::clear(); } -void Commands::clear(BufferBits buffers) +void Commands::clear(const ClearValue *values) { - pipeline_state->apply(); - glClear(buffers); + const Framebuffer *target = pipeline_state->get_framebuffer(); + if(!target) + throw invalid_operation("OpenGLCommands::clear"); + + if(!ARB_direct_state_access) + { + 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); + } + 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); + } + else + { + if(ARB_direct_state_access) + glClearNamedFramebufferfv(target->id, GL_COLOR, i++, &values->color.r); + else + glClearBufferfv(GL_COLOR, i++, &values->color.r); + } + ++values; + } } void Commands::draw(const Batch &batch) @@ -44,7 +84,7 @@ void Commands::draw_instanced(const Batch &batch, unsigned count) glDrawElementsInstanced(batch.get_gl_primitive_type(), batch.size(), batch.get_gl_index_type(), data_ptr, count); } -void Commands::resolve_multisample(Framebuffer &target, BufferBits buffers) +void Commands::resolve_multisample(Framebuffer &target) { static Require _req(EXT_framebuffer_blit); @@ -52,21 +92,34 @@ void Commands::resolve_multisample(Framebuffer &target, BufferBits buffers) 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) - glBlitNamedFramebuffer(source->get_id(), target.get_id(), 0, 0, width, height, 0, 0, width, height, buffers, GL_NEAREST); + glBlitNamedFramebuffer(source->id, target.id, 0, 0, width, height, 0, 0, width, height, buffers, GL_NEAREST); else { - glBindFramebuffer(GL_READ_FRAMEBUFFER, source->get_id()); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, target.get_id()); + glBindFramebuffer(GL_READ_FRAMEBUFFER, source->id); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, target.id); target.refresh(); glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, buffers, GL_NEAREST); - glBindFramebuffer(GL_FRAMEBUFFER, source->get_id()); + glBindFramebuffer(GL_FRAMEBUFFER, source->id); } } +void Commands::begin_query(const QueryPool &pool, unsigned index) +{ + if(index>=pool.queries.size()) + throw out_of_range("OpenGLCommands::begin_query"); + glBeginQuery(pool.gl_type, pool.queries[index]); +} + +void Commands::end_query(const QueryPool &pool, unsigned) +{ + glEndQuery(pool.gl_type); +} + } // namespace GL } // namespace Msp