X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fcommands.cpp;h=2eb4659ad8e6ae0f62ecb2ec2e9aed362dc6afc3;hp=529cd3921fa5ef0243a6a78a6ffe2be6c1f6654d;hb=006bdb4f8660098fc524dcca80b24c943c65b249;hpb=2e09b4f72f06537431151fe8b2574e1aa886ad48 diff --git a/source/core/commands.cpp b/source/core/commands.cpp index 529cd392..2eb4659a 100644 --- a/source/core/commands.cpp +++ b/source/core/commands.cpp @@ -3,8 +3,10 @@ #include #include #include +#include #include "batch.h" #include "commands.h" +#include "error.h" #include "gl.h" #include "pipelinestate.h" @@ -22,10 +24,44 @@ void Commands::use_pipeline(const PipelineState &ps) pipeline_state = &ps; } -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)