2 #include <msp/gl/extensions/arb_shader_objects.h>
3 #include <msp/gl/extensions/arb_uniform_buffer_object.h>
9 #include "uniformblock.h"
17 DefaultUniformBlock::DefaultUniformBlock()
19 static Require _req(ARB_shader_objects);
22 void DefaultUniformBlock::attach(const Program::UniformInfo &info, const Uniform &uni)
24 if(info.block->bind_point>=0)
25 throw invalid_argument("DefaultUniformBlock::attach");
27 uniforms[info.location] = &uni;
30 void DefaultUniformBlock::attach(int index, const Uniform &uni)
32 uniforms[index] = &uni;
35 void DefaultUniformBlock::apply(int index) const
38 throw invalid_argument("DefaultUniformBlock::apply");
40 for(map<int, const Uniform *>::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
41 i->second->apply(i->first);
45 BufferBackedUniformBlock::BufferBackedUniformBlock(unsigned s):
50 static Require _req(ARB_shader_objects);
51 static Require _req2(ARB_uniform_buffer_object);
54 throw invalid_argument("BufferBackedUniformBlock::BufferBackedUniformBlock");
57 BufferBackedUniformBlock::~BufferBackedUniformBlock()
62 unsigned BufferBackedUniformBlock::get_alignment() const
64 return BufferRange::get_uniform_buffer_alignment();
67 void BufferBackedUniformBlock::location_changed(Buffer *buf, unsigned off, unsigned) const
70 buf_range = buf->create_range(off, size);
73 void BufferBackedUniformBlock::attach(const Program::UniformInfo &info, const Uniform &uni)
75 if(info.block->bind_point<0)
76 throw invalid_argument("BufferBackedUniformBlock::attach");
78 uni.store(info, &data[info.offset]);
82 void BufferBackedUniformBlock::apply(int index) const
85 throw invalid_argument("BufferBackedUniformBlock::apply");
87 throw invalid_operation("UniformBlock::apply");
90 buf_range->bind_to(UNIFORM_BUFFER, index);