[PATCH 5/5] d3dcompiler/tests: Test include preprocessing with more functions.

Zebediah Figura zfigura at codeweavers.com
Wed Sep 1 12:12:52 CDT 2021


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/d3dcompiler_43/tests/hlsl_d3d9.c | 224 +++++++++++++++++---------
 1 file changed, 150 insertions(+), 74 deletions(-)

diff --git a/dlls/d3dcompiler_43/tests/hlsl_d3d9.c b/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
index 7a18992b18a..6dba1f4803b 100644
--- a/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
+++ b/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
@@ -24,6 +24,12 @@
 
 #include <math.h>
 
+#define D3DXERR_INVALIDDATA 0x88760b59
+
+HRESULT WINAPI D3DAssemble(const void *data, SIZE_T datasize, const char *filename,
+        const D3D_SHADER_MACRO *defines, ID3DInclude *include, UINT flags,
+        ID3DBlob **shader, ID3DBlob **error_messages);
+
 static HRESULT (WINAPI *pD3DXGetShaderConstantTable)(const DWORD *byte_code, ID3DXConstantTable **constant_table);
 
 struct vec2
@@ -1443,10 +1449,13 @@ static HRESULT WINAPI test_d3dinclude_open(ID3DInclude *iface, D3D_INCLUDE_TYPE
         const char *filename, const void *parent_data, const void **data, UINT *bytes)
 {
     static const char include1[] =
-        "#define LIGHT float4(0.0f, 0.2f, 0.5f, 1.0f)\n";
+        "#define LIGHT 1\n";
     static const char include2[] =
         "#include \"include1.h\"\n"
         "float4 light_color = LIGHT;\n";
+    static const char include3[] =
+        "#include \"include1.h\"\n"
+        "def c0, LIGHT, 0, 0, 0\n";
     char *buffer;
 
     trace("filename %s.\n", filename);
@@ -1458,7 +1467,7 @@ static HRESULT WINAPI test_d3dinclude_open(ID3DInclude *iface, D3D_INCLUDE_TYPE
         CopyMemory(buffer, include1, strlen(include1));
         *bytes = strlen(include1);
         ok(include_type == D3D_INCLUDE_LOCAL, "Unexpected include type %d.\n", include_type);
-        ok(!strncmp(include2, parent_data, strlen(include2)),
+        ok(!strncmp(include2, parent_data, strlen(include2)) || !strncmp(include3, parent_data, strlen(include3)),
                 "Unexpected parent_data value.\n");
     }
     else if (!strcmp(filename, "include\\include2.h"))
@@ -1469,6 +1478,14 @@ static HRESULT WINAPI test_d3dinclude_open(ID3DInclude *iface, D3D_INCLUDE_TYPE
         ok(!parent_data, "Unexpected parent_data value.\n");
         ok(include_type == D3D_INCLUDE_LOCAL, "Unexpected include type %d.\n", include_type);
     }
+    else if (!strcmp(filename, "include\\include3.h"))
+    {
+        buffer = heap_alloc(strlen(include3));
+        CopyMemory(buffer, include3, strlen(include3));
+        *bytes = strlen(include3);
+        ok(!parent_data, "Unexpected parent_data value.\n");
+        ok(include_type == D3D_INCLUDE_LOCAL, "Unexpected include type %d.\n", include_type);
+    }
     else
     {
         ok(0, "Unexpected #include for file %s.\n", filename);
@@ -1496,12 +1513,65 @@ struct test_d3dinclude
     ID3DInclude ID3DInclude_iface;
 };
 
-static void test_d3dcompile(void)
+static HRESULT call_D3DAssemble(const char *source_name, ID3DInclude *include, ID3D10Blob **blob, ID3D10Blob **errors)
+{
+    static const char ps_code[] =
+        "ps_2_0\n"
+        "#include \"include\\include3.h\"\n"
+        "mov oC0, c0";
+
+    return D3DAssemble(ps_code, sizeof(ps_code), source_name, NULL, include, 0, blob, errors);
+}
+
+static HRESULT call_D3DCompile(const char *source_name, ID3DInclude *include, ID3D10Blob **blob, ID3D10Blob **errors)
+{
+    static const char ps_code[] =
+        "#include \"include\\include2.h\"\n"
+        "\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return light_color;\n"
+        "}";
+
+    return D3DCompile(ps_code, sizeof(ps_code), source_name, NULL, include, "main", "ps_2_0", 0, 0, blob, errors);
+}
+
+#if D3D_COMPILER_VERSION >= 46
+static HRESULT call_D3DCompile2(const char *source_name, ID3DInclude *include, ID3D10Blob **blob, ID3D10Blob **errors)
+{
+    static const char ps_code[] =
+        "#include \"include\\include2.h\"\n"
+        "\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return light_color;\n"
+        "}";
+
+    return D3DCompile2(ps_code, sizeof(ps_code), source_name, NULL, include,
+            "main", "ps_2_0", 0, 0, 0, NULL, 0, blob, errors);
+}
+#endif
+
+static HRESULT call_D3DPreprocess(const char *source_name, ID3DInclude *include, ID3D10Blob **blob, ID3D10Blob **errors)
+{
+    static const char ps_code[] =
+        "#include \"include\\include2.h\"\n"
+        "#if LIGHT != 1\n"
+        "#error\n"
+        "#endif";
+
+    return D3DPreprocess(ps_code, sizeof(ps_code), source_name, NULL, include, blob, errors);
+}
+
+typedef HRESULT (*include_test_cb)(const char *source_name, ID3DInclude *include, ID3D10Blob **blob, ID3D10Blob **errors);
+
+static void test_include(void)
 {
     struct test_d3dinclude include = {{&test_d3dinclude_vtbl}};
     WCHAR filename[MAX_PATH], include_filename[MAX_PATH];
     ID3D10Blob *blob = NULL, *errors = NULL;
     CHAR filename_a[MAX_PATH];
+    unsigned int i;
     HRESULT hr;
     DWORD len;
     static const char ps_code[] =
@@ -1512,12 +1582,15 @@ static void test_d3dcompile(void)
         "    return light_color;\n"
         "}";
     static const char include1[] =
-        "#define LIGHT float4(0.0f, 0.2f, 0.5f, 1.0f)\n";
+        "#define LIGHT 1\n";
     static const char include1_wrong[] =
         "#define LIGHT nope\n";
     static const char include2[] =
         "#include \"include1.h\"\n"
         "float4 light_color = LIGHT;\n";
+    static const char include3[] =
+        "#include \"include1.h\"\n"
+        "def c0, LIGHT, 0, 0, 0\n";
 
 #if D3D_COMPILER_VERSION >= 46
     WCHAR directory[MAX_PATH];
@@ -1531,70 +1604,74 @@ static void test_d3dcompile(void)
     char ps_absolute_buffer[sizeof(ps_absolute_template) + MAX_PATH];
 #endif
 
+    static const include_test_cb tests[] =
+    {
+        call_D3DAssemble,
+        call_D3DPreprocess,
+        call_D3DCompile,
+#if D3D_COMPILER_VERSION >= 46
+        call_D3DCompile2,
+#endif
+    };
+
     create_file(L"source.ps", ps_code, strlen(ps_code), filename);
     create_directory(L"include");
     create_file(L"include\\include1.h", include1_wrong, strlen(include1_wrong), NULL);
     create_file(L"include1.h", include1, strlen(include1), NULL);
     create_file(L"include\\include2.h", include2, strlen(include2), include_filename);
+    create_file(L"include\\include3.h", include3, strlen(include3), NULL);
 
     len = WideCharToMultiByte(CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL);
     WideCharToMultiByte(CP_ACP, 0, filename, -1, filename_a, len, NULL, NULL);
 
-    hr = D3DCompile(ps_code, sizeof(ps_code), filename_a, NULL,
-            &include.ID3DInclude_iface, "main", "ps_2_0", 0, 0, &blob, &errors);
-    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(!!blob, "Got unexpected blob.\n");
-    ok(!errors, "Got unexpected errors.\n");
-    if (blob)
+    for (i = 0; i < ARRAY_SIZE(tests); ++i)
     {
-        ID3D10Blob_Release(blob);
-        blob = NULL;
+        winetest_push_context("Test %u", i);
+
+        hr = tests[i](filename_a, &include.ID3DInclude_iface, &blob, &errors);
+        todo_wine_if (i != 0)
+        {
+            ok(hr == S_OK, "Got hr %#x.\n", hr);
+            ok(!!blob, "Got unexpected blob.\n");
+        }
+        todo_wine_if (i == 1 || i == 2)
+            ok(!errors, "Got unexpected errors.\n");
+        if (blob)
+        {
+            ID3D10Blob_Release(blob);
+            blob = NULL;
+        }
+
+#if D3D_COMPILER_VERSION >= 46
+        hr = tests[i](NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE, &blob, &errors);
+        todo_wine_if (i == 0) ok(hr == (i == 0 ? D3DXERR_INVALIDDATA : E_FAIL), "Got hr %#x.\n", hr);
+        ok(!blob, "Got unexpected blob.\n");
+        ok(!!errors, "Got unexpected errors.\n");
+        ID3D10Blob_Release(errors);
+        errors = NULL;
+
+        /* Windows always seems to resolve includes from the initial file location
+         * instead of using the immediate parent, as it would be the case for
+         * standard C preprocessor includes. */
+        hr = tests[i](filename_a, D3D_COMPILE_STANDARD_FILE_INCLUDE, &blob, &errors);
+        todo_wine_if (i != 0)
+        {
+            ok(hr == S_OK, "Got hr %#x.\n", hr);
+            ok(!!blob, "Got unexpected blob.\n");
+        }
+        todo_wine_if (i == 1)
+            ok(!errors, "Got unexpected errors.\n");
+        if (blob)
+        {
+            ID3D10Blob_Release(blob);
+            blob = NULL;
+        }
+#endif /* D3D_COMPILER_VERSION >= 46 */
+
+        winetest_pop_context();
     }
 
 #if D3D_COMPILER_VERSION >= 46
-    hr = D3DCompile(ps_code, sizeof(ps_code), NULL, NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE,
-            "main", "ps_2_0", 0, 0, &blob, &errors);
-    ok(hr == E_FAIL, "Got hr %#x.\n", hr);
-    ok(!blob, "Got unexpected blob.\n");
-    ok(!!errors, "Got unexpected errors.\n");
-    ID3D10Blob_Release(errors);
-    errors = NULL;
-
-    /* Windows always seems to resolve includes from the initial file location
-     * instead of using the immediate parent, as it would be the case for
-     * standard C preprocessor includes. */
-    hr = D3DCompile(ps_code, sizeof(ps_code), filename_a, NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE,
-            "main", "ps_2_0", 0, 0, &blob, &errors);
-    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(!!blob, "Got unexpected blob.\n");
-    ok(!errors, "Got unexpected errors.\n");
-    if (blob)
-    {
-        ID3D10Blob_Release(blob);
-        blob = NULL;
-    }
-
-    hr = D3DCompile2(ps_code, sizeof(ps_code), filename_a, NULL, &include.ID3DInclude_iface,
-            "main", "ps_2_0", 0, 0, 0, NULL, 0, &blob, &errors);
-    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(!!blob, "Got unexpected blob.\n");
-    ok(!errors, "Got unexpected errors.\n");
-    if (blob)
-    {
-        ID3D10Blob_Release(blob);
-        blob = NULL;
-    }
-
-    hr = D3DCompile2(ps_code, sizeof(ps_code), filename_a, NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE,
-            "main", "ps_2_0", 0, 0, 0, NULL, 0, &blob, &errors);
-    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(!!blob, "Got unexpected blob.\n");
-    ok(!errors, "Got unexpected errors.\n");
-    if (blob)
-    {
-        ID3D10Blob_Release(blob);
-        blob = NULL;
-    }
 
     hr = D3DCompileFromFile(L"nonexistent", NULL, NULL, "main", "vs_2_0", 0, 0, &blob, &errors);
     ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Got hr %#x.\n", hr);
@@ -1647,26 +1724,25 @@ static void test_d3dcompile(void)
     GetCurrentDirectoryW(MAX_PATH, directory);
     SetCurrentDirectoryW(temp_dir);
 
-    hr = D3DCompile(ps_code, sizeof(ps_code), "source.ps", NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE,
-            "main", "ps_2_0", 0, 0, &blob, &errors);
-    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(!!blob, "Got unexpected blob.\n");
-    ok(!errors, "Got unexpected errors.\n");
-    if (blob)
+    for (i = 0; i < ARRAY_SIZE(tests); ++i)
     {
-        ID3D10Blob_Release(blob);
-        blob = NULL;
-    }
+        winetest_push_context("Test %u", i);
 
-    hr = D3DCompile2(ps_code, sizeof(ps_code), "source.ps", NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE,
-            "main", "ps_2_0", 0, 0, 0, NULL, 0, &blob, &errors);
-    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(!!blob, "Got unexpected blob.\n");
-    ok(!errors, "Got unexpected errors.\n");
-    if (blob)
-    {
-        ID3D10Blob_Release(blob);
-        blob = NULL;
+        hr = tests[i](NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE, &blob, &errors);
+        todo_wine_if (i != 0)
+        {
+            ok(hr == S_OK, "Got hr %#x.\n", hr);
+            ok(!!blob, "Got unexpected blob.\n");
+        }
+        todo_wine_if (i == 1 || i == 2)
+            ok(!errors, "Got unexpected errors.\n");
+        if (blob)
+        {
+            ID3D10Blob_Release(blob);
+            blob = NULL;
+        }
+
+        winetest_pop_context();
     }
 
     hr = D3DCompileFromFile(L"source.ps", NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE, "main", "ps_2_0", 0, 0, &blob, &errors);
@@ -1716,5 +1792,5 @@ START_TEST(hlsl_d3d9)
 
     test_constant_table();
     test_fail();
-    test_d3dcompile();
+    test_include();
 }
-- 
2.33.0




More information about the wine-devel mailing list