]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/renderer.cpp
Create a class for issuing drawing commands
[libs/gl.git] / source / render / renderer.cpp
index 575b44a85ff4a56ed7351e0a8500a848ba8577c6..b6775202f61d1e696d55e97b15daa4309923816d 100644 (file)
@@ -1,6 +1,3 @@
-#include <msp/gl/extensions/arb_direct_state_access.h>
-#include <msp/gl/extensions/ext_framebuffer_blit.h>
-#include <msp/gl/extensions/ext_framebuffer_object.h>
 #include "batch.h"
 #include "buffer.h"
 #include "camera.h"
@@ -31,6 +28,7 @@ Renderer::Renderer()
        shdata_stack.reserve(32);
        state = &state_stack.back();
        add_shader_data(standard_shdata);
+       commands.use_pipeline(pipeline_state);
 }
 
 Renderer::~Renderer()
@@ -252,22 +250,21 @@ void Renderer::clear()
 void Renderer::clear(BufferBits buffers)
 {
        pipeline_state.set_framebuffer(state->framebuffer);
-       pipeline_state.apply();
-       glClear(buffers);
+       commands.clear(buffers);
 }
 
 void Renderer::draw(const Batch &batch)
 {
        apply_state();
-
-       batch.draw();
+       batch.refresh();
+       commands.draw(batch);
 }
 
 void Renderer::draw_instanced(const Batch &batch, unsigned count)
 {
        apply_state();
-
-       batch.draw_instanced(count);
+       batch.refresh();
+       commands.draw_instanced(batch, count);
 }
 
 void Renderer::resolve_multisample(Framebuffer &target, BufferBits buffers)
@@ -280,20 +277,8 @@ void Renderer::resolve_multisample(Framebuffer &target, BufferBits buffers)
        if(target.get_width()!=width || target.get_height()!=height)
                throw incompatible_data("Renderer::resolve_multisample");
 
-       if(ARB_direct_state_access)
-               glBlitNamedFramebuffer(state->framebuffer->get_id(), target.get_id(), 0, 0, width, height, 0, 0, width, height, buffers, GL_NEAREST);
-       else
-       {
-               glBindFramebuffer(GL_READ_FRAMEBUFFER, state->framebuffer->get_id());
-               glBindFramebuffer(GL_DRAW_FRAMEBUFFER, target.get_id());
-
-               target.refresh();
-
-               glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, buffers, GL_NEAREST);
-
-               glBindFramebuffer(GL_FRAMEBUFFER, 0);
-               pipeline_state.set_framebuffer(0);
-       }
+       apply_state();
+       commands.resolve_multisample(target, buffers);
 }
 
 void Renderer::apply_state()
@@ -360,8 +345,6 @@ void Renderer::apply_state()
        pipeline_state.set_depth_test(state->depth_test);
        pipeline_state.set_stencil_test(state->stencil_test);
        pipeline_state.set_blend(state->blend);
-
-       pipeline_state.apply();
 }