summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Forbes <chrisf@ijw.co.nz>2015-03-01 22:20:55 +1300
committerMarek Olšák <marek.olsak@amd.com>2015-07-29 21:43:48 +0200
commit804fff51dc36e19393deb1eb70b670f31876f71d (patch)
treedc52bf2c578237d960665f0a5ee4cd099e582c86
parentd743c09623feca39d8174157c203d9d64c7b20f8 (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_test64
-rw-r--r--tests/spec/arb_tessellation_shader/execution/vertex-partial-write.shader_test64
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