summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Piñeiro <apinheiro@igalia.com>2018-11-08 12:11:29 +0100
committerAlejandro Piñeiro <apinheiro@igalia.com>2018-11-08 12:34:01 +0100
commitaeff7c934e16631ee9669ad3a73a46b512682418 (patch)
tree9b80bda01dab380c383a1a9fecbd3e2305df4d17
parent69e102aece96a4c6c3e57d6dc73160f37d6be9e0 (diff)
vulkan: test cases for large local arrays
Equivalent to the GLSL tests added with the series "Test cases for large GLSL local arrays". Quoting from the cover-letter of that series: "Drivers typically need special handling for local array storage when arrays exceed a certain size, this adds a few test cases for exercising some corner cases that were useful when implementing support for this in the r600g driver." Right now only two of the tests included on this series is passing (local-array and multiple). But all of them were working until the the following commit: * b3c6146925595ec3a7eece3afb9ccaad32906d4c ("nir: Copy propagation between blocks") So it is fact, a regression. More info on https://bugs.freedesktop.org/show_bug.cgi?id=108624 Original GLSL series: https://lists.freedesktop.org/archives/piglit/2017-March/021867.html Reviewed-by: Neil Roberts <nroberts@igalia.com>
-rw-r--r--tests/vulkan/shaders/fs-large-local-array-vec2.vk_shader_test38
-rw-r--r--tests/vulkan/shaders/fs-large-local-array-vec3.vk_shader_test38
-rw-r--r--tests/vulkan/shaders/fs-large-local-array-vec4.vk_shader_test38
-rw-r--r--tests/vulkan/shaders/fs-large-local-array.vk_shader_test47
-rw-r--r--tests/vulkan/shaders/fs-multiple-large-local-array.vk_shader_test40
5 files changed, 201 insertions, 0 deletions
diff --git a/tests/vulkan/shaders/fs-large-local-array-vec2.vk_shader_test b/tests/vulkan/shaders/fs-large-local-array-vec2.vk_shader_test
new file mode 100644
index 000000000..6fbf71d50
--- /dev/null
+++ b/tests/vulkan/shaders/fs-large-local-array-vec2.vk_shader_test
@@ -0,0 +1,38 @@
+# Tests a large vec2 local array.
+# Vulkan equivalent to tests/spec/glsl-1.30/execution/fs-large-local-array-vec2.shader_test
+
+[require]
+
+[vertex shader passthrough]
+
+[fragment shader]
+#version 450
+
+layout (binding = 5) uniform block {
+ uint i;
+};
+
+layout (location = 0) out vec4 out_color;
+
+void main()
+{
+ vec2 A[130];
+ A[20].g = 0;
+ A[i].g = 37;
+ A[i].r = 1;
+ out_color.rba = vec3(0.0, 0.0, 1.0);
+ out_color.g = float(A[20].g == 37);
+}
+
+[test]
+clear color 1.0 0.0 0.0 1.0
+clear
+
+uniform ubo 5 uint 0 19
+draw rect -1 -1 2 2
+probe all rgba 0.0 0.0 0.0 1.0
+
+clear
+uniform ubo 5 uint 0 20
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/vulkan/shaders/fs-large-local-array-vec3.vk_shader_test b/tests/vulkan/shaders/fs-large-local-array-vec3.vk_shader_test
new file mode 100644
index 000000000..8c00bc720
--- /dev/null
+++ b/tests/vulkan/shaders/fs-large-local-array-vec3.vk_shader_test
@@ -0,0 +1,38 @@
+# Tests a large vec3 local array.
+# Vulkan equivalent to tests/spec/glsl-1.30/execution/fs-large-local-array-vec3.shader_test
+
+[require]
+
+[vertex shader passthrough]
+
+[fragment shader]
+#version 450
+
+layout (binding = 5) uniform block {
+ uint i;
+};
+
+layout (location = 0) out vec4 out_color;
+
+void main()
+{
+ vec3 A[130];
+ A[20].g = 0;
+ A[i].g = 37;
+ A[i].r = 1;
+ out_color.rba = vec3(0.0, 0.0, 1.0);
+ out_color.g = float(A[20].g == 37);
+}
+
+[test]
+clear color 1.0 0.0 0.0 1.0
+clear
+
+uniform ubo 5 uint 0 19
+draw rect -1 -1 2 2
+probe all rgba 0.0 0.0 0.0 1.0
+
+clear
+uniform ubo 5 uint 0 20
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/vulkan/shaders/fs-large-local-array-vec4.vk_shader_test b/tests/vulkan/shaders/fs-large-local-array-vec4.vk_shader_test
new file mode 100644
index 000000000..6239bfee6
--- /dev/null
+++ b/tests/vulkan/shaders/fs-large-local-array-vec4.vk_shader_test
@@ -0,0 +1,38 @@
+# Tests a large vec4 local array.
+# Vulkan equivalent to tests/spec/glsl-1.30/execution/fs-large-local-array-vec4.shader_test
+
+[require]
+
+[vertex shader passthrough]
+
+[fragment shader]
+#version 450
+
+layout (binding = 5) uniform block {
+ uint i;
+};
+
+layout (location = 0) out vec4 out_color;
+
+void main()
+{
+ vec4 A[130];
+ A[20].g = 0;
+ A[i].g = 37;
+ A[i].r = 1;
+ out_color.rba = vec3(0.0, 0.0, 1.0);
+ out_color.g = float(A[20].g == 37);
+}
+
+[test]
+clear color 1.0 0.0 0.0 1.0
+clear
+
+uniform ubo 5 uint 0 19
+draw rect -1 -1 2 2
+probe all rgba 0.0 0.0 0.0 1.0
+
+clear
+uniform ubo 5 uint 0 20
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/vulkan/shaders/fs-large-local-array.vk_shader_test b/tests/vulkan/shaders/fs-large-local-array.vk_shader_test
new file mode 100644
index 000000000..c62109ee1
--- /dev/null
+++ b/tests/vulkan/shaders/fs-large-local-array.vk_shader_test
@@ -0,0 +1,47 @@
+# Tests a large uint local array.
+# Vulkan equivalent to tests/spec/glsl-1.30/execution/fs-large-local-array.shader_test
+# And quoting from that test:
+#
+# "Test correct handling of local-scope declared arrays large enough to
+# typically not fit into first level GPU memory such as its register file,
+# requiring storing/loading to some device-specific scratch space.
+#
+# One hardware example is R600 where arrays larger than 124*vec4 cannot
+# fit into its GPR register file and has to be spilled to scratch memory.
+# As of 2017-03-06 this is the largest known register file of any GPU, so
+# the test uses that as a size to guarantee some form of spilling on any GPU."
+
+[require]
+
+[vertex shader passthrough]
+
+[fragment shader]
+#version 450
+
+layout (binding = 5) uniform block {
+ uint i;
+};
+
+layout (location = 0) out vec4 out_color;
+
+void main()
+{
+ uint A[130];
+ A[20] = 0u;
+ A[i] = 37u;
+ out_color.rba = vec3(0.0, 0.0, 1.0);
+ out_color.g = float(A[20] == 37u);
+}
+
+[test]
+clear color 1.0 0.0 0.0 1.0
+clear
+
+uniform ubo 5 uint 0 19
+draw rect -1 -1 2 2
+probe all rgba 0.0 0.0 0.0 1.0
+
+clear
+uniform ubo 5 uint 0 20
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/vulkan/shaders/fs-multiple-large-local-array.vk_shader_test b/tests/vulkan/shaders/fs-multiple-large-local-array.vk_shader_test
new file mode 100644
index 000000000..658027876
--- /dev/null
+++ b/tests/vulkan/shaders/fs-multiple-large-local-array.vk_shader_test
@@ -0,0 +1,40 @@
+# Tests multiple large uint local arrays.
+# Vulkan equivalent to tests/spec/glsl-1.30/execution/fs-multiple-large-local-array.shader_test
+
+[require]
+
+[vertex shader passthrough]
+
+[fragment shader]
+#version 450
+
+layout (binding = 5) uniform block {
+ uint i;
+};
+
+layout (location = 0) out vec4 out_color;
+
+void main()
+{
+ uint A[60];
+ uint B[70];
+ A[20] = 0u;
+ A[i] = 37u;
+ B[20] = 0u;
+ B[i] = 39u;
+ out_color.rba = vec3(0.0, 0.0, 1.0);
+ out_color.g = float(A[20] == 37u && B[20] == 39u);
+}
+
+[test]
+clear color 1.0 0.0 0.0 1.0
+clear
+
+uniform ubo 5 uint 0 19
+draw rect -1 -1 2 2
+probe all rgba 0.0 0.0 0.0 1.0
+
+clear
+uniform ubo 5 uint 0 20
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0