d3dcompiler: Handle D3D_COMPILE_STANDARD_FILE_INCLUDE in preprocess_shader().
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Matteo Bruni <mbruni@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
e44bd0e03f
commit
72d6654c73
|
@ -481,13 +481,95 @@ int wpp_parse( const char *input, FILE *output )
|
||||||
return ret;
|
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,
|
static HRESULT preprocess_shader(const void *data, SIZE_T data_size, const char *filename,
|
||||||
const D3D_SHADER_MACRO *defines, ID3DInclude *include, ID3DBlob **error_messages)
|
const D3D_SHADER_MACRO *defines, ID3DInclude *include, ID3DBlob **error_messages)
|
||||||
{
|
{
|
||||||
|
struct d3dcompiler_include_from_file include_from_file;
|
||||||
int ret;
|
int ret;
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
const D3D_SHADER_MACRO *def = defines;
|
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)
|
if (def != NULL)
|
||||||
{
|
{
|
||||||
while (def->Name != NULL)
|
while (def->Name != NULL)
|
||||||
|
@ -654,88 +736,12 @@ HRESULT WINAPI D3DAssemble(const void *data, SIZE_T datasize, const char *filena
|
||||||
return hr;
|
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,
|
HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filename,
|
||||||
const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint,
|
const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint,
|
||||||
const char *target, UINT sflags, UINT eflags, UINT secondary_flags,
|
const char *target, UINT sflags, UINT eflags, UINT secondary_flags,
|
||||||
const void *secondary_data, SIZE_T secondary_data_size, ID3DBlob **shader,
|
const void *secondary_data, SIZE_T secondary_data_size, ID3DBlob **shader,
|
||||||
ID3DBlob **error_messages)
|
ID3DBlob **error_messages)
|
||||||
{
|
{
|
||||||
struct d3dcompiler_include_from_file include_from_file;
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("data %p, data_size %lu, filename %s, defines %p, include %p, entrypoint %s, "
|
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 (shader) *shader = NULL;
|
||||||
if (error_messages) *error_messages = 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);
|
EnterCriticalSection(&wpp_mutex);
|
||||||
|
|
||||||
hr = preprocess_shader(data, data_size, filename, defines, include, error_messages);
|
hr = preprocess_shader(data, data_size, filename, defines, include, error_messages);
|
||||||
|
|
Loading…
Reference in New Issue