#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"
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);
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)
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