X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Funiformblock.cpp;h=256858580b9721a60663cbc0b80dd282c7a6e7db;hb=e70662d7812464159f2e47f4bebb69d88f89ae93;hp=adadf0561c8051c54d06c2ac43a3a3608e6539dd;hpb=d16d28d2ccf7c6255204f02975834f713ff1df08;p=libs%2Fgl.git diff --git a/source/core/uniformblock.cpp b/source/core/uniformblock.cpp index adadf056..25685858 100644 --- a/source/core/uniformblock.cpp +++ b/source/core/uniformblock.cpp @@ -21,19 +21,19 @@ void UniformBlock::store(const ReflectData::UniformInfo &info, size_t array_size { 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.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 } // namespace Msp