[Mesa-dev] [PATCH v2] main: fix TOP_LEVEL_ARRAY_SIZE and TOP_LEVEL_ARRAY_STRIDE

Tapani Pälli tapani.palli at intel.com
Wed Oct 7 07:16:57 PDT 2015


Reviewed-by: Tapani Pälli <tapani.palli at intel.com>

On 10/06/2015 11:08 AM, Samuel Iglesias Gonsalvez wrote:
> When the active variable is an array which is already a top-level
> shader storage block member, don't return its array size and stride
> when querying TOP_LEVEL_ARRAY_SIZE and TOP_LEVEL_ARRAY_STRIDE
> respectively.
>
> Fixes the following 12 dEQP-GLES31 tests:
>
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.mat3x4
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.row_major_mat3x4
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.column_major_mat3x4
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.mat3x4
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.row_major_mat3x4
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.column_major_mat3x4
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.mat3x4
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.row_major_mat3x4
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.column_major_mat3x4
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.mat3x4
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat3x4
> dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.column_major_mat3x4
>
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> Tested-by: Tapani Pälli <tapani.palli at intel.com>
>
> v2:
> - Fix check when the shader storage block is instanced
> - Write auxiliary function to do the check.
>
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> ---
>   src/mesa/main/shader_query.cpp | 51 +++++++++++++++++++++++++++++++++++++++++-
>   1 file changed, 50 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
> index 9e33dd9..9fc43d4 100644
> --- a/src/mesa/main/shader_query.cpp
> +++ b/src/mesa/main/shader_query.cpp
> @@ -872,6 +872,44 @@ get_var_name(const char *name)
>      return strndup(first_dot+1, strlen(first_dot) - 1);
>   }
>   
> +static bool
> +is_top_level_shader_storage_block_member(const char* name,
> +                                         const char* interface_name,
> +                                         const char* field_name)
> +{
> +   bool result = false;
> +
> +   /* If the given variable is already a top-level shader storage
> +    * block member, then return array_size = 1.
> +    * We could have two possibilities: if we have an instanced
> +    * shader storage block or not instanced.
> +    *
> +    * For the first, we check create a name as it was in top level and
> +    * compare it with the real name. If they are the same, then
> +    * the variable is already at top-level.
> +    *
> +    * Full instanced name is: interface name + '.' + var name +
> +    *    NULL character
> +    */
> +   int name_length = strlen(interface_name) + 1 + strlen(field_name) + 1;
> +   char *full_instanced_name = (char *) calloc(name_length, sizeof(char));
> +   snprintf(full_instanced_name, name_length, "%s.%s",
> +            interface_name, field_name);
> +   if (!full_instanced_name) {
> +      fprintf(stderr, "%s: Cannot allocate space for name\n", __func__);
> +      return false;
> +   }
> +   /* Check if its top-level shader storage block member of an
> +    * instanced interface block, or of a unnamed interface block.
> +    */
> +   if ((strcmp(name, full_instanced_name) == 0) ||
> +       strcmp(name, field_name) == 0)
> +      result = true;
> +
> +   free(full_instanced_name);
> +   return result;
> +}
> +
>   static GLint
>   program_resource_top_level_array_size(struct gl_shader_program *shProg,
>                                         struct gl_program_resource *res,
> @@ -921,12 +959,17 @@ program_resource_top_level_array_size(struct gl_shader_program *shProg,
>                * the top-level block member is an array with no declared size,
>                * the value zero is written to <params>.
>                */
> -            if (field->type->is_unsized_array())
> +            if (is_top_level_shader_storage_block_member(name,
> +                                                         interface_name,
> +                                                         var_name))
> +               array_size = 1;
> +            else if (field->type->is_unsized_array())
>                  array_size = 0;
>               else if (field->type->is_array())
>                  array_size = field->type->length;
>               else
>                  array_size = 1;
> +
>               goto found_top_level_array_size;
>            }
>         }
> @@ -995,6 +1038,12 @@ program_resource_top_level_array_stride(struct gl_shader_program *shProg,
>                  bool row_major = matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR;
>                  const glsl_type *array_type = field->type->fields.array;
>   
> +               if (is_top_level_shader_storage_block_member(name,
> +                                                            interface_name,
> +                                                            var_name)) {
> +                  array_stride = 0;
> +                  goto found_top_level_array_stride;
> +               }
>                  if (interface->interface_packing != GLSL_INTERFACE_PACKING_STD430) {
>                     if (array_type->is_record()) {
>                        array_stride = array_type->std140_size(row_major);



More information about the mesa-dev mailing list