X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Funiformblock.cpp;h=952fd2fde0f736bfab861938a0682a411d1e5389;hp=89032b5cf3f045e07c42d9a283f8693975a34687;hb=HEAD;hpb=be6ffe96ecb4707599fe1a6f620c348760213d46 diff --git a/source/core/uniformblock.cpp b/source/core/uniformblock.cpp index 89032b5c..952fd2fd 100644 --- a/source/core/uniformblock.cpp +++ b/source/core/uniformblock.cpp @@ -1,5 +1,5 @@ #include -#include "deviceinfo.h" +#include "device.h" #include "uniformblock.h" using namespace std; @@ -14,26 +14,26 @@ UniformBlock::UniformBlock(const ReflectData::UniformBlockInfo &info): size_t UniformBlock::get_alignment() const { - return DeviceInfo::get_global().limits.uniform_buffer_alignment; + return Device::get_current().get_info().limits.uniform_buffer_alignment; } void UniformBlock::store(const ReflectData::UniformInfo &info, size_t array_size, const void *value) { array_size = min(array_size, max(info.array_size, 1U)); - char *store_ptr; + size_t store_offset; bool packed; - if(info.block->bind_point<0) + if(info.block->bind_point==ReflectData::DEFAULT_BLOCK) { if(info.location<0) return; - store_ptr = data.data()+info.location*16; + store_offset = info.location*16; packed = true; } else { - store_ptr = data.data()+info.offset; + store_offset = info.offset; if(array_size!=1 && info.array_stride!=get_type_size(info.type)) packed = false; else if(is_matrix(info.type)) @@ -42,16 +42,19 @@ void UniformBlock::store(const ReflectData::UniformInfo &info, size_t array_size packed = true; } + char *store_ptr = data.data()+store_offset; const char *value_ptr = static_cast(value); if(packed) { - const char *data_end = value_ptr+array_size*get_type_size(info.type); - copy(value_ptr, data_end, store_ptr); + size_t value_size = array_size*get_type_size(info.type); + check_store_range(store_offset, value_size); + copy(value_ptr, value_ptr+value_size, store_ptr); } else if(is_matrix(info.type)) { unsigned col_size = get_type_size(get_matrix_column_type(info.type)); unsigned cols = get_type_size(info.type)/col_size; + check_store_range(store_offset, (array_size-1)*info.array_stride+(cols-1)*info.matrix_stride+col_size); for(unsigned i=0; idata.size() || offs+size>data.size()) + throw out_of_range("UniformBlock::store"); +#endif } } // namespace GL