[GLSL] Unused arrays declared without a size should be handled like arrays of size 1.
@hikiko
Submitted by Eleni Maria Stea Assigned to mes..@..op.org
Link to original bug (#106915)
Description
From GLSLang Spec 4.60 Section 4.2 Scoping:
"An array implicitly sized in one shader can be explicitly sized by another shader in the same stage. If no shader in a stage has an explicit size for the array, the largest implicit size (one more than the largest index used) in that stage is used. There is no cross-stage array sizing. If there is no static access to an implicitly sized array within the stage declaring it, then the array is given a size of 1, which is relevant when the array is declared within an interface block that is shared with other stages or the application (other unused arrays might be eliminated by the optimizer)."
According to the paragraph above, the following piglit test should not generate any errors as s[] would be treated as an array of size 1:
[vertex shader] #version 150 #extension GL_ARB_shader_storage_buffer_object: require buffer a { vec4 s[]; vec4 a[]; } b;
in vec4 piglit_vertex; out vec4 c;
void main(void) { c = b.a[0];
gl_Position = piglit_vertex;
}
[test] link error
Test: spec/arb_shader_storage_buffer_object/linker/unsized_array_member.shader_test
but it does.
If we convert the GLSL code to SPIR-V there are no linker errors anymore since s[] seems to have type: OpTypeArray with size 1 and the linker accepts it.