[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