Compilation output from D3D10CompileEffectFromMemory() always contains $Globals buffer, even if it's empty. That matches behaviour of 33-39 compilers.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
-- v3: d3d10/tests: Add a test for effect compilation containing empty buffers. d3d10: Use older compiler for D3D10CompileEffectFromMemory().
From: Nikolay Sivov nsivov@codeweavers.com
Compilation output from D3D10CompileEffectFromMemory() always contains $Globals buffer, even if it's empty. That matches behaviour of 33-39 compilers.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d3d10/Makefile.in | 3 ++- dlls/d3d10/d3d10_main.c | 2 +- dlls/d3d10/d3d10_private.h | 8 ++++++++ dlls/d3d10/shader.c | 5 ++--- dlls/d3dcompiler_39/Makefile.in | 1 + 5 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/dlls/d3d10/Makefile.in b/dlls/d3d10/Makefile.in index b942e27f991..573b0791e21 100644 --- a/dlls/d3d10/Makefile.in +++ b/dlls/d3d10/Makefile.in @@ -1,11 +1,12 @@ MODULE = d3d10.dll IMPORTLIB = d3d10 -IMPORTS = uuid d3d10core d3dcompiler dxgi wined3d +IMPORTS = uuid d3d10core d3dcompiler_39 dxgi wined3d EXTRADEFS = -DD3D_COMPILER_VERSION=0 PARENTSRC = ../d3dcompiler_43 EXTRAINCL = $(VKD3D_PE_CFLAGS)
SOURCES = \ + blob.c \ d3d10_main.c \ effect.c \ reflection.c \ diff --git a/dlls/d3d10/d3d10_main.c b/dlls/d3d10/d3d10_main.c index 82c2ecc2ec9..565b5f4a0c1 100644 --- a/dlls/d3d10/d3d10_main.c +++ b/dlls/d3d10/d3d10_main.c @@ -239,7 +239,7 @@ HRESULT WINAPI D3D10CompileEffectFromMemory(void *data, SIZE_T data_size, const data, data_size, wine_dbgstr_a(filename), defines, include, hlsl_flags, fx_flags, effect, errors);
- return D3DCompile(data, data_size, filename, defines, include, + return D3DCompileFromMemory(data, data_size, filename, defines, include, NULL, "fx_4_0", hlsl_flags, fx_flags, effect, errors); }
diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h index c174792e14b..040976ffaa5 100644 --- a/dlls/d3d10/d3d10_private.h +++ b/dlls/d3d10/d3d10_private.h @@ -315,4 +315,12 @@ HRESULT d3d10_effect_parse(struct d3d10_effect *effect, const void *data, SIZE_T HRESULT WINAPI D3D10CoreCreateDevice(IDXGIFactory *factory, IDXGIAdapter *adapter, unsigned int flags, D3D_FEATURE_LEVEL feature_level, ID3D10Device **device);
+/* d3dcompiler_39 function prototypes */ +HRESULT WINAPI D3DCompileFromMemory(const void *data, SIZE_T data_size, const char *filename, + const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint, + const char *target, UINT sflags, UINT eflags, ID3DBlob **shader, ID3DBlob **error_messages); + +HRESULT WINAPI D3DDisassembleCode(const void *data, SIZE_T data_size, + UINT flags, const char *comments, ID3DBlob **disassembly); + #endif /* __WINE_D3D10_PRIVATE_H */ diff --git a/dlls/d3d10/shader.c b/dlls/d3d10/shader.c index 761b2b3211f..ef8221a2737 100644 --- a/dlls/d3d10/shader.c +++ b/dlls/d3d10/shader.c @@ -26,8 +26,7 @@ HRESULT WINAPI D3D10CompileShader(const char *data, SIZE_T data_size, const char const D3D10_SHADER_MACRO *defines, ID3D10Include *include, const char *entrypoint, const char *profile, UINT flags, ID3D10Blob **shader, ID3D10Blob **error_messages) { - /* Forward to d3dcompiler */ - return D3DCompile(data, data_size, filename, defines, include, + return D3DCompileFromMemory(data, data_size, filename, defines, include, entrypoint, profile, flags, 0, shader, error_messages); }
@@ -37,5 +36,5 @@ HRESULT WINAPI D3D10DisassembleShader(const void *data, SIZE_T data_size, TRACE("data %p, data_size %#Ix, color_code %#x, comments %p, disassembly %p.\n", data, data_size, color_code, comments, disassembly);
- return D3DDisassemble(data, data_size, color_code ? D3D_DISASM_ENABLE_COLOR_CODE : 0, comments, disassembly); + return D3DDisassembleCode(data, data_size, color_code ? D3D_DISASM_ENABLE_COLOR_CODE : 0, comments, disassembly); } diff --git a/dlls/d3dcompiler_39/Makefile.in b/dlls/d3dcompiler_39/Makefile.in index 2f9231871f1..4735aa18411 100644 --- a/dlls/d3dcompiler_39/Makefile.in +++ b/dlls/d3dcompiler_39/Makefile.in @@ -1,4 +1,5 @@ MODULE = d3dcompiler_39.dll +IMPORTLIB = d3dcompiler_39 IMPORTS = wined3d EXTRADEFS = -DD3D_COMPILER_VERSION=39 PARENTSRC = ../d3dcompiler_43
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d3d10/tests/effect.c | 58 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-)
diff --git a/dlls/d3d10/tests/effect.c b/dlls/d3d10/tests/effect.c index 0935541ced0..94f046ea479 100644 --- a/dlls/d3d10/tests/effect.c +++ b/dlls/d3d10/tests/effect.c @@ -9877,7 +9877,15 @@ static void test_effect_fx_4_1_blend_state(void)
static void test_effect_compiler(void) { - static char empty_effect[] = "technique10 {};"; + static char empty_effect[] = + "technique10 {};"; + static char empty_buffer[] = + "cbuffer cb1 { float4 m1; }\n" + "cbuffer cb2 { }\n" + "technique10 {};"; + + D3D10_EFFECT_VARIABLE_DESC var_desc; + ID3D10EffectConstantBuffer *cb; D3D10_EFFECT_DESC desc; ID3D10Device *device; ID3D10Effect *effect; @@ -9899,10 +9907,56 @@ static void test_effect_compiler(void) hr = ID3D10Effect_GetDesc(effect, &desc); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(desc.Techniques == 1, "Unexpected technique count %u.\n", desc.Techniques); + todo_wine + ok(desc.ConstantBuffers == 1, "Unexpected buffer count %u.\n", desc.ConstantBuffers); + + cb = effect->lpVtbl->GetConstantBufferByIndex(effect, 0); + hr = cb->lpVtbl->GetDesc(cb, &var_desc); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + ok(!strcmp(var_desc.Name, "$Globals"), "Unexpected variable name %s.\n", var_desc.Name); + ID3D10Effect_Release(effect); + ID3D10Blob_Release(blob);
- ID3D10Device_Release(device); + /* Empty user buffers. */ + hr = D3D10CompileEffectFromMemory(empty_buffer, sizeof(empty_buffer), NULL, NULL, NULL, 0, 0, + &blob, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = create_effect(ID3D10Blob_GetBufferPointer(blob), 0, device, NULL, &effect); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = ID3D10Effect_GetDesc(effect, &desc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(desc.Techniques == 1, "Unexpected technique count %u.\n", desc.Techniques); + todo_wine + ok(desc.ConstantBuffers == 3, "Unexpected buffer count %u.\n", desc.ConstantBuffers); + + cb = effect->lpVtbl->GetConstantBufferByIndex(effect, 0); + hr = cb->lpVtbl->GetDesc(cb, &var_desc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!strcmp(var_desc.Name, "$Globals"), "Unexpected variable name %s.\n", var_desc.Name); + + cb = effect->lpVtbl->GetConstantBufferByIndex(effect, 1); + hr = cb->lpVtbl->GetDesc(cb, &var_desc); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + ok(!strcmp(var_desc.Name, "cb1"), "Unexpected variable name %s.\n", var_desc.Name); + + cb = effect->lpVtbl->GetConstantBufferByIndex(effect, 2); + hr = cb->lpVtbl->GetDesc(cb, &var_desc); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + ok(!strcmp(var_desc.Name, "cb2"), "Unexpected variable name %s.\n", var_desc.Name); + + ID3D10Effect_Release(effect); ID3D10Blob_Release(blob); + + ID3D10Device_Release(device); }
START_TEST(effect)
On Thu Mar 28 17:38:41 2024 +0000, Nikolay Sivov wrote:
Yes, that makes sense, applied.
Pushed some tests now.
This merge request was approved by Matteo Bruni.