BTW, Talos Principle had a bug that it calculated derivatives after discard, which is undefined on radeonsi if it results in non-uniform control flow. Then, somebody reported the bug to them, and they fixed it.
I have to say that rarely do we find a test that quotes the spec and expects the exact opposite. :) (oh sorry, this should have been on the piglit ML) Marek On Fri, Apr 8, 2016 at 11:58 PM, Francisco Jerez <curroje...@riseup.net> wrote: > Marek Olšák <mar...@gmail.com> writes: > >> From: Marek Olšák <marek.ol...@amd.com> >> >> The test is wrong and the GLSL 1.30 citation in the test states very >> clearly that discard can cause non-uniform control flow for any code that >> follows. > > Heh, IIRC I sent this exact same patch over a year ago but I didn't get > particularly enthusiastic feed-back so I never pushed it (you can > probably find the discussion in the piglit mailing list archives if > you're interested). Anyway the test is obviously bogus so this seems > like the right thing to do to me: > > Reviewed-by: Francisco Jerez <curroje...@riseup.net> > >> --- >> .../execution/fs-discard-exit-3.shader_test | 76 >> ---------------------- >> 1 file changed, 76 deletions(-) >> delete mode 100644 >> tests/spec/glsl-1.30/execution/fs-discard-exit-3.shader_test >> >> diff --git a/tests/spec/glsl-1.30/execution/fs-discard-exit-3.shader_test >> b/tests/spec/glsl-1.30/execution/fs-discard-exit-3.shader_test >> deleted file mode 100644 >> index 14e9b47..0000000 >> --- a/tests/spec/glsl-1.30/execution/fs-discard-exit-3.shader_test >> +++ /dev/null >> @@ -1,76 +0,0 @@ >> -# This is a test for derivatives behavior after a discard. >> -# >> -# From the GLSL 1.30 spec: >> -# >> -# "The discard keyword is only allowed within fragment shaders. It >> -# can be used within a fragment shader to abandon the operation >> -# on the current fragment. This keyword causes the fragment to be >> -# discarded and no updates to any buffers will occur. Control >> -# flow exits the shader, and subsequent implicit or explicit >> -# derivatives are undefined when this control flow is non-uniform >> -# (meaning different fragments within the primitive take >> -# different control paths)." >> - >> - >> -[require] >> -GLSL >= 1.30 >> - >> -[vertex shader] >> -#version 130 >> - >> -in vec4 vertex; >> -out vec2 texcoords; >> -void main() >> -{ >> - gl_Position = vertex; >> - >> - /* Turn the texcoords into a 1:1 mapping with pixels when >> - * interpolated. This means that the coords for our 2x2 >> - * subspan we're interested in for the FS will be: >> - * >> - * +-----+-----+ >> - * | 0,1 | 1,1 | >> - * +-----+-----+ >> - * | 0,0 | 0,1 | >> - * +-----+-----+ >> - * >> - * So it would sample the 1x1 miplevel of the GL_TEXTURE_2D >> - * miptree, unless some other math occurs... >> - */ >> - texcoords.yx = (vertex.xy + 1) / 2 * 250; >> -} >> - >> -[fragment shader] >> -#version 130 >> -in vec2 texcoords; >> -uniform sampler2D s; >> - >> -void main() >> -{ >> - if (gl_FragCoord.x >= 1.0 || gl_FragCoord.y >= 1.0) >> - discard; >> - >> - /* Now, we have uniform control after the discard (well, >> - * except for the join after the if statement up there). The >> - * derivatives on this sample should get us the same values >> - * for the undiscarded pixel as if we hadn't done any discard >> - * (comment out the "discard" above to see). >> - */ >> - gl_FragColor = texture(s, texcoords / 4); >> -} >> - >> -[vertex data] >> -vertex/float/2 >> --1.0 -1.0 >> - 1.0 -1.0 >> - 1.0 1.0 >> --1.0 1.0 >> - >> -[test] >> -clear color 0.5 0.5 0.5 0.5 >> -clear >> - >> -texture miptree 0 >> - >> -draw arrays GL_TRIANGLE_FAN 0 4 >> -probe rgba 0 0 0.0 1.0 0.0 1.0 >> -- >> 2.5.0 >> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev