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