In Mesa, as of commit f38ac41, uniform blocks are only validated between adjacent shader stages. That means that if a program contains vertex, geometry, and fragment shader stages, and the vertex and fragment shader stages refer to a uniform block that isn't referred to by the geometry stage, then some linker checks may not be performed.
Most possible link errors get detected at a later stage of linking, but I found one case that wasn't; this test exercises that case. Test is known to fail with Mesa f38ac41. --- ...e-uniform-block-array-size-mismatch.shader_test | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/spec/glsl-1.50/linker/skip-stage-uniform-block-array-size-mismatch.shader_test diff --git a/tests/spec/glsl-1.50/linker/skip-stage-uniform-block-array-size-mismatch.shader_test b/tests/spec/glsl-1.50/linker/skip-stage-uniform-block-array-size-mismatch.shader_test new file mode 100644 index 0000000..dd83093 --- /dev/null +++ b/tests/spec/glsl-1.50/linker/skip-stage-uniform-block-array-size-mismatch.shader_test @@ -0,0 +1,48 @@ +// From the GLSL 1.50 spec, section 4.3.7 (Interface Blocks): +// +// Furthermore, if a matching block is declared as an array, then +// the array sizes must also match (or follow array matching rules +// for the interface between a vertex and a geometry shader). +// +// In this test, we deliberately create a uniform block array in both +// the vertex and fragment shaders, using different array sizes. The +// geometry shader does not access the uniform block array. Then we +// check that the implementation correctly reported an error. + +[require] +GLSL >= 1.50 + +[vertex shader] +uniform Foo { + vec4 x; +} foo[3]; + +void main() +{ + gl_Position = vec4(foo[0].x); +} + +[geometry shader] +layout(triangles) in; +layout(triangle_strip, max_vertices=3) out; + +void main() +{ + for (int i = 0; i < 3; i++) { + gl_Position = gl_in[i].gl_Position; + EmitVertex(); + } +} + +[fragment shader] +uniform Foo { + vec4 x; +} bar[2]; + +void main() +{ + gl_FragColor = bar[0].x; +} + +[test] +link error -- 1.8.4.2 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit