[Mesa-dev] [PATCH 2/2] glsl: fix GL_BUFFER_DATA_SIZE value for shader storage blocks with unsize arrays

Samuel Iglesias Gonsálvez siglesias at igalia.com
Wed Oct 28 03:32:53 PDT 2015



On 28/10/15 10:32, Iago Toral wrote:
> On Thu, 2015-10-22 at 11:01 +0200, Samuel Iglesias Gonsalvez wrote:
>> From ARB_program_interface_query:
>>
>> "For the property of BUFFER_DATA_SIZE, then the implementation-dependent
>>  minimum total buffer object size, in basic machine units, required to hold
>>  all active variables associated with an active uniform block, shader
>>  storage block, or atomic counter buffer is written to <params>.  If the
>>  final member of an active shader storage block is array with no declared
>>  size, the minimum buffer size is computed assuming the array was declared
>>  as an array with one element."
>>
>> Fixes the following dEQP-GLES31 tests:
>>
>> dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_data_size.named_block
>> dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_data_size.unnamed_block
>> dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_data_size.block_array
>>
>> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
>> ---
>>  src/glsl/link_uniform_blocks.cpp | 15 ++++++++++++---
>>  1 file changed, 12 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/glsl/link_uniform_blocks.cpp b/src/glsl/link_uniform_blocks.cpp
>> index 5285d8d..a10b44b 100644
>> --- a/src/glsl/link_uniform_blocks.cpp
>> +++ b/src/glsl/link_uniform_blocks.cpp
>> @@ -130,13 +130,22 @@ private:
>>  
>>        unsigned alignment = 0;
>>        unsigned size = 0;
>> -
>> +      /* From ARB_program_interface_query:
> Add a blank line here
>> +       * "If the final member of an active shader storage block is array with
>> +       * no declared size, the minimum buffer size is computed assuming the
>> +       * array was declared as an array with one element."
> 
> Align the two lines above to the If in the first line and indent the
> block in quotes like it is done for other similar comments in the same
> function just below this.
> 

OK

>> +       *
>> +       * For that reason, we use the base type of the unsized array to calculate
>> +       * its size.
>> +       */
> 
> I was wondering if we should also check that this is the last member
> explicitly (there is an unused bool parameter in this function that
> informs us about that). My understanding is that only SSBOs can have
> that, and the parser should ensure that they are last  in the SSBO
> definition, so maybe it is redundant... if we don't want to add that
> check, then maybe it is worth amending the comment to explain why though
> (and even in that case maybe we want to add an assert).
> 

It is redundant because that check is done in the parser as you said. I
will amend the comment to explain it and add the assert too.

> With these changes:
> Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
> 

Thanks,

Sam

>> +      const glsl_type *type_for_size =
>> +         type->is_unsized_array() ? type->without_array() : type;
>>        if (packing == GLSL_INTERFACE_PACKING_STD430) {
>>           alignment = type->std430_base_alignment(v->RowMajor);
>> -         size = type->std430_size(v->RowMajor);
>> +         size = type_for_size->std430_size(v->RowMajor);
>>        } else {
>>           alignment = type->std140_base_alignment(v->RowMajor);
>> -         size = type->std140_size(v->RowMajor);
>> +         size = type_for_size->std140_size(v->RowMajor);
>>        }
>>  
>>        this->offset = glsl_align(this->offset, alignment);
> 
> 
> 


More information about the mesa-dev mailing list