]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/commands.cpp
Make it possible to specify explicit clear values
[libs/gl.git] / source / core / commands.cpp
index 529cd3921fa5ef0243a6a78a6ffe2be6c1f6654d..2eb4659ad8e6ae0f62ecb2ec2e9aed362dc6afc3 100644 (file)
@@ -3,8 +3,10 @@
 #include <msp/gl/extensions/arb_draw_instanced.h>
 #include <msp/gl/extensions/ext_framebuffer_blit.h>
 #include <msp/gl/extensions/ext_framebuffer_object.h>
+#include <msp/gl/extensions/msp_clear_buffer.h>
 #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)