d3d8: Cleanup the pixelshader handling code a bit.
Henri Verbeet
hverbeet at codeweavers.com
Tue Mar 24 04:09:22 CDT 2009
This mostly just reduces the nesting to something more sane.
---
dlls/d3d8/device.c | 81 +++++++++++++++++++++++++++++-----------------------
1 files changed, 45 insertions(+), 36 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index be6bce7..c1031b4 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -2122,7 +2122,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetIndices(LPDIRECT3DDEVICE8 iface, I
static HRESULT WINAPI IDirect3DDevice8Impl_CreatePixelShader(LPDIRECT3DDEVICE8 iface, CONST DWORD* pFunction, DWORD* ppShader) {
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
IDirect3DPixelShader8Impl *object;
- HRESULT hrc = D3D_OK;
+ DWORD handle;
+ HRESULT hr;
TRACE("(%p) : pFunction(%p), ppShader(%p)\n", This, pFunction, ppShader);
@@ -2130,36 +2131,42 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreatePixelShader(LPDIRECT3DDEVICE8 i
TRACE("(%p) Invalid call\n", This);
return D3DERR_INVALIDCALL;
}
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
- if (NULL == object) {
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
+ {
+ ERR("Failed to allocate memmory.\n");
return E_OUTOFMEMORY;
- } else {
- EnterCriticalSection(&d3d8_cs);
+ }
- object->ref = 1;
- object->lpVtbl = &Direct3DPixelShader8_Vtbl;
- hrc = IWineD3DDevice_CreatePixelShader(This->WineD3DDevice, pFunction, &object->wineD3DPixelShader , (IUnknown *)object);
- if (D3D_OK != hrc) {
- FIXME("(%p) call to IWineD3DDevice_CreatePixelShader failed\n", This);
- HeapFree(GetProcessHeap(), 0 , object);
- *ppShader = 0;
- } else {
- DWORD handle = d3d8_allocate_handle(&This->handle_table, object);
- if (handle == D3D8_INVALID_HANDLE)
- {
- ERR("Failed to allocate shader handle\n");
- IDirect3DVertexShader8_Release((IUnknown *)object);
- hrc = E_OUTOFMEMORY;
- } else {
- *ppShader = object->handle = handle + VS_HIGHESTFIXEDFXF + 1;
- TRACE("(%p) : returning %p (handle %#x)\n", This, object, *ppShader);
- }
- }
+ object->ref = 1;
+ object->lpVtbl = &Direct3DPixelShader8_Vtbl;
+
+ EnterCriticalSection(&d3d8_cs);
+ hr = IWineD3DDevice_CreatePixelShader(This->WineD3DDevice, pFunction,
+ &object->wineD3DPixelShader, (IUnknown *)object);
+ if (FAILED(hr))
+ {
LeaveCriticalSection(&d3d8_cs);
+ FIXME("(%p) call to IWineD3DDevice_CreatePixelShader failed\n", This);
+ HeapFree(GetProcessHeap(), 0 , object);
+ *ppShader = 0;
+ return hr;
}
- return hrc;
+ handle = d3d8_allocate_handle(&This->handle_table, object);
+ LeaveCriticalSection(&d3d8_cs);
+ if (handle == D3D8_INVALID_HANDLE)
+ {
+ ERR("Failed to allocate shader handle\n");
+ IDirect3DVertexShader8_Release((IUnknown *)object);
+ return E_OUTOFMEMORY;
+ }
+
+ *ppShader = object->handle = handle + VS_HIGHESTFIXEDFXF + 1;
+ TRACE("(%p) : returning %p (handle %#x)\n", This, object, *ppShader);
+
+ return hr;
}
static HRESULT WINAPI IDirect3DDevice8Impl_SetPixelShader(LPDIRECT3DDEVICE8 iface, DWORD pShader) {
@@ -2223,6 +2230,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShader(LPDIRECT3DDEVICE8 ifac
static HRESULT WINAPI IDirect3DDevice8Impl_DeletePixelShader(LPDIRECT3DDEVICE8 iface, DWORD pShader) {
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
IDirect3DPixelShader8Impl *shader;
+ IWineD3DPixelShader *cur = NULL;
TRACE("(%p) : pShader %#x\n", This, pShader);
@@ -2234,22 +2242,23 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeletePixelShader(LPDIRECT3DDEVICE8 i
WARN("Invalid handle (%#x) passed.\n", pShader);
LeaveCriticalSection(&d3d8_cs);
return D3DERR_INVALIDCALL;
- } else {
- IWineD3DPixelShader *cur = NULL;
+ }
- IWineD3DDevice_GetPixelShader(This->WineD3DDevice, &cur);
- if(cur) {
- if(cur == shader->wineD3DPixelShader) IDirect3DDevice8_SetPixelShader(iface, 0);
- IWineD3DPixelShader_Release(cur);
- }
+ IWineD3DDevice_GetPixelShader(This->WineD3DDevice, &cur);
- if (IUnknown_Release((IUnknown *)shader))
- {
- ERR("Shader %p has references left, this shouldn't happen.\n", shader);
- }
+ if (cur)
+ {
+ if (cur == shader->wineD3DPixelShader) IDirect3DDevice8_SetPixelShader(iface, 0);
+ IWineD3DPixelShader_Release(cur);
}
+
LeaveCriticalSection(&d3d8_cs);
+ if (IUnknown_Release((IUnknown *)shader))
+ {
+ ERR("Shader %p has references left, this shouldn't happen.\n", shader);
+ }
+
return D3D_OK;
}
--
1.6.0.6
--------------020302090404030105000907--
More information about the wine-patches
mailing list