d3d8: Cleanup the vertexshader handling code a bit.
Henri Verbeet
hverbeet at codeweavers.com
Tue Mar 24 04:09:22 CDT 2009
---
dlls/d3d8/device.c | 120 +++++++++++++++++++++++++++-------------------------
1 files changed, 62 insertions(+), 58 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index c1031b4..0e8c480 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -1879,75 +1879,78 @@ static IDirect3DVertexDeclaration8Impl *IDirect3DDevice8Impl_FindDecl(IDirect3DD
static HRESULT WINAPI IDirect3DDevice8Impl_SetVertexShader(LPDIRECT3DDEVICE8 iface, DWORD pShader) {
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
- HRESULT hrc = D3D_OK;
+ IDirect3DVertexShader8Impl *shader;
+ HRESULT hr;
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+
if (VS_HIGHESTFIXEDFXF >= pShader) {
TRACE("Setting FVF, %#x\n", pShader);
+
+ EnterCriticalSection(&d3d8_cs);
IWineD3DDevice_SetVertexDeclaration(This->WineD3DDevice,
IDirect3DDevice8Impl_FindDecl(This, pShader)->wined3d_vertex_declaration);
IWineD3DDevice_SetVertexShader(This->WineD3DDevice, NULL);
- } else {
- IDirect3DVertexShader8Impl *shader;
+ LeaveCriticalSection(&d3d8_cs);
+ return D3D_OK;
+ }
- TRACE("Setting shader\n");
+ TRACE("Setting shader\n");
- shader = d3d8_get_object(&This->handle_table, pShader - (VS_HIGHESTFIXEDFXF + 1));
- if (!shader)
- {
- WARN("Invalid handle (%#x) passed.\n", pShader);
- hrc = D3DERR_INVALIDCALL;
- }
- else
- {
- hrc = IWineD3DDevice_SetVertexDeclaration(This->WineD3DDevice,
- ((IDirect3DVertexDeclaration8Impl *)shader->vertex_declaration)->wined3d_vertex_declaration);
- if (SUCCEEDED(hrc))
- hrc = IWineD3DDevice_SetVertexShader(This->WineD3DDevice, shader->wineD3DVertexShader);
- }
+ EnterCriticalSection(&d3d8_cs);
+ shader = d3d8_get_object(&This->handle_table, pShader - (VS_HIGHESTFIXEDFXF + 1));
+ if (!shader)
+ {
+ WARN("Invalid handle (%#x) passed.\n", pShader);
+ LeaveCriticalSection(&d3d8_cs);
+ return D3DERR_INVALIDCALL;
}
- TRACE("(%p) : returning hr(%u)\n", This, hrc);
+
+ hr = IWineD3DDevice_SetVertexDeclaration(This->WineD3DDevice,
+ ((IDirect3DVertexDeclaration8Impl *)shader->vertex_declaration)->wined3d_vertex_declaration);
+ if (SUCCEEDED(hr)) hr = IWineD3DDevice_SetVertexShader(This->WineD3DDevice, shader->wineD3DVertexShader);
LeaveCriticalSection(&d3d8_cs);
- return hrc;
+ TRACE("Returning hr %#x\n", hr);
+
+ return hr;
}
static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShader(LPDIRECT3DDEVICE8 iface, DWORD* ppShader) {
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
IWineD3DVertexDeclaration *wined3d_declaration;
+ IDirect3DVertexDeclaration8 *d3d8_declaration;
HRESULT hrc;
TRACE("(%p) : Relay device@%p\n", This, This->WineD3DDevice);
EnterCriticalSection(&d3d8_cs);
hrc = IWineD3DDevice_GetVertexDeclaration(This->WineD3DDevice, &wined3d_declaration);
- if (SUCCEEDED(hrc))
- {
- if (wined3d_declaration)
- {
- IDirect3DVertexDeclaration8 *d3d8_declaration;
- hrc = IWineD3DVertexDeclaration_GetParent(wined3d_declaration, (IUnknown **)&d3d8_declaration);
- IWineD3DVertexDeclaration_Release(wined3d_declaration);
- if (SUCCEEDED(hrc))
- {
- *ppShader = ((IDirect3DVertexDeclaration8Impl *)d3d8_declaration)->shader_handle;
- IDirect3DVertexDeclaration8_Release(d3d8_declaration);
- }
- }
- else
- {
- *ppShader = 0;
- hrc = D3D_OK;
- }
- }
- else
+ if (FAILED(hrc))
{
+ LeaveCriticalSection(&d3d8_cs);
WARN("(%p) : Call to IWineD3DDevice_GetVertexDeclaration failed %#x (device %p)\n",
This, hrc, This->WineD3DDevice);
+ return hrc;
}
- TRACE("(%p) : returning %#x\n", This, *ppShader);
+
+ if (!wined3d_declaration)
+ {
+ LeaveCriticalSection(&d3d8_cs);
+ *ppShader = 0;
+ return D3D_OK;
+ }
+
+ hrc = IWineD3DVertexDeclaration_GetParent(wined3d_declaration, (IUnknown **)&d3d8_declaration);
+ IWineD3DVertexDeclaration_Release(wined3d_declaration);
LeaveCriticalSection(&d3d8_cs);
+ if (SUCCEEDED(hrc))
+ {
+ *ppShader = ((IDirect3DVertexDeclaration8Impl *)d3d8_declaration)->shader_handle;
+ IDirect3DVertexDeclaration8_Release(d3d8_declaration);
+ }
+
+ TRACE("(%p) : returning %#x\n", This, *ppShader);
return hrc;
}
@@ -1955,6 +1958,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShader(LPDIRECT3DDEVICE8 ifa
static HRESULT WINAPI IDirect3DDevice8Impl_DeleteVertexShader(LPDIRECT3DDEVICE8 iface, DWORD pShader) {
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
IDirect3DVertexShader8Impl *shader;
+ IWineD3DVertexShader *cur = NULL;
TRACE("(%p) : pShader %#x\n", This, pShader);
@@ -1966,22 +1970,23 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeleteVertexShader(LPDIRECT3DDEVICE
WARN("Invalid handle (%#x) passed.\n", pShader);
LeaveCriticalSection(&d3d8_cs);
return D3DERR_INVALIDCALL;
- } else {
- IWineD3DVertexShader *cur = NULL;
+ }
- IWineD3DDevice_GetVertexShader(This->WineD3DDevice, &cur);
- if(cur) {
- if(cur == shader->wineD3DVertexShader) IDirect3DDevice8_SetVertexShader(iface, 0);
- IWineD3DVertexShader_Release(cur);
- }
+ IWineD3DDevice_GetVertexShader(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->wineD3DVertexShader) IDirect3DDevice8_SetVertexShader(iface, 0);
+ IWineD3DVertexShader_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;
}
@@ -2060,16 +2065,15 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderFunction(LPDIRECT3DDEV
return D3DERR_INVALIDCALL;
}
- if (shader->wineD3DVertexShader)
- {
- hr = IWineD3DVertexShader_GetFunction(shader->wineD3DVertexShader, pData, pSizeOfData);
- }
- else
+ if (!shader->wineD3DVertexShader)
{
+ LeaveCriticalSection(&d3d8_cs);
*pSizeOfData = 0;
- hr = D3D_OK;
+ return D3D_OK;
}
+ hr = IWineD3DVertexShader_GetFunction(shader->wineD3DVertexShader, pData, pSizeOfData);
+
LeaveCriticalSection(&d3d8_cs);
return hr;
}
--
1.6.0.6
--------------000003020501010005020700--
More information about the wine-patches
mailing list