From 5bc222ebafddd14f2329f5096287b51d798a6431 Mon Sep 17 00:00:00 2001 From: Jose Maria Casanova Crespo Date: Fri, 10 Feb 2017 14:25:27 +0100 Subject: [PATCH] glsl: non-last member unsized array on SSBO must fail compilation on GLSL ES 3.1 From GLSL ES 3.10 spec, section 4.1.9 "Arrays": "If an array is declared as the last member of a shader storage block and the size is not specified at compile-time, it is sized at run-time. In all other cases, arrays are sized only at compile-time." In desktop GLSL it is allowed to have unsized-arrays that are not last, as long as we can determine that they are implicitly sized, which is detected at link-time. With this patch Mesa reports a compilation error as glslang does with the following shader: buffer SSBO { vec4 data[]; vec4 moreData;}; void main (void) { } Fixes: dEQP-GLES31.functional.debug.negative_coverage.log.shader.compile_compute_shader dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader.compile_compute_shader dEQP-GLES31.functional.debug.negative_coverage.get_error.shader.compile_compute_shader Cc: "17.0" Signed-off-by: Jose Maria Casanova Crespo Reviewed-by: Kenneth Graunke --- src/compiler/glsl/ast_to_hir.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index b31b61d..ee47b65 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -7903,10 +7903,9 @@ ast_interface_block::hir(exec_list *instructions, } if (var->type->is_unsized_array()) { - if (var->is_in_shader_storage_block()) { - if (is_unsized_array_last_element(var)) { - var->data.from_ssbo_unsized_array = true; - } + if (var->is_in_shader_storage_block() && + is_unsized_array_last_element(var)) { + var->data.from_ssbo_unsized_array = true; } else { /* From GLSL ES 3.10 spec, section 4.1.9 "Arrays": * @@ -7914,6 +7913,10 @@ ast_interface_block::hir(exec_list *instructions, * block and the size is not specified at compile-time, it is * sized at run-time. In all other cases, arrays are sized only * at compile-time." + * + * In desktop GLSL it is allowed to have unsized-arrays that are + * not last, as long as we can determine that they are implicitly + * sized. */ if (state->es_shader) { _mesa_glsl_error(&loc, state, "unsized array `%s' " -- 2.7.4