X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Funiformblock.cpp;h=4b07241fab3943d14f35932ea498024bdc5ad2d2;hb=1b23728908f5ec9beb08b2b70737c3903745fddc;hp=6f63e385a7bbf6dad1791a3c7782dbf3c350abbd;hpb=58e4e69e640838076c506a94cd5f8f905d55420a;p=libs%2Fgl.git diff --git a/source/core/uniformblock.cpp b/source/core/uniformblock.cpp index 6f63e385..4b07241f 100644 --- a/source/core/uniformblock.cpp +++ b/source/core/uniformblock.cpp @@ -3,6 +3,7 @@ #include #include "buffer.h" #include "color.h" +#include "deviceinfo.h" #include "error.h" #include "matrix.h" #include "uniform.h" @@ -14,77 +15,60 @@ using namespace std; namespace Msp { namespace GL { -UniformBlock::UniformBlock(): - size(0), - buf_range(0) +DefaultUniformBlock::DefaultUniformBlock() { static Require _req(ARB_shader_objects); } -UniformBlock::UniformBlock(unsigned s): - size(s), - buf_range(0) +void DefaultUniformBlock::attach(const ReflectData::UniformInfo &info, const Uniform &uni) { - static Require _req(ARB_uniform_buffer_object); + if(info.block->bind_point>=0) + throw invalid_argument("DefaultUniformBlock::attach"); - if(!size) - throw invalid_argument("UniformBlock::UniformBlock"); - data.resize(size); + attach(info.location, uni); } -UniformBlock::~UniformBlock() +void DefaultUniformBlock::attach(int index, const Uniform &uni) { - delete buf_range; -} + if(index<0) + return; -unsigned UniformBlock::get_alignment() const -{ - return BufferRange::get_uniform_buffer_alignment(); + if(static_cast(index)>=uniforms.size()) + uniforms.resize(index+1, 0); + uniforms[index] = &uni; } -void UniformBlock::location_changed(Buffer *buf, unsigned off, unsigned) const +void DefaultUniformBlock::apply() const { - delete buf_range; - buf_range = new BufferRange(*buf, off, size); + for(unsigned i=0; iapply(i); } -void UniformBlock::attach(int index, const Uniform &uni) + +BufferBackedUniformBlock::BufferBackedUniformBlock(unsigned s): + size(s), + data(size) { - if(size) - throw invalid_operation("UniformBlock::attach"); + static Require _req(ARB_shader_objects); + static Require _req2(ARB_uniform_buffer_object); - uniforms[index] = &uni; + if(!size) + throw invalid_argument("BufferBackedUniformBlock::BufferBackedUniformBlock"); } -void UniformBlock::attach(const Program::UniformInfo &info, const Uniform &uni) +unsigned BufferBackedUniformBlock::get_alignment() const { - if(size) - { - uni.store(info, &data[info.offset]); - dirty = true; - } - else - uniforms[info.location] = &uni; + return Limits::get_global().uniform_buffer_alignment; } -void UniformBlock::apply(int index) const +void BufferBackedUniformBlock::attach(const ReflectData::UniformInfo &info, const Uniform &uni) { - if((index>=0) != (size>0)) - throw invalid_operation("UniformBlock::apply"); - - if(size) - { - if(!get_buffer()) - throw invalid_operation("UniformBlock::apply"); + if(info.block->bind_point<0) + throw invalid_argument("BufferBackedUniformBlock::attach"); - refresh(); - buf_range->bind_to(UNIFORM_BUFFER, index); - } - else - { - for(map::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i) - i->second->apply(i->first); - } + uni.store(info, &data[info.offset]); + dirty = true; } } // namespace GL