d3d8: Fix locking.
Henri Verbeet
hverbeet at codeweavers.com
Mon Mar 23 02:30:16 CDT 2009
---
dlls/d3d8/device.c | 19 +++++--------------
dlls/d3d8/directx.c | 4 ++++
dlls/d3d8/pixelshader.c | 2 ++
dlls/d3d8/stateblock.c | 28 ++++++++++++++++++++++++----
dlls/d3d8/vertexdeclaration.c | 2 ++
dlls/d3d8/vertexshader.c | 7 ++++++-
6 files changed, 43 insertions(+), 19 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index d5f71fc..119d33d 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -820,10 +820,11 @@ static HRESULT IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT
TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p\n", This, Width, Height, Format, *ppSurface);
- /* Not called from the VTable, no locking needed */
+ EnterCriticalSection(&d3d8_cs);
hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, wined3dformat_from_d3dformat(Format),
Lockable, Discard, Level, &object->wineD3DSurface, Type, Usage & WINED3DUSAGE_MASK,
(WINED3DPOOL)Pool, MultiSample,MultisampleQuality, NULL, SURFACE_OPENGL, (IUnknown *)object);
+ LeaveCriticalSection(&d3d8_cs);
if (hrc != D3D_OK || NULL == object->wineD3DSurface) {
/* free up object */
FIXME("(%p) call to IWineD3DDevice_CreateSurface failed\n", This);
@@ -841,9 +842,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8
HRESULT hr;
TRACE("Relay\n");
- EnterCriticalSection(&d3d8_cs);
hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, Lockable, FALSE /* Discard */, 0 /* Level */ , ppSurface, D3DRTYPE_SURFACE, D3DUSAGE_RENDERTARGET, D3DPOOL_DEFAULT, MultiSample, 0);
- LeaveCriticalSection(&d3d8_cs);
return hr;
}
@@ -852,11 +851,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DD
TRACE("Relay\n");
/* TODO: Verify that Discard is false */
- EnterCriticalSection(&d3d8_cs);
hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, FALSE, 0 /* Level */
,ppSurface, D3DRTYPE_SURFACE, D3DUSAGE_DEPTHSTENCIL,
D3DPOOL_DEFAULT, MultiSample, 0);
- LeaveCriticalSection(&d3d8_cs);
return hr;
}
@@ -865,10 +862,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8
HRESULT hr;
TRACE("Relay\n");
- EnterCriticalSection(&d3d8_cs);
hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Loackable */ , FALSE /*Discard*/ , 0 /* Level */ , ppSurface,
D3DRTYPE_SURFACE, 0 /* Usage (undefined/none) */ , D3DPOOL_SYSTEMMEM, D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */);
- LeaveCriticalSection(&d3d8_cs);
return hr;
}
@@ -894,13 +889,13 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, ID
winedesc.Width = &srcWidth;
winedesc.Height = &srcHeight;
winedesc.Size = &srcSize;
+ EnterCriticalSection(&d3d8_cs);
IWineD3DSurface_GetDesc(Source->wineD3DSurface, &winedesc);
winedesc.Format = &destFormat;
winedesc.Width = &destWidth;
winedesc.Height = &destHeight;
winedesc.Size = NULL;
- EnterCriticalSection(&d3d8_cs);
IWineD3DSurface_GetDesc(Dest->wineD3DSurface, &winedesc);
/* Check that the source and destination formats match */
@@ -1759,16 +1754,15 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(LPDIRECT3DDEVICE8
object->ref = 1;
object->lpVtbl = &Direct3DVertexShader8_Vtbl;
- EnterCriticalSection(&d3d8_cs);
hrc = IDirect3DDevice8Impl_CreateVertexDeclaration(iface, pDeclaration, &object->vertex_declaration);
if (FAILED(hrc)) {
ERR("(%p) : IDirect3DDeviceImpl_CreateVertexDeclaration call failed\n", This);
- LeaveCriticalSection(&d3d8_cs);
HeapFree(GetProcessHeap(), 0, object);
*ppShader = 0;
return D3DERR_INVALIDCALL;
}
+ EnterCriticalSection(&d3d8_cs);
handle = d3d8_allocate_handle(&This->handle_table, object);
if (handle == D3D8_INVALID_HANDLE)
{
@@ -2023,10 +2017,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderDeclaration(LPDIRECT3D
EnterCriticalSection(&d3d8_cs);
shader = d3d8_get_object(&This->handle_table, pVertexShader - (VS_HIGHESTFIXEDFXF + 1));
+ LeaveCriticalSection(&d3d8_cs);
if (!shader)
{
WARN("Invalid handle (%#x) passed.\n", pVertexShader);
- LeaveCriticalSection(&d3d8_cs);
return D3DERR_INVALIDCALL;
}
declaration = (IDirect3DVertexDeclaration8Impl *)shader->vertex_declaration;
@@ -2034,7 +2028,6 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderDeclaration(LPDIRECT3D
/* If pData is NULL, we just return the required size of the buffer. */
if (!pData) {
*pSizeOfData = declaration->elements_size;
- LeaveCriticalSection(&d3d8_cs);
return D3D_OK;
}
@@ -2042,12 +2035,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderDeclaration(LPDIRECT3D
* we should write the required size and return D3DERR_MOREDATA.
* That's not actually true. */
if (*pSizeOfData < declaration->elements_size) {
- LeaveCriticalSection(&d3d8_cs);
return D3DERR_INVALIDCALL;
}
CopyMemory(pData, declaration->elements, declaration->elements_size);
- LeaveCriticalSection(&d3d8_cs);
return D3D_OK;
}
diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c
index b87b26d..45d914b 100644
--- a/dlls/d3d8/directx.c
+++ b/dlls/d3d8/directx.c
@@ -71,7 +71,9 @@ static ULONG WINAPI IDirect3D8Impl_Release(LPDIRECT3D8 iface) {
if (ref == 0) {
TRACE("Releasing wined3d %p\n", This->WineD3D);
+ EnterCriticalSection(&d3d8_cs);
IWineD3D_Release(This->WineD3D);
+ LeaveCriticalSection(&d3d8_cs);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -389,7 +391,9 @@ static HRESULT WINAPI IDirect3D8Impl_CreateDevice(LPDIRECT3D8 iface, UINT Adapte
object->decls = HeapAlloc(GetProcessHeap(), 0, object->declArraySize * sizeof(*object->decls));
if(!object->decls) {
ERR("Out of memory\n");
+ EnterCriticalSection(&d3d8_cs);
IWineD3DDevice_Release(object->WineD3DDevice);
+ LeaveCriticalSection(&d3d8_cs);
HeapFree(GetProcessHeap(), 0, object);
*ppReturnedDeviceInterface = NULL;
hr = E_OUTOFMEMORY;
diff --git a/dlls/d3d8/pixelshader.c b/dlls/d3d8/pixelshader.c
index 5cfb0ca..ae8d15f 100644
--- a/dlls/d3d8/pixelshader.c
+++ b/dlls/d3d8/pixelshader.c
@@ -56,7 +56,9 @@ static ULONG WINAPI IDirect3DPixelShader8Impl_Release(IDirect3DPixelShader8 * if
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
+ EnterCriticalSection(&d3d8_cs);
IWineD3DPixelShader_Release(This->wineD3DPixelShader);
+ LeaveCriticalSection(&d3d8_cs);
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
diff --git a/dlls/d3d8/stateblock.c b/dlls/d3d8/stateblock.c
index cb9958a..ace9211 100644
--- a/dlls/d3d8/stateblock.c
+++ b/dlls/d3d8/stateblock.c
@@ -58,7 +58,9 @@ static ULONG WINAPI IDirect3DStateBlock8Impl_Release(IDirect3DStateBlock8 *iface
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
+ EnterCriticalSection(&d3d8_cs);
IWineD3DStateBlock_Release(This->wineD3DStateBlock);
+ LeaveCriticalSection(&d3d8_cs);
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
@@ -88,14 +90,32 @@ static HRESULT WINAPI IDirect3DStateBlock8Impl_GetDevice(IDirect3DStateBlock8 *i
static HRESULT WINAPI IDirect3DStateBlock8Impl_Capture(IDirect3DStateBlock8 *iface) {
IDirect3DStateBlock8Impl *This = (IDirect3DStateBlock8Impl *)iface;
- TRACE("(%p) Relay\n", This);
- return IWineD3DStateBlock_Capture(This->wineD3DStateBlock);
+ HRESULT hr;
+
+ TRACE("(%p) Relay\n", This);
+
+ EnterCriticalSection(&d3d8_cs);
+
+ hr = IWineD3DStateBlock_Capture(This->wineD3DStateBlock);
+
+ LeaveCriticalSection(&d3d8_cs);
+
+ return hr;
}
static HRESULT WINAPI IDirect3DStateBlock8Impl_Apply(IDirect3DStateBlock8 *iface) {
IDirect3DStateBlock8Impl *This = (IDirect3DStateBlock8Impl *)iface;
- TRACE("(%p) Relay\n", This);
- return IWineD3DStateBlock_Apply(This->wineD3DStateBlock);
+ HRESULT hr;
+
+ TRACE("(%p) Relay\n", This);
+
+ EnterCriticalSection(&d3d8_cs);
+
+ hr = IWineD3DStateBlock_Apply(This->wineD3DStateBlock);
+
+ LeaveCriticalSection(&d3d8_cs);
+
+ return hr;
}
const IDirect3DStateBlock8Vtbl Direct3DStateBlock8_Vtbl =
diff --git a/dlls/d3d8/vertexdeclaration.c b/dlls/d3d8/vertexdeclaration.c
index debeca0..46957d0 100644
--- a/dlls/d3d8/vertexdeclaration.c
+++ b/dlls/d3d8/vertexdeclaration.c
@@ -61,7 +61,9 @@ static ULONG WINAPI IDirect3DVertexDeclaration8Impl_Release(IDirect3DVertexDecla
TRACE("(%p) : Releasing to %d\n", This, ref_count);
if (!ref_count) {
+ EnterCriticalSection(&d3d8_cs);
IWineD3DVertexDeclaration_Release(This->wined3d_vertex_declaration);
+ LeaveCriticalSection(&d3d8_cs);
HeapFree(GetProcessHeap(), 0, This->elements);
HeapFree(GetProcessHeap(), 0, This);
}
diff --git a/dlls/d3d8/vertexshader.c b/dlls/d3d8/vertexshader.c
index 8cd822b..4ea8b52 100644
--- a/dlls/d3d8/vertexshader.c
+++ b/dlls/d3d8/vertexshader.c
@@ -57,7 +57,12 @@ static ULONG WINAPI IDirect3DVertexShader8Impl_Release(IDirect3DVertexShader8 *i
if (ref == 0) {
IDirect3DVertexDeclaration8_Release(This->vertex_declaration);
- if (This->wineD3DVertexShader) IWineD3DVertexShader_Release(This->wineD3DVertexShader);
+ if (This->wineD3DVertexShader)
+ {
+ EnterCriticalSection(&d3d8_cs);
+ IWineD3DVertexShader_Release(This->wineD3DVertexShader);
+ LeaveCriticalSection(&d3d8_cs);
+ }
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
--
1.6.0.6
--------------030108080403060406080608--
More information about the wine-patches
mailing list