[PATCH 2/3] d3dx10_43: Share all D3DX10CreateEffectFrom* implementations
Andrew Eikum
wine at gitlab.winehq.org
Tue Jun 28 09:22:50 CDT 2022
From: Andrew Eikum <aeikum at codeweavers.com>
---
dlls/d3dx10_43/compiler.c | 41 +++++++++++++++++++++++++++++----------
1 file changed, 31 insertions(+), 10 deletions(-)
diff --git a/dlls/d3dx10_43/compiler.c b/dlls/d3dx10_43/compiler.c
index c66eb679a8f..a561cc0357f 100644
--- a/dlls/d3dx10_43/compiler.c
+++ b/dlls/d3dx10_43/compiler.c
@@ -25,6 +25,7 @@
#include "d3dx10.h"
#include "d3dcompiler.h"
#include "dxhelpers.h"
+#include "wine/heap.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
@@ -67,7 +68,9 @@ HRESULT WINAPI D3DX10CreateEffectFromFileW(const WCHAR *filename, const D3D10_SH
ID3D10Device *device, ID3D10EffectPool *effect_pool, ID3DX10ThreadPump *pump,
ID3D10Effect **effect, ID3D10Blob **errors, HRESULT *hresult)
{
- ID3D10Blob *code;
+ char filename_a[MAX_PATH], *source = NULL;
+ DWORD source_size, read_size;
+ HANDLE file;
HRESULT hr;
TRACE("filename %s, defines %p, include %p, profile %s, shader_flags %#x, effect_flags %#x, "
@@ -78,20 +81,38 @@ HRESULT WINAPI D3DX10CreateEffectFromFileW(const WCHAR *filename, const D3D10_SH
if (pump)
FIXME("Asynchronous mode is not supported.\n");
- if (!include)
- include = D3D_COMPILE_STANDARD_FILE_INCLUDE;
+ file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (file == INVALID_HANDLE_VALUE)
+ return HRESULT_FROM_WIN32(GetLastError());
- if (FAILED(hr = D3DCompileFromFile(filename, defines, include, "main", profile, shader_flags,
- effect_flags, &code, errors)))
+ source_size = GetFileSize(file, NULL);
+ if (source_size == INVALID_FILE_SIZE)
{
- WARN("Effect compilation failed, hr %#lx.\n", hr);
- return hr;
+ hr = HRESULT_FROM_WIN32(GetLastError());
+ goto end;
}
- hr = D3D10CreateEffectFromMemory(ID3D10Blob_GetBufferPointer(code), ID3D10Blob_GetBufferSize(code),
- effect_flags, device, effect_pool, effect);
- ID3D10Blob_Release(code);
+ if (!(source = heap_alloc(source_size)))
+ {
+ hr = E_OUTOFMEMORY;
+ goto end;
+ }
+
+ if (!ReadFile(file, source, source_size, &read_size, NULL) || read_size != source_size)
+ {
+ WARN("Failed to read file contents.\n");
+ hr = E_FAIL;
+ goto end;
+ }
+
+ WideCharToMultiByte(CP_ACP, 0, filename, -1, filename_a, sizeof(filename_a), NULL, NULL);
+
+ hr = D3DX10CreateEffectFromMemory(source, source_size, filename_a, defines, include, profile,
+ shader_flags, effect_flags, device, effect_pool, pump, effect, errors, hresult);
+end:
+ heap_free(source);
+ CloseHandle(file);
return hr;
}
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/332
More information about the wine-devel
mailing list