[PATCH 3/3] d3dx10_43: Support creating effect from pre-built shader

Andrew Eikum wine at gitlab.winehq.org
Tue Jun 28 09:22:51 CDT 2022


From: Andrew Eikum <aeikum at codeweavers.com>

---
 dlls/d3dx10_43/compiler.c     | 34 +++++++++++++++++++++++-----------
 dlls/d3dx10_43/tests/d3dx10.c | 18 +++++++++---------
 2 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/dlls/d3dx10_43/compiler.c b/dlls/d3dx10_43/compiler.c
index a561cc0357f..46b7ecaac80 100644
--- a/dlls/d3dx10_43/compiler.c
+++ b/dlls/d3dx10_43/compiler.c
@@ -29,6 +29,10 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
 
+#define MAKE_TAG(ch0, ch1, ch2, ch3) \
+    ((DWORD)(ch0) | ((DWORD)(ch1) << 8) | \
+    ((DWORD)(ch2) << 16) | ((DWORD)(ch3) << 24 ))
+#define TAG_DXBC MAKE_TAG('D', 'X', 'B', 'C')
 
 HRESULT WINAPI D3DX10CreateEffectFromMemory(const void *data, SIZE_T datasize, const char *filename,
         const D3D10_SHADER_MACRO *defines, ID3D10Include *include, const char *profile,
@@ -46,19 +50,27 @@ HRESULT WINAPI D3DX10CreateEffectFromMemory(const void *data, SIZE_T datasize, c
     if (pump)
         FIXME("Asynchronous mode is not supported.\n");
 
-    if (!include)
-        include = D3D_COMPILE_STANDARD_FILE_INCLUDE;
-
-    if (FAILED(hr = D3DCompile(data, datasize, filename, defines, include, "main", profile,
-            shader_flags, effect_flags, &code, errors)))
+    if (datasize >= sizeof(DWORD) && ((const DWORD *)data)[0] == TAG_DXBC)
     {
-        WARN("Effect compilation failed, hr %#lx.\n", hr);
-        return hr;
+        hr = D3D10CreateEffectFromMemory((char *)data, datasize,
+                effect_flags, device, effect_pool, effect);
+    }
+    else
+    {
+        if (!include)
+            include = D3D_COMPILE_STANDARD_FILE_INCLUDE;
+
+        if (FAILED(hr = D3DCompile(data, datasize, filename, defines, include, "main", profile,
+                shader_flags, effect_flags, &code, errors)))
+        {
+            WARN("Effect compilation failed, hr %#lx.\n", hr);
+            return hr;
+        }
+
+        hr = D3D10CreateEffectFromMemory(ID3D10Blob_GetBufferPointer(code), ID3D10Blob_GetBufferSize(code),
+                effect_flags, device, effect_pool, effect);
+        ID3D10Blob_Release(code);
     }
-
-    hr = D3D10CreateEffectFromMemory(ID3D10Blob_GetBufferPointer(code), ID3D10Blob_GetBufferSize(code),
-            effect_flags, device, effect_pool, effect);
-    ID3D10Blob_Release(code);
 
     return hr;
 }
diff --git a/dlls/d3dx10_43/tests/d3dx10.c b/dlls/d3dx10_43/tests/d3dx10.c
index 252e2a40ee8..ec14afce1bb 100644
--- a/dlls/d3dx10_43/tests/d3dx10.c
+++ b/dlls/d3dx10_43/tests/d3dx10.c
@@ -3586,9 +3586,9 @@ static void test_D3DX10CreateEffectFromResource(void)
     hr = D3DX10CreateEffectFromResourceA(GetModuleHandleA(NULL), "fx_test_ecbt.fx", NULL,
             NULL, NULL, "fx_4_0", 0x0, 0x0, device, NULL, NULL, &effect,
             &errors, NULL);
-    todo_wine ok(hr == S_OK, "D3DX10CreateEffectFromResource failed: %#x\n", hr);
-    todo_wine ok(errors == NULL, "Got unexpected effect errors\n");
-    todo_wine ok(effect != NULL, "No effect created\n");
+    ok(hr == S_OK, "D3DX10CreateEffectFromResource failed: %#x\n", hr);
+    ok(errors == NULL, "Got unexpected effect errors\n");
+    ok(effect != NULL, "No effect created\n");
     if (errors)
         ID3D10Blob_Release(errors);
     if (effect)
@@ -3638,9 +3638,9 @@ static void test_D3DX10CreateEffectFromMemory(void)
     hr = D3DX10CreateEffectFromMemory(fx_test_ecbt, fx_test_ecbt_size, NULL,
             NULL, NULL, "fx_4_0", 0x0, 0x0, device, NULL, NULL, &effect,
             &errors, NULL);
-    todo_wine ok(hr == S_OK, "D3DX10CreateEffectFromMemory failed: %#x\n", hr);
-    todo_wine ok(errors == NULL, "Got unexpected effect errors\n");
-    todo_wine ok(effect != NULL, "No effect created\n");
+    ok(hr == S_OK, "D3DX10CreateEffectFromMemory failed: %#x\n", hr);
+    ok(errors == NULL, "Got unexpected effect errors\n");
+    ok(effect != NULL, "No effect created\n");
     if (errors)
         ID3D10Blob_Release(errors);
     if (effect)
@@ -3695,9 +3695,9 @@ static void test_D3DX10CreateEffectFromFile(void)
     hr = D3DX10CreateEffectFromFileW(path,
             NULL, NULL, "fx_4_0", 0x0, 0x0, device, NULL, NULL, &effect,
             &errors, NULL);
-    todo_wine ok(hr == S_OK, "D3DX10CreateEffectFromFile failed: %#x\n", hr);
-    todo_wine ok(errors == NULL, "Got unexpected effect errors\n");
-    todo_wine ok(effect != NULL, "No effect created\n");
+    ok(hr == S_OK, "D3DX10CreateEffectFromFile failed: %#x\n", hr);
+    ok(errors == NULL, "Got unexpected effect errors\n");
+    ok(effect != NULL, "No effect created\n");
     if (errors)
         ID3D10Blob_Release(errors);
     if (effect)
-- 
GitLab

https://gitlab.winehq.org/wine/wine/-/merge_requests/332



More information about the wine-devel mailing list