[Piglit] [PATCH 6/6] arb_shader_ballot: test peeling away the first invocation
Ilia Mirkin
imirkin at alum.mit.edu
Fri Mar 31 20:00:37 UTC 2017
On Fri, Mar 31, 2017 at 1:02 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> ---
> .../fs-readFirstInvocation-uint-if.shader_test | 32 ++++++++++++++
> .../fs-readFirstInvocation-uint-loop.shader_test | 49 ++++++++++++++++++++++
> 2 files changed, 81 insertions(+)
> create mode 100644 tests/spec/arb_shader_ballot/execution/fs-readFirstInvocation-uint-if.shader_test
> create mode 100644 tests/spec/arb_shader_ballot/execution/fs-readFirstInvocation-uint-loop.shader_test
>
> diff --git a/tests/spec/arb_shader_ballot/execution/fs-readFirstInvocation-uint-if.shader_test b/tests/spec/arb_shader_ballot/execution/fs-readFirstInvocation-uint-if.shader_test
> new file mode 100644
> index 0000000..0c63436
> --- /dev/null
> +++ b/tests/spec/arb_shader_ballot/execution/fs-readFirstInvocation-uint-if.shader_test
> @@ -0,0 +1,32 @@
> +[require]
> +GL >= 3.2
> +GLSL >= 1.50
> +GL_ARB_shader_ballot
> +
> +[vertex shader passthrough]
> +
> +[fragment shader]
> +#version 150
> +#extension GL_ARB_shader_ballot : require
> +
> +out vec4 outcolor;
> +
> +void main() {
> + uint first_invocation = readFirstInvocationARB(gl_SubGroupInvocationARB);
> +
> + outcolor = vec4(0.0, 1.0, 0.0, 1.0);
> +
> + if (first_invocation != gl_SubGroupInvocationARB) {
> + uint new_first_invocation = readFirstInvocationARB(gl_SubGroupInvocationARB);
> +
> + if (first_invocation == new_first_invocation)
> + outcolor = vec4(1.0, 0.0, first_invocation / 255.0, gl_SubGroupInvocationARB / 255.0);
> + }
> +}
> +
> +[test]
> +clear color 0.0 0.0 0.0 0.0
> +clear
> +
> +draw rect -1 -1 2 2
> +probe all rgba 0.0 1.0 0.0 1.0
> diff --git a/tests/spec/arb_shader_ballot/execution/fs-readFirstInvocation-uint-loop.shader_test b/tests/spec/arb_shader_ballot/execution/fs-readFirstInvocation-uint-loop.shader_test
> new file mode 100644
> index 0000000..d1f98f4
> --- /dev/null
> +++ b/tests/spec/arb_shader_ballot/execution/fs-readFirstInvocation-uint-loop.shader_test
> @@ -0,0 +1,49 @@
> +[require]
> +GL >= 3.2
> +GLSL >= 1.50
> +GL_ARB_shader_ballot
> +GL_ARB_gpu_shader_int64
> +
> +[vertex shader passthrough]
> +
> +[fragment shader]
> +#version 150
> +#extension GL_ARB_shader_ballot : require
> +#extension GL_ARB_gpu_shader_int64 : require
> +
> +out vec4 outcolor;
> +
> +void main() {
> + uint64_t active_set = ballotARB(true);
> + int i;
> +
> + int num_active = 0;
> + for (i = 0; i < 64; ++i) {
> + if ((active_set & (1ul << i)) != 0ul)
> + num_active++;
> + }
Not that perf *really* matters, but
uvec2 t = bitCount(unpackUint2x32(active_set));
int num_active = t.x + t.y;
This series is
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
> +
> + /* This loop should terminate even without the loop condition. We simply
> + * add the condition here to ensure termination when there are shader
> + * compiler bugs.
> + */
> + for (i = 0; i < num_active; ++i) {
> + uint first_invocation = readFirstInvocationARB(gl_SubGroupInvocationARB);
> +
> + if (first_invocation == gl_SubGroupInvocationARB)
> + break;
> + }
> +
> + if (i >= num_active) {
> + outcolor = vec4(1.0, 0.0, i / 255.0, gl_SubGroupInvocationARB / 255.0);
> + } else {
> + outcolor = vec4(0.0, 1.0, 0.0, 1.0);
> + }
> +}
> +
> +[test]
> +clear color 0.0 0.0 0.0 0.0
> +clear
> +
> +draw rect -1 -1 2 2
> +probe all rgba 0.0 1.0 0.0 1.0
> --
> 2.9.3
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/piglit
More information about the Piglit
mailing list