Matteo Bruni : d3dx9: Correctly set parent_data for direct includes from the main file.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Jun 26 15:04:52 CDT 2014
Module: wine
Branch: master
Commit: d64ec66b416a9ee0ecff5a5a1387f67b1387fa7f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d64ec66b416a9ee0ecff5a5a1387f67b1387fa7f
Author: Matteo Bruni <mbruni at codeweavers.com>
Date: Thu Jun 26 19:52:33 2014 +0200
d3dx9: Correctly set parent_data for direct includes from the main file.
---
dlls/d3dx9_36/shader.c | 36 +++++++++++++++++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 68e7474..b36e7bb 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -219,6 +219,20 @@ HRESULT WINAPI D3DXAssembleShader(const char *data, UINT data_len, const D3DXMAC
return hr;
}
+static const void *main_file_data;
+
+static CRITICAL_SECTION from_file_mutex;
+static CRITICAL_SECTION_DEBUG from_file_mutex_debug =
+{
+ 0, 0, &from_file_mutex,
+ {
+ &from_file_mutex_debug.ProcessLocksList,
+ &from_file_mutex_debug.ProcessLocksList
+ },
+ 0, 0, {(DWORD_PTR)(__FILE__ ": from_file_mutex")}
+};
+static CRITICAL_SECTION from_file_mutex = {&from_file_mutex_debug, -1, 0, 0, 0, 0};
+
/* D3DXInclude private implementation, used to implement
* D3DXAssembleShaderFromFile() from D3DXAssembleShader(). */
/* To be able to correctly resolve include search paths we have to store the
@@ -233,8 +247,15 @@ static HRESULT WINAPI d3dincludefromfile_open(ID3DXInclude *iface, D3DXINCLUDE_T
HANDLE file;
UINT size;
- if(parent_data != NULL)
+ if (parent_data)
+ {
parent_name = *((const char **)parent_data - 1);
+ }
+ else
+ {
+ if (main_file_data)
+ parent_name = *((const char **)main_file_data - 1);
+ }
TRACE("Looking up for include file %s, parent %s\n", debugstr_a(filename), debugstr_a(parent_name));
@@ -265,6 +286,8 @@ static HRESULT WINAPI d3dincludefromfile_open(ID3DXInclude *iface, D3DXINCLUDE_T
goto error;
*data = buffer + 1;
+ if (!main_file_data)
+ main_file_data = *data;
CloseHandle(file);
return S_OK;
@@ -280,6 +303,8 @@ static HRESULT WINAPI d3dincludefromfile_close(ID3DXInclude *iface, const void *
{
HeapFree(GetProcessHeap(), 0, *((char **)data - 1));
HeapFree(GetProcessHeap(), 0, (char **)data - 1);
+ if (main_file_data == data)
+ main_file_data = NULL;
return S_OK;
}
@@ -339,9 +364,11 @@ HRESULT WINAPI D3DXAssembleShaderFromFileW(const WCHAR *filename, const D3DXMACR
return E_OUTOFMEMORY;
WideCharToMultiByte(CP_ACP, 0, filename, -1, filename_a, len, NULL, NULL);
+ EnterCriticalSection(&from_file_mutex);
hr = ID3DXInclude_Open(include, D3D_INCLUDE_LOCAL, filename_a, NULL, &buffer, &len);
if (FAILED(hr))
{
+ LeaveCriticalSection(&from_file_mutex);
HeapFree(GetProcessHeap(), 0, filename_a);
return D3DXERR_INVALIDDATA;
}
@@ -349,6 +376,7 @@ HRESULT WINAPI D3DXAssembleShaderFromFileW(const WCHAR *filename, const D3DXMACR
hr = D3DXAssembleShader(buffer, len, defines, include, flags, shader, error_messages);
ID3DXInclude_Close(include, buffer);
+ LeaveCriticalSection(&from_file_mutex);
HeapFree(GetProcessHeap(), 0, filename_a);
return hr;
}
@@ -471,9 +499,11 @@ HRESULT WINAPI D3DXCompileShaderFromFileW(const WCHAR *filename, const D3DXMACRO
return E_OUTOFMEMORY;
WideCharToMultiByte(CP_ACP, 0, filename, -1, filename_a, filename_len, NULL, NULL);
+ EnterCriticalSection(&from_file_mutex);
hr = ID3DXInclude_Open(include, D3D_INCLUDE_LOCAL, filename_a, NULL, &buffer, &len);
if (FAILED(hr))
{
+ LeaveCriticalSection(&from_file_mutex);
HeapFree(GetProcessHeap(), 0, filename_a);
return D3DXERR_INVALIDDATA;
}
@@ -487,6 +517,7 @@ HRESULT WINAPI D3DXCompileShaderFromFileW(const WCHAR *filename, const D3DXMACRO
constant_table);
ID3DXInclude_Close(include, buffer);
+ LeaveCriticalSection(&from_file_mutex);
HeapFree(GetProcessHeap(), 0, filename_a);
return hr;
}
@@ -591,9 +622,11 @@ HRESULT WINAPI D3DXPreprocessShaderFromFileW(const WCHAR *filename, const D3DXMA
return E_OUTOFMEMORY;
WideCharToMultiByte(CP_ACP, 0, filename, -1, filename_a, len, NULL, NULL);
+ EnterCriticalSection(&from_file_mutex);
hr = ID3DXInclude_Open(include, D3D_INCLUDE_LOCAL, filename_a, NULL, &buffer, &len);
if (FAILED(hr))
{
+ LeaveCriticalSection(&from_file_mutex);
HeapFree(GetProcessHeap(), 0, filename_a);
return D3DXERR_INVALIDDATA;
}
@@ -604,6 +637,7 @@ HRESULT WINAPI D3DXPreprocessShaderFromFileW(const WCHAR *filename, const D3DXMA
(ID3DBlob **)shader, (ID3DBlob **)error_messages);
ID3DXInclude_Close(include, buffer);
+ LeaveCriticalSection(&from_file_mutex);
HeapFree(GetProcessHeap(), 0, filename_a);
return hr;
}
More information about the wine-cvs
mailing list