]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/pipelinestate.cpp
Adapt to changes in mspmath
[libs/gl.git] / source / core / pipelinestate.cpp
index 210a0703868035dc69572fc56cc50eaf67b9ff08..8d59a31624eddc823e23cd7260ed444c4efc9129 100644 (file)
@@ -2,6 +2,7 @@
 #include <msp/core/algorithm.h>
 #include "error.h"
 #include "pipelinestate.h"
+#include "uniformblock.h"
 
 using namespace std;
 
@@ -9,7 +10,7 @@ namespace Msp {
 namespace GL {
 
 template<typename T>
-void PipelineState::set(T &target, value, unsigned flag)
+void PipelineState::set(T &target, const T &value, unsigned flag)
 {
        if(value!=target)
        {
@@ -23,12 +24,12 @@ void PipelineState::set_framebuffer(const Framebuffer *f)
        set(framebuffer, f, FRAMEBUFFER);
 }
 
-void PipelineState::set_viewport(const Rect *v)
+void PipelineState::set_viewport(const Rect &v)
 {
        set(viewport, v, VIEWPORT);
 }
 
-void PipelineState::set_scissor(const Rect *s)
+void PipelineState::set_scissor(const Rect &s)
 {
        set(scissor, s, SCISSOR);
 }
@@ -43,11 +44,13 @@ void PipelineState::set_uniform_block(int binding, const UniformBlock *block)
        auto i = lower_bound_member(uniform_blocks, binding, &BoundUniformBlock::binding);
        if(i==uniform_blocks.end() || i->binding!=binding)
                i = uniform_blocks.insert(i, BoundUniformBlock(binding));
-       i->used = block;
-       if(block!=i->block || binding<0)
+       const Buffer *buffer = (block ? block->get_buffer() : 0);
+       if(block!=i->block || buffer!=i->buffer || binding<0)
        {
                i->block = block;
+               i->buffer = buffer;
                i->changed = true;
+               i->used = block;
                changes |= UNIFORMS;
        }
 }
@@ -67,13 +70,13 @@ void PipelineState::set_texture(unsigned binding, const Texture *tex, int level,
        auto i = lower_bound_member(textures, binding, &BoundTexture::binding);
        if(i==textures.end() || i->binding!=binding)
                i = textures.insert(i, BoundTexture(binding));
-       i->used = (tex && samp);
        if(tex!=i->texture || level!=i->level || samp!=i->sampler)
        {
                i->texture = tex;
                i->sampler = samp;
                i->level = level;
                i->changed = true;
+               i->used = (tex && samp);
                changes |= TEXTURES;
        }
 }
@@ -98,17 +101,17 @@ void PipelineState::set_face_cull(CullMode c)
        set(face_cull, c, FACE_CULL);
 }
 
-void PipelineState::set_depth_test(const DepthTest *dt)
+void PipelineState::set_depth_test(const DepthTest &dt)
 {
        set(depth_test, dt, DEPTH_TEST);
 }
 
-void PipelineState::set_stencil_test(const StencilTest *st)
+void PipelineState::set_stencil_test(const StencilTest &st)
 {
        set(stencil_test, st, STENCIL_TEST);
 }
 
-void PipelineState::set_blend(const Blend *b)
+void PipelineState::set_blend(const Blend &b)
 {
        set(blend, b, BLEND);
 }