Signed-off-by: Daniel Schürmann <daniel.schuerm...@campus.tu-berlin.de> --- Makefile.am | 1 + src/tests/func/amd/gcn_shader.c | 252 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 253 insertions(+) create mode 100644 src/tests/func/amd/gcn_shader.c
diff --git a/Makefile.am b/Makefile.am index 515bedf..2c65424 100644 --- a/Makefile.am +++ b/Makefile.am @@ -76,6 +76,7 @@ bin_crucible_SOURCES = \ src/tests/example/images.c \ src/tests/example/messages.c \ src/tests/func/amd/amd_common.c \ + src/tests/func/amd/gcn_shader.c \ src/tests/func/cmd-buffer/secondary.c \ src/tests/func/copy/copy-buffer.c \ src/tests/func/4-vertex-buffers.c \ diff --git a/src/tests/func/amd/gcn_shader.c b/src/tests/func/amd/gcn_shader.c new file mode 100644 index 0000000..7d63d7a --- /dev/null +++ b/src/tests/func/amd/gcn_shader.c @@ -0,0 +1,252 @@ +// Copyright 2018 Valve Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice (including the next +// paragraph) shall be included in all copies or substantial portions of the +// Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. + +#include "util/simple_pipeline.h" +#include "tapi/t.h" +#include "amd_common.h" + +#include "gcn_shader-spirv.h" + +static void +time(void) +{ + t_require_ext("VK_AMD_gcn_shader"); + VkShaderModule fs = qoCreateShaderModuleGLSL( + t_device, FRAGMENT, + QO_EXTENSION GL_ARB_gpu_shader_int64 : enable + QO_EXTENSION GL_AMD_gcn_shader : enable + layout(location = 0) out vec4 f_color; + layout(push_constant) uniform push_consts { + int nothing; + }; + /* We cannot really test the time output. + * Thus, we only check for monotony. */ + void main() { + float res = 0.0; + uint64_t time1 = timeAMD(); + if (time1 == 0) res = 1.0; + uint64_t time2 = timeAMD(); + if (time2 < time1) res = 1.0; + + f_color = vec4(res, 1.0 - res, 0.0, 1.0); + } + ); + struct { + uint32_t nothing; + } push; + run_simple_pipeline(fs, &push, sizeof(push)); +} +test_define { + .name = "func.amd.gcn-shader.time", + .start = time, + .image_filename = "32x32-green.ref.png", +}; + +static void +cubeFaceCoordTC(void) +{ + t_require_ext("VK_AMD_gcn_shader"); + VkShaderModule cs = qoCreateShaderModuleGLSL( + t_device, COMPUTE, + QO_EXTENSION GL_AMD_gcn_shader : enable + layout(set = 0, binding = 0, std430) buffer Storage { + vec4 v[]; + } ssbo; + + layout (local_size_x = 1) in; + + void main() + { + uint idx = gl_GlobalInvocationID.x; + ssbo.v[idx].w = cubeFaceCoordAMD(ssbo.v[idx].xyz).x; + } + ); + + const struct { + float params[3]; + float result; + } cases[] = { + {{1.0, -0.1, 0.8,}, 0.1}, // -y + {{-1.0, 0.5, 0.3,}, -0.5}, // -y + {{-0.2, 1.0, 0.7,}, 0.7}, // +z + {{0.9, -1.0, 0.4,}, -0.4}, // -z + {{-0.1, 0.0, 1.0,}, -0.0}, // -y + {{0.3, 0.6, -1.0,}, -0.6}, // -y + /* corner cases */ + {{1.0, 1.0, -0.0,}, -0.0}, // +z -> posY + {{1.0, -1.0, 0.0,}, -0.0}, // -z -> negY + {{0.0, 0.0, 0.0,}, -0.0}, // -y -> posZ + {{1.0, 1.0, -1.0,}, -1.0}, // -y -> negZ + }; + + RUN_CASES(float, "%f"); +} +test_define { + .name = "func.amd.gcn-shader.cube-face-coord-tc", + .start = cubeFaceCoordTC, + .no_image = true, +}; + +static void +cubeFaceCoordSC(void) +{ + t_require_ext("VK_AMD_gcn_shader"); + VkShaderModule cs = qoCreateShaderModuleGLSL( + t_device, COMPUTE, + QO_EXTENSION GL_AMD_gcn_shader : enable + layout(set = 0, binding = 0, std430) buffer Storage { + vec4 v[]; + } ssbo; + + layout (local_size_x = 1) in; + + void main() + { + uint idx = gl_GlobalInvocationID.x; + ssbo.v[idx].w = cubeFaceCoordAMD(ssbo.v[idx].xyz).y; + } + ); + + const struct { + float params[3]; + float result; + } cases[] = { + {{1.0, -0.1, 0.8,}, -0.8}, // -z + {{-1.0, 0.5, 0.3,}, 0.3}, // +z + {{-0.2, 1.0, 0.7,}, -0.2}, // +x + {{0.9, -1.0, 0.4,}, 0.9}, // +x + {{-0.1, 0.0, 1.0,}, -0.1}, // +x + {{0.3, 0.6, -1.0,}, -0.3}, // -x + /* corner cases */ + {{1.0, 1.0, -0.0,}, 1.0}, // +x -> posY + {{1.0, -1.0, 0.0,}, 1.0}, // +x -> negY + {{0.0, 0.0, 0.0,}, 0.0}, // +x -> posZ + {{1.0, 1.0, -1.0,}, -1.0}, // -x -> negZ + }; + + RUN_CASES(float, "%f"); +} +test_define { + .name = "func.amd.gcn-shader.cube-face-coord-sc", + .start = cubeFaceCoordSC, + .no_image = true, +}; + +static void +cubeFaceIndex(void) +{ + t_require_ext("VK_AMD_gcn_shader"); + VkShaderModule cs = qoCreateShaderModuleGLSL( + t_device, COMPUTE, + QO_EXTENSION GL_AMD_gcn_shader : enable + layout(set = 0, binding = 0, std430) buffer Storage { + vec4 v[]; + } ssbo; + + layout (local_size_x = 1) in; + + void main() + { + uint idx = gl_GlobalInvocationID.x; + ssbo.v[idx].w = cubeFaceIndexAMD(ssbo.v[idx].xyz); + } + ); + + const struct { + float params[3]; + float result; + } cases[] = { + {{1.0, -0.1, 0.8,}, 0.0}, + {{-1.0, 0.5, 0.3,}, 1.0}, + {{-0.2, 1.0, 0.7,}, 2.0}, + {{0.9, -1.0, 0.4,}, 3.0}, + {{-0.1, 0.0, 1.0,}, 4.0}, + {{0.3, 0.6, -1.0,}, 5.0}, + /* corner cases */ + {{1.0, 1.0, -0.0,}, 2.0}, + {{1.0, -1.0, 0.0,}, 3.0}, + {{0.0, 0.0, 0.0,}, 4.0}, + {{1.0, 1.0, -1.0,}, 5.0}, + }; + + RUN_CASES(float, "%f"); +} +test_define { + .name = "func.amd.gcn-shader.cube-face-index", + .start = cubeFaceIndex, + .no_image = true, +}; + + +static void +constant_folding(void) +{ + t_require_ext("VK_AMD_gcn_shader"); + VkShaderModule fs = qoCreateShaderModuleGLSL( + t_device, FRAGMENT, + QO_EXTENSION GL_AMD_gcn_shader : enable + layout(location = 0) out vec4 f_color; + layout(push_constant) uniform push_consts { + vec3 i[8]; + }; + + void main() { + if (cubeFaceCoordAMD(vec3(1.0, -0.1, 0.8)) == cubeFaceCoordAMD(i[0]) && + cubeFaceCoordAMD(vec3(-1.0, 0.5, 0.3)) == cubeFaceCoordAMD(i[1]) && + cubeFaceCoordAMD(vec3(-0.2, 1.0, 0.7)) == cubeFaceCoordAMD(i[2]) && + cubeFaceCoordAMD(vec3(0.9, -1.0, 0.4)) == cubeFaceCoordAMD(i[3]) && + cubeFaceCoordAMD(vec3(-0.1, 0.0, 1.0)) == cubeFaceCoordAMD(i[4]) && + cubeFaceCoordAMD(vec3(0.3, 0.6, -1.0)) == cubeFaceCoordAMD(i[5]) && + cubeFaceCoordAMD(vec3(1.0, 1.0, -0.0)) == cubeFaceCoordAMD(i[6]) && + cubeFaceCoordAMD(vec3(0.0, 0.0, 0.0)) == cubeFaceCoordAMD(i[7]) && + cubeFaceIndexAMD(vec3(1.0, -0.1, 0.8)) == cubeFaceIndexAMD(i[0]) && + cubeFaceIndexAMD(vec3(-1.0, 0.5, 0.3)) == cubeFaceIndexAMD(i[1]) && + cubeFaceIndexAMD(vec3(-0.2, 1.0, 0.7)) == cubeFaceIndexAMD(i[2]) && + cubeFaceIndexAMD(vec3(0.9, -1.0, 0.4)) == cubeFaceIndexAMD(i[3]) && + cubeFaceIndexAMD(vec3(-0.1, 0.0, 1.0)) == cubeFaceIndexAMD(i[4]) && + cubeFaceIndexAMD(vec3(0.3, 0.6, -1.0)) == cubeFaceIndexAMD(i[5]) && + cubeFaceIndexAMD(vec3(1.0, 1.0, -0.0)) == cubeFaceIndexAMD(i[6]) && + cubeFaceIndexAMD(vec3(0.0, 0.0, 0.0)) == cubeFaceIndexAMD(i[7])) + f_color = vec4(0.0, 1.0, 0.0, 1.0); + else + f_color = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + struct { + float i[4]; + } push[8] = { + {{1.0, -0.1, 0.8, 0.0}}, + {{-1.0, 0.5, 0.3, 1.0}}, + {{-0.2, 1.0, 0.7, 2.0}}, + {{0.9, -1.0, 0.4, 3.0}}, + {{-0.1, 0.0, 1.0, 4.0}}, + {{0.3, 0.6, -1.0, 5.0}}, + /* corner cases */ + {{1.0, 1.0, -0.0, 6.0}}, + {{0.0, 0.0, 0.0, 7.0}}, + }; + run_simple_pipeline(fs, &push, sizeof(push)); +} +test_define { + .name = "func.amd.gcn-shader.constant", + .start = constant_folding, + .image_filename = "32x32-green.ref.png", +}; -- 2.14.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev