diff options
author | Chris Forbes <chrisf@ijw.co.nz> | 2015-03-01 22:20:55 +1300 |
---|---|---|
committer | Marek Olšák <marek.olsak@amd.com> | 2015-07-29 21:43:48 +0200 |
commit | 804fff51dc36e19393deb1eb70b670f31876f71d (patch) | |
tree | dc52bf2c578237d960665f0a5ee4cd099e582c86 | |
parent | d743c09623feca39d8174157c203d9d64c7b20f8 (diff) |
arb_tessellation_shader: add tests for partial output writes
These cases are interesting for i965 because writemasks for URB writes
require careful code generation.
The partial write is buried in uniform branch to defeat any coalescing a
clever implementation might otherwise do.
v2: fixed by Marek
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
-rw-r--r-- | tests/spec/arb_tessellation_shader/execution/patch-partial-write.shader_test | 64 | ||||
-rw-r--r-- | tests/spec/arb_tessellation_shader/execution/vertex-partial-write.shader_test | 64 |
2 files changed, 128 insertions, 0 deletions
diff --git a/tests/spec/arb_tessellation_shader/execution/patch-partial-write.shader_test b/tests/spec/arb_tessellation_shader/execution/patch-partial-write.shader_test new file mode 100644 index 000000000..8b0601883 --- /dev/null +++ b/tests/spec/arb_tessellation_shader/execution/patch-partial-write.shader_test @@ -0,0 +1,64 @@ +# +# Test that partial writes of patch outputs work in the control shader +# + +[require] +GLSL >= 1.50 +GL_ARB_tessellation_shader + +[vertex shader passthrough] + +[tessellation control shader] +#version 150 +#extension GL_ARB_tessellation_shader : require + +layout(vertices = 2) out; +patch out vec4 c; +uniform int x; + +void main() +{ + gl_TessLevelInner[0] = 1.0; + gl_TessLevelInner[1] = 1.0; + + gl_TessLevelOuter[0] = 1.0; + gl_TessLevelOuter[1] = 1.0; + gl_TessLevelOuter[2] = 1.0; + gl_TessLevelOuter[3] = 1.0; + + c = vec4(1.0); + if (x == 0) { /* true, but the compiler cannot see it */ + c.xz = vec2(0); + } +} + +[tessellation evaluation shader] +#version 150 +#extension GL_ARB_tessellation_shader : require + +layout(quads, equal_spacing) in; +patch in vec4 c; +out vec4 fs_c; + +void main() +{ + gl_Position = vec4(gl_TessCoord.xy * 2 - 1, 0, 1); + fs_c = c; +} + +[fragment shader] +#version 150 + +in vec4 fs_c; + +void main() +{ + gl_FragColor = fs_c; +} + +[test] +clear color 0.1 0.1 0.1 0.1 +clear +patch parameter vertices 1 +draw arrays GL_PATCHES 0 1 +probe all rgba 0.0 1.0 0.0 1.0 diff --git a/tests/spec/arb_tessellation_shader/execution/vertex-partial-write.shader_test b/tests/spec/arb_tessellation_shader/execution/vertex-partial-write.shader_test new file mode 100644 index 000000000..079516c20 --- /dev/null +++ b/tests/spec/arb_tessellation_shader/execution/vertex-partial-write.shader_test @@ -0,0 +1,64 @@ +# +# Test that partial writes of per-vertex outputs work in the control shader +# + +[require] +GLSL >= 1.50 +GL_ARB_tessellation_shader + +[vertex shader passthrough] + +[tessellation control shader] +#version 150 +#extension GL_ARB_tessellation_shader : require + +layout(vertices = 2) out; +out vec4 c[]; +uniform int x; + +void main() +{ + gl_TessLevelInner[0] = 1.0; + gl_TessLevelInner[1] = 1.0; + + gl_TessLevelOuter[0] = 1.0; + gl_TessLevelOuter[1] = 1.0; + gl_TessLevelOuter[2] = 1.0; + gl_TessLevelOuter[3] = 1.0; + + c[gl_InvocationID] = vec4(1.0); + if (x == 0) { /* true, but the compiler cannot see it */ + c[gl_InvocationID].xz = vec2(0); + } +} + +[tessellation evaluation shader] +#version 150 +#extension GL_ARB_tessellation_shader : require + +layout(quads, equal_spacing) in; +in vec4 c[]; +out vec4 fs_c; + +void main() +{ + gl_Position = vec4(gl_TessCoord.xy * 2 - 1, 0, 1); + fs_c = 0.5 * (c[0] + c[1]); +} + +[fragment shader] +#version 150 + +in vec4 fs_c; + +void main() +{ + gl_FragColor = fs_c; +} + +[test] +clear color 0.1 0.1 0.1 0.1 +clear +patch parameter vertices 1 +draw arrays GL_PATCHES 0 1 +probe all rgba 0.0 1.0 0.0 1.0 |