On 07/10/15 16:25, Ilia Mirkin wrote: > On Tue, Oct 6, 2015 at 4:08 AM, Samuel Iglesias Gonsalvez > <sigles...@igalia.com> 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 <sigles...@igalia.com> >> Tested-by: Tapani Pälli <tapani.pa...@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 <sigles...@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); > > Should this happen after the null check? >
Yes, you are right. >> + 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) > > Why is one strcmp wrapped in () but the other isn't? > That is a mistake. I will remote the () of the first one. Thanks for the review, Sam >> + 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); >> -- >> 2.1.4 >> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev