Zebediah Figura : tests: Import invalid HLSL shader tests from Wine.
Alexandre Julliard
julliard at winehq.org
Mon Oct 5 15:46:14 CDT 2020
Module: vkd3d
Branch: master
Commit: ce4c7a16347bd71310aa40e40657f7c15ddb48ac
URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=ce4c7a16347bd71310aa40e40657f7c15ddb48ac
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Sat Oct 3 16:24:26 2020 -0500
tests: Import invalid HLSL shader tests from Wine.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
Makefile.am | 2 +
tests/hlsl-invalid.shader_test | 117 +++++++++++++++++++++++++++++++++++++++++
tests/shader_runner_d3d12.c | 47 ++++++++++++++---
3 files changed, 159 insertions(+), 7 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 15be137..93289a2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -53,6 +53,7 @@ vkd3d_shader_tests = \
tests/conditional.shader_test \
tests/hlsl-array-dimension.shader_test \
tests/hlsl-comma.shader_test \
+ tests/hlsl-invalid.shader_test \
tests/hlsl-majority-pragma.shader_test \
tests/hlsl-majority-typedef.shader_test \
tests/hlsl-return-implicit-conversion.shader_test \
@@ -194,6 +195,7 @@ XFAIL_TESTS = \
tests/conditional.shader_test \
tests/hlsl-array-dimension.shader_test \
tests/hlsl-comma.shader_test \
+ tests/hlsl-invalid.shader_test \
tests/hlsl-majority-pragma.shader_test \
tests/hlsl-majority-typedef.shader_test \
tests/hlsl-return-implicit-conversion.shader_test \
diff --git a/tests/hlsl-invalid.shader_test b/tests/hlsl-invalid.shader_test
new file mode 100644
index 0000000..16e75d0
--- /dev/null
+++ b/tests/hlsl-invalid.shader_test
@@ -0,0 +1,117 @@
+[pixel shader fail]
+float4 main() : sv_target
+{
+ return y;
+}
+
+[pixel shader fail]
+float4 main() : sv_target
+{
+ float4 x = float4(0, 0, 0, 0);
+ x.xzzx = float4(1, 2, 3, 4);
+ return x;
+}
+
+[pixel shader fail]
+float4 main(float2 pos : TEXCOORD0) : sv_target
+{
+ float4 x = pos;
+ return x;
+}
+
+[pixel shader fail]
+float4 563r(float2 45s : TEXCOORD0) : sv_target
+{
+ float4 x = 45s;
+ return float4(x.x, x.y, 0, 0);
+}
+
+[pixel shader fail]
+float4 main() : sv_target
+{
+ struct { int b,c; } x = {0};
+ return x;
+}
+
+[pixel shader fail]
+float4 main() : sv_target
+{
+ struct {} x = {};
+ return x;
+}
+
+[pixel shader fail]
+float4 main(float2 pos : TEXCOORD0) : sv_target
+{
+ return;
+}
+
+[pixel shader fail]
+void main(float2 pos : TEXCOORD0)
+{
+ return pos;
+}
+
+[pixel shader fail]
+float4 main(float2 pos : TEXCOORD0) : sv_target
+{
+ return pos;
+}
+
+[pixel shader fail]
+float4 main() : sv_target
+{
+ float a[0];
+ return 0;
+}
+
+[pixel shader fail]
+float4 main() : sv_target
+{
+ float a[65537];
+ return 0;
+}
+
+[pixel shader fail]
+float4 main() : sv_target
+{
+ int x;
+ float a[(x = 2)];
+ return 0;
+}
+
+[pixel shader fail]
+uniform float4 main() : sv_target
+{
+ return 0;
+}
+
+[pixel shader fail]
+typedef row_major float4x4 matrix_t;
+typedef column_major matrix_t matrix2_t;
+
+float4 main() : sv_target
+{
+ return 0;
+}
+
+[pixel shader fail]
+float4 main()
+{
+ return 0;
+}
+
+[pixel shader fail]
+float4 main(out float4 o : sv_target)
+{
+ o = 1;
+ return 0;
+}
+
+[pixel shader fail]
+struct {float4 a;};
+
+float4 main() : sv_target
+{
+ return 0;
+}
diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c
index 0e9694a..df7076c 100644
--- a/tests/shader_runner_d3d12.c
+++ b/tests/shader_runner_d3d12.c
@@ -102,6 +102,7 @@ static ID3D10Blob *compile_shader(const char *source, const char *target)
enum parse_state
{
STATE_NONE,
+ STATE_SHADER_INVALID_PIXEL,
STATE_SHADER_PIXEL,
STATE_TEST,
};
@@ -269,10 +270,10 @@ START_TEST(shader_runner_d3d12)
};
size_t shader_source_size = 0, shader_source_len = 0;
enum parse_state state = STATE_NONE;
+ unsigned int i, line_number = 0;
struct shader_context context;
const char *filename = NULL;
char *shader_source = NULL;
- unsigned int i;
char line[256];
FILE *f;
@@ -304,12 +305,13 @@ START_TEST(shader_runner_d3d12)
memset(&context, 0, sizeof(context));
init_test_context(&context.c, &desc);
- while (fgets(line, sizeof(line), f))
+ for (;;)
{
- if (line[0] == '\n')
- continue;
+ char *ret = fgets(line, sizeof(line), f);
- if (line[0] == '[')
+ ++line_number;
+
+ if (!ret || line[0] == '[')
{
switch (state)
{
@@ -322,14 +324,43 @@ START_TEST(shader_runner_d3d12)
return;
shader_source_len = 0;
break;
+
+ case STATE_SHADER_INVALID_PIXEL:
+ {
+ ID3D10Blob *blob = NULL, *errors = NULL;
+ HRESULT hr;
+
+ hr = D3DCompile(shader_source, strlen(shader_source), NULL,
+ NULL, NULL, "main", "ps_4_0", 0, 0, &blob, &errors);
+ ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
+ ok(!blob, "Expected no compiled shader blob.\n");
+ ok(!!errors, "Expected non-NULL error blob.\n");
+
+ if (vkd3d_test_state.debug_level)
+ trace("%s\n", (char *)ID3D10Blob_GetBufferPointer(errors));
+ ID3D10Blob_Release(errors);
+
+ shader_source_len = 0;
+ break;
+ }
}
+ }
+
+ if (!ret)
+ break;
+ if (line[0] == '[')
+ {
if (!strcmp(line, "[pixel shader]\n"))
state = STATE_SHADER_PIXEL;
+ else if (!strcmp(line, "[pixel shader fail]\n"))
+ state = STATE_SHADER_INVALID_PIXEL;
else if (!strcmp(line, "[test]\n"))
state = STATE_TEST;
+
+ vkd3d_test_set_context("Section %.*s, line %u", strlen(line) - 1, line, line_number);
}
- else
+ else if (line[0] != '\n')
{
switch (state)
{
@@ -338,6 +369,7 @@ START_TEST(shader_runner_d3d12)
fprintf(stderr, "Ignoring line '%s' in %s.\n", line, argv[1]);
break;
+ case STATE_SHADER_INVALID_PIXEL:
case STATE_SHADER_PIXEL:
{
size_t len = strlen(line);
@@ -356,7 +388,8 @@ START_TEST(shader_runner_d3d12)
}
}
- ID3D10Blob_Release(context.ps_code);
+ if (context.ps_code)
+ ID3D10Blob_Release(context.ps_code);
destroy_test_context(&context.c);
fclose(f);
More information about the wine-cvs
mailing list