namespace Msp {
namespace GL {
-UniformBlock::UniformBlock():
- size(0),
- buf_range(0)
+DefaultUniformBlock::DefaultUniformBlock()
{
static Require _req(ARB_shader_objects);
}
-UniformBlock::UniformBlock(unsigned s):
+void DefaultUniformBlock::attach(const Program::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(int index) const
+{
+ if(index>=0)
+ throw invalid_argument("DefaultUniformBlock::apply");
+
+ 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)
{
- static Require _req(ARB_uniform_buffer_object);
+ static Require _req(ARB_shader_objects);
+ static Require _req2(ARB_uniform_buffer_object);
if(!size)
- throw invalid_argument("UniformBlock::UniformBlock");
- data.resize(size);
+ throw invalid_argument("BufferBackedUniformBlock::BufferBackedUniformBlock");
}
-UniformBlock::~UniformBlock()
+BufferBackedUniformBlock::~BufferBackedUniformBlock()
{
delete buf_range;
}
-unsigned UniformBlock::get_alignment() const
+unsigned BufferBackedUniformBlock::get_alignment() const
{
return BufferRange::get_uniform_buffer_alignment();
}
-void UniformBlock::location_changed(Buffer *buf, unsigned off, unsigned) const
+void BufferBackedUniformBlock::location_changed(Buffer *buf, unsigned off, unsigned) const
{
delete buf_range;
- buf_range = new BufferRange(*buf, off, size);
+ buf_range = buf->create_range(off, size);
}
-void UniformBlock::attach(int index, const Uniform &uni)
+void BufferBackedUniformBlock::attach(const Program::UniformInfo &info, const Uniform &uni)
{
- if(size)
- throw invalid_operation("UniformBlock::attach");
+ if(info.block->bind_point<0)
+ throw invalid_argument("BufferBackedUniformBlock::attach");
- uniforms[index] = &uni;
-}
-
-void UniformBlock::attach(const Program::UniformInfo &info, const Uniform &uni)
-{
- if(size)
- {
- uni.store(info, &data[info.location]);
- dirty = true;
- }
- else
- uniforms[info.location] = &uni;
+ uni.store(info, &data[info.offset]);
+ dirty = true;
}
-void UniformBlock::apply(int index) const
+void BufferBackedUniformBlock::apply(int index) const
{
- if((index>=0) != (size>0))
+ if(index<0)
+ throw invalid_argument("BufferBackedUniformBlock::apply");
+ if(!get_buffer())
throw invalid_operation("UniformBlock::apply");
- if(size)
- {
- if(!get_buffer())
- throw invalid_operation("UniformBlock::apply");
-
- refresh();
- buf_range->bind_to(UNIFORM_BUFFER, index);
- }
- else
- {
- for(map<int, const Uniform *>::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
- i->second->apply(i->first);
- }
+ refresh();
+ buf_range->bind_to(UNIFORM_BUFFER, index);
}
} // namespace GL