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;
/* IDirect3DStateBlock8 Interface follow: */
static HRESULT WINAPI IDirect3DStateBlock8Impl_GetDevice(IDirect3DStateBlock8 *iface, IDirect3DDevice8 **ppDevice) {
IDirect3DStateBlock8Impl *This = (IDirect3DStateBlock8Impl *)iface;
- TRACE("(%p) Relay\n", This);
- return IDirect3DResource8Impl_GetDevice((LPDIRECT3DRESOURCE8) This, ppDevice);
+ IWineD3DDevice *wined3d_device;
+ HRESULT hr;
+
+ TRACE("(%p) Relay\n", This);
+
+ EnterCriticalSection(&d3d8_cs);
+
+ hr = IWineD3DStateBlock_GetDevice(This->wineD3DStateBlock, &wined3d_device);
+ if (SUCCEEDED(hr))
+ {
+ IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
+ IWineD3DDevice_Release(wined3d_device);
+ }
+
+ LeaveCriticalSection(&d3d8_cs);
+
+ return hr;
}
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 =