ReflectData::BlockInfo &default_block = rd.blocks.emplace_back();
+ size_t offset = 0;
for(ReflectData::UniformInfo &u: rd.uniforms)
if(!u.block)
{
u.location = glGetUniformLocation(id, u.name.c_str());
u.block = &default_block;
+ u.offset = offset;
u.array_stride = get_type_size(u.type);
if(is_matrix(u.type))
u.matrix_stride = get_type_size(get_matrix_column_type(u.type));
if(is_image(u.type) && u.location>=0)
glGetUniformiv(id, u.location, &u.binding);
+
+ offset += u.array_size*get_type_size(u.type);
}
+ default_block.data_size = offset;
default_block.sort_uniforms();
default_block.update_layout_hash();
}
func = &uniform_matrix_wrapper<float, glUniformMatrix4x3fv>;
if(func)
- uniform_calls.emplace_back(u->location, u->array_size, func);
+ uniform_calls.emplace_back(u->location, u->array_size, u->offset, func);
}
-
- if(i->data_size<=0)
- {
- const ReflectData::UniformInfo &last = *i->uniforms.back();
- i->data_size = last.location*16+last.array_size*get_type_size(last.type);
- }
}
}
{
array_size = min(array_size, max<size_t>(info.array_size, 1U));
- size_t store_offset;
- bool packed;
- if(info.block->bind_point==ReflectData::DEFAULT_BLOCK)
+ bool packed = true;
+ if(info.block->bind_point!=ReflectData::DEFAULT_BLOCK)
{
- if(info.location<0)
- return;
-
- store_offset = info.location*16;
- packed = true;
- }
- else
- {
- store_offset = info.offset;
if(array_size!=1 && info.array_stride!=get_type_size(info.type))
packed = false;
else if(is_matrix(info.type))
packed = (info.matrix_stride==get_type_size(get_matrix_column_type(info.type)));
- else
- packed = true;
}
+ else if(info.location<0)
+ return;
- char *store_ptr = data.data()+store_offset;
+ char *store_ptr = data.data()+info.offset;
const char *value_ptr = static_cast<const char *>(value);
if(packed)
{
size_t value_size = array_size*get_type_size(info.type);
- check_store_range(store_offset, value_size);
+ check_store_range(info.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);
+ check_store_range(info.offset, (array_size-1)*info.array_stride+(cols-1)*info.matrix_stride+col_size);
for(unsigned i=0; i<array_size; ++i)
{
char *elem_ptr = store_ptr;
else
{
unsigned elem_size = get_type_size(info.type);
- check_store_range(store_offset, (array_size-1)*info.array_stride+elem_size);
+ check_store_range(info.offset, (array_size-1)*info.array_stride+elem_size);
for(unsigned i=0; i<array_size; ++i)
{
copy(value_ptr, value_ptr+elem_size, store_ptr);