Module: wine Branch: master Commit: a44681e19be3d4c20cb6c98e1a12e7982b94acce URL: https://gitlab.winehq.org/wine/wine/-/commit/a44681e19be3d4c20cb6c98e1a12e79...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sun Mar 10 11:20:51 2024 +0100
d3dcompiler: Wrap fx_4_x output in a dxbc container.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
---
dlls/d3dcompiler_43/compiler.c | 14 ++++++++++++++ dlls/d3dcompiler_43/d3dcompiler_private.h | 1 + 2 files changed, 15 insertions(+)
diff --git a/dlls/d3dcompiler_43/compiler.c b/dlls/d3dcompiler_43/compiler.c index c1940e8d888..e5c9981ded5 100644 --- a/dlls/d3dcompiler_43/compiler.c +++ b/dlls/d3dcompiler_43/compiler.c @@ -601,6 +601,20 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen return S_OK; }
+ /* Unlike other effect profiles fx_4_x is using DXBC container. */ + if (!strcmp(profile, "fx_4_0") || !strcmp(profile, "fx_4_1")) + { + struct vkd3d_shader_dxbc_section_desc section = { .tag = TAG_FX10, .data = byte_code }; + struct vkd3d_shader_code dxbc; + + ret = vkd3d_shader_serialize_dxbc(1, §ion, &dxbc, NULL); + vkd3d_shader_free_shader_code(&byte_code); + if (ret) + return hresult_from_vkd3d_result(ret); + + byte_code = dxbc; + } + if (SUCCEEDED(hr = D3DCreateBlob(byte_code.size, shader_blob))) memcpy(ID3D10Blob_GetBufferPointer(*shader_blob), byte_code.code, byte_code.size);
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index 33c82c000c5..a1759da661e 100644 --- a/dlls/d3dcompiler_43/d3dcompiler_private.h +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h @@ -523,6 +523,7 @@ void SlDeleteShader(struct bwriter_shader *shader); ((DWORD)(ch2) << 16) | ((DWORD)(ch3) << 24 )) #define TAG_Aon9 MAKE_TAG('A', 'o', 'n', '9') #define TAG_DXBC MAKE_TAG('D', 'X', 'B', 'C') +#define TAG_FX10 MAKE_TAG('F', 'X', '1', '0') #define TAG_ISGN MAKE_TAG('I', 'S', 'G', 'N') #define TAG_OSGN MAKE_TAG('O', 'S', 'G', 'N') #define TAG_OSG5 MAKE_TAG('O', 'S', 'G', '5')