From: Andrew Eikum Subject: [PATCH 3/3] d3dx10_43: Support creating effect from pre-built shader Message-Id: Date: Tue, 28 Jun 2022 14:22:51 +0000 In-Reply-To: References: From: Andrew Eikum --- 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