[Piglit] [PATCH] vulkan: test cases for large local arrays

Alejandro PiƱeiro apinheiro at igalia.com
Thu Nov 8 11:18:07 UTC 2018


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
---
 .../fs-large-local-array-vec2.vk_shader_test       | 38 +++++++++++++++++
 .../fs-large-local-array-vec3.vk_shader_test       | 38 +++++++++++++++++
 .../fs-large-local-array-vec4.vk_shader_test       | 38 +++++++++++++++++
 .../shaders/fs-large-local-array.vk_shader_test    | 47 ++++++++++++++++++++++
 .../fs-multiple-large-local-array.vk_shader_test   | 40 ++++++++++++++++++
 5 files changed, 201 insertions(+)
 create mode 100644 tests/vulkan/shaders/fs-large-local-array-vec2.vk_shader_test
 create mode 100644 tests/vulkan/shaders/fs-large-local-array-vec3.vk_shader_test
 create mode 100644 tests/vulkan/shaders/fs-large-local-array-vec4.vk_shader_test
 create mode 100644 tests/vulkan/shaders/fs-large-local-array.vk_shader_test
 create mode 100644 tests/vulkan/shaders/fs-multiple-large-local-array.vk_shader_test

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
-- 
2.14.1



More information about the Piglit mailing list