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 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit