From: Nicolai Hähnle <[email protected]> This test exposes a subtle bug in st_glsl_to_tgsi. I found this bug while investigating the referenced bug report.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98664 --- .../geometry/gs-conditional-emit.shader_test | 82 ++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 tests/spec/glsl-1.50/execution/geometry/gs-conditional-emit.shader_test diff --git a/tests/spec/glsl-1.50/execution/geometry/gs-conditional-emit.shader_test b/tests/spec/glsl-1.50/execution/geometry/gs-conditional-emit.shader_test new file mode 100644 index 0000000..8e71f30 --- /dev/null +++ b/tests/spec/glsl-1.50/execution/geometry/gs-conditional-emit.shader_test @@ -0,0 +1,82 @@ +# The contents of out variables is undefined after EmitVertex(), but this +# should only apply when the EmitVertex() is actually executed. +# +# This test triggered a bug in st_glsl_to_tgsi, where the contents of +# gs_fs_color were not preserved for the first emit in the else-block. + +[require] +GL >= 3.2 +GLSL >= 1.50 + +[vertex shader passthrough] + +[geometry shader] + +layout(points) in; +layout(triangle_strip, max_vertices = 4) out; + +flat out vec4 gs_fs_color; + +uniform int choice; +uniform vec4 u_color; + +void emit(float x, float y) +{ + gl_Position.x = x; + gl_Position.y = y * gs_fs_color.y; + gl_Position.z = 0.0; + gl_Position.w = 1.0; + EmitVertex(); +} + +void main() +{ + gs_fs_color = 2 * u_color; + + if (choice >= 2) { + emit(-1, -1); + gs_fs_color = vec4(0, 1, 0, 1); + emit(-1, 1); + gs_fs_color = vec4(0, 1, 0, 1); + emit(1, -1); + gs_fs_color = vec4(0, 1, 0, 1); + emit(1, 1); + EndPrimitive(); + } else { + emit(-1, -1); + gs_fs_color = vec4(0, 1, 0, 1); + emit(-1, 1); + gs_fs_color = vec4(0, 1, 0, 1); + emit(1, -1); + gs_fs_color = vec4(0, 1, 0, 1); + emit(1, 1); + EndPrimitive(); + } +} + +[fragment shader] + +flat in vec4 gs_fs_color; +out vec4 color; + +void main() +{ + color = gs_fs_color; +} + +[test] +clear color 1.0 0.0 0.0 0.0 +clear + +uniform vec4 u_color 0.0 0.5 0.0 0.5 + +uniform int choice 4 +draw arrays GL_POINTS 0 1 +probe all rgba 0.0 1.0 0.0 1.0 + +clear color 1.0 0.0 0.0 0.0 +clear + +uniform int choice 1 +draw arrays GL_POINTS 0 1 +probe all rgba 0.0 1.0 0.0 1.0 -- 2.7.4 _______________________________________________ Piglit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/piglit
