]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/uniformblock.cpp
Split reflection data from Program to a separate struct
[libs/gl.git] / source / core / uniformblock.cpp
index 25511d251e2361e56b67285b86b7e8add1f14585..4b07241fab3943d14f35932ea498024bdc5ad2d2 100644 (file)
@@ -3,6 +3,7 @@
 #include <msp/gl/extensions/arb_uniform_buffer_object.h>
 #include "buffer.h"
 #include "color.h"
+#include "deviceinfo.h"
 #include "error.h"
 #include "matrix.h"
 #include "uniform.h"
@@ -19,33 +20,35 @@ DefaultUniformBlock::DefaultUniformBlock()
        static Require _req(ARB_shader_objects);
 }
 
-void DefaultUniformBlock::attach(const Program::UniformInfo &info, const Uniform &uni)
+void DefaultUniformBlock::attach(const ReflectData::UniformInfo &info, const Uniform &uni)
 {
        if(info.block->bind_point>=0)
                throw invalid_argument("DefaultUniformBlock::attach");
 
-       uniforms[info.location] = &uni;
+       attach(info.location, uni);
 }
 
 void DefaultUniformBlock::attach(int index, const Uniform &uni)
 {
+       if(index<0)
+               return;
+
+       if(static_cast<unsigned>(index)>=uniforms.size())
+               uniforms.resize(index+1, 0);
        uniforms[index] = &uni;
 }
 
-void DefaultUniformBlock::apply(int index) const
+void DefaultUniformBlock::apply() const
 {
-       if(index>=0)
-               throw invalid_argument("DefaultUniformBlock::apply");
-
-       for(map<int, const Uniform *>::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
-               i->second->apply(i->first);
+       for(unsigned i=0; i<uniforms.size(); ++i)
+               if(uniforms[i])
+                       uniforms[i]->apply(i);
 }
 
 
 BufferBackedUniformBlock::BufferBackedUniformBlock(unsigned s):
        size(s),
-       data(size),
-       buf_range(0)
+       data(size)
 {
        static Require _req(ARB_shader_objects);
        static Require _req2(ARB_uniform_buffer_object);
@@ -54,23 +57,12 @@ BufferBackedUniformBlock::BufferBackedUniformBlock(unsigned s):
                throw invalid_argument("BufferBackedUniformBlock::BufferBackedUniformBlock");
 }
 
-BufferBackedUniformBlock::~BufferBackedUniformBlock()
-{
-       delete buf_range;
-}
-
 unsigned BufferBackedUniformBlock::get_alignment() const
 {
-       return BufferRange::get_uniform_buffer_alignment();
-}
-
-void BufferBackedUniformBlock::location_changed(Buffer *buf, unsigned off, unsigned) const
-{
-       delete buf_range;
-       buf_range = buf->create_range(off, size);
+       return Limits::get_global().uniform_buffer_alignment;
 }
 
-void BufferBackedUniformBlock::attach(const Program::UniformInfo &info, const Uniform &uni)
+void BufferBackedUniformBlock::attach(const ReflectData::UniformInfo &info, const Uniform &uni)
 {
        if(info.block->bind_point<0)
                throw invalid_argument("BufferBackedUniformBlock::attach");
@@ -79,16 +71,5 @@ void BufferBackedUniformBlock::attach(const Program::UniformInfo &info, const Un
        dirty = true;
 }
 
-void BufferBackedUniformBlock::apply(int index) const
-{
-       if(index<0)
-               throw invalid_argument("BufferBackedUniformBlock::apply");
-       if(!get_buffer())
-               throw invalid_operation("UniformBlock::apply");
-
-       refresh();
-       buf_range->bind_to(UNIFORM_BUFFER, index);
-}
-
 } // namespace GL
 } // namespace Msp