From 72d6654c7327b544b7ed8d5c4957882cc73ee44b Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Wed, 1 Sep 2021 12:12:51 -0500 Subject: [PATCH] d3dcompiler: Handle D3D_COMPILE_STANDARD_FILE_INCLUDE in preprocess_shader(). Signed-off-by: Zebediah Figura Signed-off-by: Matteo Bruni Signed-off-by: Alexandre Julliard --- dlls/d3dcompiler_43/compiler.c | 164 ++++++++++++++++----------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/dlls/d3dcompiler_43/compiler.c b/dlls/d3dcompiler_43/compiler.c index 4fae71d4196..d4523edb99c 100644 --- a/dlls/d3dcompiler_43/compiler.c +++ b/dlls/d3dcompiler_43/compiler.c @@ -481,13 +481,95 @@ int wpp_parse( const char *input, FILE *output ) return ret; } +static HRESULT WINAPI d3dcompiler_include_from_file_open(ID3DInclude *iface, D3D_INCLUDE_TYPE include_type, + const char *filename, const void *parent_data, const void **data, UINT *bytes) +{ + char *fullpath, *buffer = NULL, current_dir[MAX_PATH + 1]; + const char *initial_dir; + SIZE_T size; + HANDLE file; + ULONG read; + DWORD len; + + if ((initial_dir = strrchr(initial_filename, '\\'))) + { + len = initial_dir - initial_filename + 1; + initial_dir = initial_filename; + } + else + { + len = GetCurrentDirectoryA(MAX_PATH, current_dir); + current_dir[len] = '\\'; + len++; + initial_dir = current_dir; + } + fullpath = heap_alloc(len + strlen(filename) + 1); + if (!fullpath) + return E_OUTOFMEMORY; + memcpy(fullpath, initial_dir, len); + strcpy(fullpath + len, filename); + + file = CreateFileA(fullpath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + if (file == INVALID_HANDLE_VALUE) + goto error; + + TRACE("Include file found at %s.\n", debugstr_a(fullpath)); + + size = GetFileSize(file, NULL); + if (size == INVALID_FILE_SIZE) + goto error; + buffer = heap_alloc(size); + if (!buffer) + goto error; + if (!ReadFile(file, buffer, size, &read, NULL) || read != size) + goto error; + + *bytes = size; + *data = buffer; + + heap_free(fullpath); + CloseHandle(file); + return S_OK; + +error: + heap_free(fullpath); + heap_free(buffer); + CloseHandle(file); + WARN("Returning E_FAIL.\n"); + return E_FAIL; +} + +static HRESULT WINAPI d3dcompiler_include_from_file_close(ID3DInclude *iface, const void *data) +{ + heap_free((void *)data); + return S_OK; +} + +const struct ID3DIncludeVtbl d3dcompiler_include_from_file_vtbl = +{ + d3dcompiler_include_from_file_open, + d3dcompiler_include_from_file_close +}; + +struct d3dcompiler_include_from_file +{ + ID3DInclude ID3DInclude_iface; +}; + static HRESULT preprocess_shader(const void *data, SIZE_T data_size, const char *filename, const D3D_SHADER_MACRO *defines, ID3DInclude *include, ID3DBlob **error_messages) { + struct d3dcompiler_include_from_file include_from_file; int ret; HRESULT hr = S_OK; const D3D_SHADER_MACRO *def = defines; + if (include == D3D_COMPILE_STANDARD_FILE_INCLUDE) + { + include_from_file.ID3DInclude_iface.lpVtbl = &d3dcompiler_include_from_file_vtbl; + include = &include_from_file.ID3DInclude_iface; + } + if (def != NULL) { while (def->Name != NULL) @@ -654,88 +736,12 @@ HRESULT WINAPI D3DAssemble(const void *data, SIZE_T datasize, const char *filena return hr; } -static HRESULT WINAPI d3dcompiler_include_from_file_open(ID3DInclude *iface, D3D_INCLUDE_TYPE include_type, - const char *filename, const void *parent_data, const void **data, UINT *bytes) -{ - char *fullpath, *buffer = NULL, current_dir[MAX_PATH + 1]; - const char *initial_dir; - SIZE_T size; - HANDLE file; - ULONG read; - DWORD len; - - if ((initial_dir = strrchr(initial_filename, '\\'))) - { - len = initial_dir - initial_filename + 1; - initial_dir = initial_filename; - } - else - { - len = GetCurrentDirectoryA(MAX_PATH, current_dir); - current_dir[len] = '\\'; - len++; - initial_dir = current_dir; - } - fullpath = heap_alloc(len + strlen(filename) + 1); - if (!fullpath) - return E_OUTOFMEMORY; - memcpy(fullpath, initial_dir, len); - strcpy(fullpath + len, filename); - - file = CreateFileA(fullpath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); - if (file == INVALID_HANDLE_VALUE) - goto error; - - TRACE("Include file found at %s.\n", debugstr_a(fullpath)); - - size = GetFileSize(file, NULL); - if (size == INVALID_FILE_SIZE) - goto error; - buffer = heap_alloc(size); - if (!buffer) - goto error; - if (!ReadFile(file, buffer, size, &read, NULL) || read != size) - goto error; - - *bytes = size; - *data = buffer; - - heap_free(fullpath); - CloseHandle(file); - return S_OK; - -error: - heap_free(fullpath); - heap_free(buffer); - CloseHandle(file); - WARN("Returning E_FAIL.\n"); - return E_FAIL; -} - -static HRESULT WINAPI d3dcompiler_include_from_file_close(ID3DInclude *iface, const void *data) -{ - heap_free((void *)data); - return S_OK; -} - -const struct ID3DIncludeVtbl d3dcompiler_include_from_file_vtbl = -{ - d3dcompiler_include_from_file_open, - d3dcompiler_include_from_file_close -}; - -struct d3dcompiler_include_from_file -{ - ID3DInclude ID3DInclude_iface; -}; - HRESULT WINAPI D3DCompile2(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, UINT secondary_flags, const void *secondary_data, SIZE_T secondary_data_size, ID3DBlob **shader, ID3DBlob **error_messages) { - struct d3dcompiler_include_from_file include_from_file; HRESULT hr; TRACE("data %p, data_size %lu, filename %s, defines %p, include %p, entrypoint %s, " @@ -751,12 +757,6 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen if (shader) *shader = NULL; if (error_messages) *error_messages = NULL; - if (include == D3D_COMPILE_STANDARD_FILE_INCLUDE) - { - include_from_file.ID3DInclude_iface.lpVtbl = &d3dcompiler_include_from_file_vtbl; - include = &include_from_file.ID3DInclude_iface; - } - EnterCriticalSection(&wpp_mutex); hr = preprocess_shader(data, data_size, filename, defines, include, error_messages);