-#include <stdexcept>
#include <msp/gl/extensions/arb_shader_objects.h>
#include <msp/gl/extensions/arb_uniform_buffer_object.h>
#include "buffer.h"
#include "uniformblock.h"
#include "vector.h"
-using namespace std;
-
namespace Msp {
namespace GL {
-DefaultUniformBlock::DefaultUniformBlock()
+UniformBlock::UniformBlock(const ReflectData::UniformBlockInfo &info):
+ data(info.data_size)
{
static Require _req(ARB_shader_objects);
+ if(info.bind_point>=0)
+ static Require _req2(ARB_uniform_buffer_object);
}
-void DefaultUniformBlock::attach(const ReflectData::UniformInfo &info, const Uniform &uni)
-{
- if(info.block->bind_point>=0)
- throw invalid_argument("DefaultUniformBlock::attach");
-
- 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() const
-{
- for(unsigned i=0; i<uniforms.size(); ++i)
- if(uniforms[i])
- uniforms[i]->apply(i);
-}
-
-
-BufferBackedUniformBlock::BufferBackedUniformBlock(unsigned s):
- size(s),
- data(size)
-{
- static Require _req(ARB_shader_objects);
- static Require _req2(ARB_uniform_buffer_object);
-
- if(!size)
- throw invalid_argument("BufferBackedUniformBlock::BufferBackedUniformBlock");
-}
-
-unsigned BufferBackedUniformBlock::get_alignment() const
+unsigned UniformBlock::get_alignment() const
{
return Limits::get_global().uniform_buffer_alignment;
}
-void BufferBackedUniformBlock::attach(const ReflectData::UniformInfo &info, const Uniform &uni)
+void UniformBlock::store(const ReflectData::UniformInfo &info, const Uniform &uni)
{
if(info.block->bind_point<0)
- throw invalid_argument("BufferBackedUniformBlock::attach");
-
- uni.store(info, &data[info.offset]);
+ {
+ if(info.location<0)
+ return;
+ uni.store(info, &data[info.location*16]);
+ }
+ else
+ uni.store(info, &data[info.offset]);
dirty = true;
}