[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 02:02:58 PDT 2015


This is a reminder that this patch is still unreviewed.

Sam

On 22/10/15 11:01, 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:
> +       * "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."
> +       *
> +       * For that reason, we use the base type of the unsized array to calculate
> +       * its size.
> +       */
> +      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