From c35b85a78d0fef3bcb1f1cf89072ce9759e1d85f Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Wed, 1 Sep 2010 18:41:02 +0200 Subject: [PATCH] d3d9: Merge vertex and pixel shader implementations into a single file. --- dlls/d3d9/Makefile.in | 3 +- dlls/d3d9/pixelshader.c | 152 -------------------------- dlls/d3d9/shader.c | 278 +++++++++++++++++++++++++++++++++++++++++++++++ dlls/d3d9/vertexshader.c | 152 -------------------------- 4 files changed, 279 insertions(+), 306 deletions(-) delete mode 100644 dlls/d3d9/pixelshader.c create mode 100644 dlls/d3d9/shader.c delete mode 100644 dlls/d3d9/vertexshader.c diff --git a/dlls/d3d9/Makefile.in b/dlls/d3d9/Makefile.in index aa2fdd8cf6d..8ed000ad9f5 100644 --- a/dlls/d3d9/Makefile.in +++ b/dlls/d3d9/Makefile.in @@ -12,15 +12,14 @@ C_SRCS = \ device.c \ directx.c \ indexbuffer.c \ - pixelshader.c \ query.c \ + shader.c \ stateblock.c \ surface.c \ swapchain.c \ texture.c \ vertexbuffer.c \ vertexdeclaration.c \ - vertexshader.c \ volume.c \ volumetexture.c diff --git a/dlls/d3d9/pixelshader.c b/dlls/d3d9/pixelshader.c deleted file mode 100644 index 1d4fd95d482..00000000000 --- a/dlls/d3d9/pixelshader.c +++ /dev/null @@ -1,152 +0,0 @@ -/* - * IDirect3DPixelShader9 implementation - * - * Copyright 2002-2003 Jason Edmeades - * Raphael Junqueira - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d9_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d9); - -/* IDirect3DPixelShader9 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DPixelShader9Impl_QueryInterface(LPDIRECT3DPIXELSHADER9 iface, REFIID riid, LPVOID* ppobj) { - IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DPixelShader9)) { - IDirect3DPixelShader9_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DPixelShader9Impl_AddRef(LPDIRECT3DPIXELSHADER9 iface) { - IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - IDirect3DDevice9Ex_AddRef(This->parentDevice); - wined3d_mutex_lock(); - IWineD3DPixelShader_AddRef(This->wineD3DPixelShader); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI IDirect3DPixelShader9Impl_Release(LPDIRECT3DPIXELSHADER9 iface) { - IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - IDirect3DDevice9Ex *parentDevice = This->parentDevice; - - wined3d_mutex_lock(); - IWineD3DPixelShader_Release(This->wineD3DPixelShader); - wined3d_mutex_unlock(); - - /* Release the device last, as it may cause the device to be destroyed. */ - IDirect3DDevice9Ex_Release(parentDevice); - } - return ref; -} - -/* IDirect3DPixelShader9 Interface follow: */ -static HRESULT WINAPI IDirect3DPixelShader9Impl_GetDevice(IDirect3DPixelShader9 *iface, IDirect3DDevice9 **device) -{ - IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - - TRACE("iface %p, device %p.\n", iface, device); - - *device = (IDirect3DDevice9 *)This->parentDevice; - IDirect3DDevice9_AddRef(*device); - - TRACE("Returning device %p.\n", *device); - - return D3D_OK; -} - -static HRESULT WINAPI IDirect3DPixelShader9Impl_GetFunction(LPDIRECT3DPIXELSHADER9 iface, VOID* pData, UINT* pSizeOfData) { - IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, data %p, data_size %p.\n", iface, pData, pSizeOfData); - - wined3d_mutex_lock(); - hr = IWineD3DPixelShader_GetFunction(This->wineD3DPixelShader, pData, pSizeOfData); - wined3d_mutex_unlock(); - - return hr; -} - - -static const IDirect3DPixelShader9Vtbl Direct3DPixelShader9_Vtbl = -{ - /* IUnknown */ - IDirect3DPixelShader9Impl_QueryInterface, - IDirect3DPixelShader9Impl_AddRef, - IDirect3DPixelShader9Impl_Release, - /* IDirect3DPixelShader9 */ - IDirect3DPixelShader9Impl_GetDevice, - IDirect3DPixelShader9Impl_GetFunction -}; - -static void STDMETHODCALLTYPE d3d9_pixelshader_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d9_pixelshader_wined3d_parent_ops = -{ - d3d9_pixelshader_wined3d_object_destroyed, -}; - -HRESULT pixelshader_init(IDirect3DPixelShader9Impl *shader, IDirect3DDevice9Impl *device, const DWORD *byte_code) -{ - HRESULT hr; - - shader->ref = 1; - shader->lpVtbl = &Direct3DPixelShader9_Vtbl; - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreatePixelShader(device->WineD3DDevice, byte_code, NULL, shader, - &d3d9_pixelshader_wined3d_parent_ops, &shader->wineD3DPixelShader); - wined3d_mutex_unlock(); - if (FAILED(hr)) - { - WARN("Failed to created wined3d pixel shader, hr %#x.\n", hr); - return hr; - } - - shader->parentDevice = (IDirect3DDevice9Ex *)device; - IDirect3DDevice9Ex_AddRef(shader->parentDevice); - - return D3D_OK; -} diff --git a/dlls/d3d9/shader.c b/dlls/d3d9/shader.c new file mode 100644 index 00000000000..c6656e524c3 --- /dev/null +++ b/dlls/d3d9/shader.c @@ -0,0 +1,278 @@ +/* + * Copyright 2002-2003 Jason Edmeades + * Raphael Junqueira + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "d3d9_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d9); + +static HRESULT WINAPI d3d9_vertexshader_QueryInterface(IDirect3DVertexShader9 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DVertexShader9) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IDirect3DVertexShader9_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d9_vertexshader_AddRef(IDirect3DVertexShader9 *iface) +{ + IDirect3DVertexShader9Impl *shader = (IDirect3DVertexShader9Impl *)iface; + ULONG refcount = InterlockedIncrement(&shader->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1) + { + IDirect3DDevice9Ex_AddRef(shader->parentDevice); + wined3d_mutex_lock(); + IWineD3DVertexShader_AddRef(shader->wineD3DVertexShader); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static ULONG WINAPI d3d9_vertexshader_Release(IDirect3DVertexShader9 *iface) +{ + IDirect3DVertexShader9Impl *shader = (IDirect3DVertexShader9Impl *)iface; + ULONG refcount = InterlockedDecrement(&shader->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + IDirect3DDevice9Ex *device = shader->parentDevice; + + wined3d_mutex_lock(); + IWineD3DVertexShader_Release(shader->wineD3DVertexShader); + wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice9Ex_Release(device); + } + + return refcount; +} + +static HRESULT WINAPI d3d9_vertexshader_GetDevice(IDirect3DVertexShader9 *iface, IDirect3DDevice9 **device) +{ + TRACE("iface %p, device %p.\n", iface, device); + + *device = (IDirect3DDevice9 *)((IDirect3DVertexShader9Impl *)iface)->parentDevice; + IDirect3DDevice9_AddRef(*device); + + TRACE("Returning device %p.\n", *device); + + return D3D_OK; +} + +static HRESULT WINAPI d3d9_vertexshader_GetFunction(IDirect3DVertexShader9 *iface, + void *data, UINT *data_size) +{ + HRESULT hr; + + TRACE("iface %p, data %p, data_size %p.\n", iface, data, data_size); + + wined3d_mutex_lock(); + hr = IWineD3DVertexShader_GetFunction(((IDirect3DVertexShader9Impl *)iface)->wineD3DVertexShader, data, data_size); + wined3d_mutex_unlock(); + + return hr; +} + +static const IDirect3DVertexShader9Vtbl d3d9_vertexshader_vtbl = +{ + /* IUnknown */ + d3d9_vertexshader_QueryInterface, + d3d9_vertexshader_AddRef, + d3d9_vertexshader_Release, + /* IDirect3DVertexShader9 */ + d3d9_vertexshader_GetDevice, + d3d9_vertexshader_GetFunction, +}; + +static void STDMETHODCALLTYPE d3d9_vertexshader_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d9_vertexshader_wined3d_parent_ops = +{ + d3d9_vertexshader_wined3d_object_destroyed, +}; + +HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader, IDirect3DDevice9Impl *device, const DWORD *byte_code) +{ + HRESULT hr; + + shader->ref = 1; + shader->lpVtbl = &d3d9_vertexshader_vtbl; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateVertexShader(device->WineD3DDevice, byte_code, NULL, + shader, &d3d9_vertexshader_wined3d_parent_ops, &shader->wineD3DVertexShader); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr); + return hr; + } + + shader->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(shader->parentDevice); + + return D3D_OK; +} + +static HRESULT WINAPI d3d9_pixelshader_QueryInterface(IDirect3DPixelShader9 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DPixelShader9) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IDirect3DPixelShader9_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d9_pixelshader_AddRef(IDirect3DPixelShader9 *iface) +{ + IDirect3DPixelShader9Impl *shader = (IDirect3DPixelShader9Impl *)iface; + ULONG refcount = InterlockedIncrement(&shader->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1) + { + IDirect3DDevice9Ex_AddRef(shader->parentDevice); + wined3d_mutex_lock(); + IWineD3DPixelShader_AddRef(shader->wineD3DPixelShader); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static ULONG WINAPI d3d9_pixelshader_Release(IDirect3DPixelShader9 *iface) +{ + IDirect3DPixelShader9Impl *shader = (IDirect3DPixelShader9Impl *)iface; + ULONG refcount = InterlockedDecrement(&shader->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + IDirect3DDevice9Ex *device = shader->parentDevice; + + wined3d_mutex_lock(); + IWineD3DPixelShader_Release(shader->wineD3DPixelShader); + wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice9Ex_Release(device); + } + + return refcount; +} + +static HRESULT WINAPI d3d9_pixelshader_GetDevice(IDirect3DPixelShader9 *iface, IDirect3DDevice9 **device) +{ + TRACE("iface %p, device %p.\n", iface, device); + + *device = (IDirect3DDevice9 *)((IDirect3DPixelShader9Impl *)iface)->parentDevice; + IDirect3DDevice9_AddRef(*device); + + TRACE("Returning device %p.\n", *device); + + return D3D_OK; +} + +static HRESULT WINAPI d3d9_pixelshader_GetFunction(IDirect3DPixelShader9 *iface, void *data, UINT *data_size) +{ + HRESULT hr; + + TRACE("iface %p, data %p, data_size %p.\n", iface, data, data_size); + + wined3d_mutex_lock(); + hr = IWineD3DPixelShader_GetFunction(((IDirect3DPixelShader9Impl *)iface)->wineD3DPixelShader, data, data_size); + wined3d_mutex_unlock(); + + return hr; +} + +static const IDirect3DPixelShader9Vtbl d3d9_pixelshader_vtbl = +{ + /* IUnknown */ + d3d9_pixelshader_QueryInterface, + d3d9_pixelshader_AddRef, + d3d9_pixelshader_Release, + /* IDirect3DPixelShader9 */ + d3d9_pixelshader_GetDevice, + d3d9_pixelshader_GetFunction, +}; + +static void STDMETHODCALLTYPE d3d9_pixelshader_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d9_pixelshader_wined3d_parent_ops = +{ + d3d9_pixelshader_wined3d_object_destroyed, +}; + +HRESULT pixelshader_init(IDirect3DPixelShader9Impl *shader, IDirect3DDevice9Impl *device, const DWORD *byte_code) +{ + HRESULT hr; + + shader->ref = 1; + shader->lpVtbl = &d3d9_pixelshader_vtbl; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreatePixelShader(device->WineD3DDevice, byte_code, NULL, shader, + &d3d9_pixelshader_wined3d_parent_ops, &shader->wineD3DPixelShader); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to created wined3d pixel shader, hr %#x.\n", hr); + return hr; + } + + shader->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(shader->parentDevice); + + return D3D_OK; +} diff --git a/dlls/d3d9/vertexshader.c b/dlls/d3d9/vertexshader.c deleted file mode 100644 index 1ff168b9dc5..00000000000 --- a/dlls/d3d9/vertexshader.c +++ /dev/null @@ -1,152 +0,0 @@ -/* - * IDirect3DVertexShader9 implementation - * - * Copyright 2002-2003 Jason Edmeades - * Raphael Junqueira - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d9_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d9); - -/* IDirect3DVertexShader9 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DVertexShader9Impl_QueryInterface(LPDIRECT3DVERTEXSHADER9 iface, REFIID riid, LPVOID* ppobj) { - IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DVertexShader9)) { - IDirect3DVertexShader9_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DVertexShader9Impl_AddRef(LPDIRECT3DVERTEXSHADER9 iface) { - IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - IDirect3DDevice9Ex_AddRef(This->parentDevice); - wined3d_mutex_lock(); - IWineD3DVertexShader_AddRef(This->wineD3DVertexShader); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI IDirect3DVertexShader9Impl_Release(LPDIRECT3DVERTEXSHADER9 iface) { - IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - IDirect3DDevice9Ex *parentDevice = This->parentDevice; - - wined3d_mutex_lock(); - IWineD3DVertexShader_Release(This->wineD3DVertexShader); - wined3d_mutex_unlock(); - - /* Release the device last, as it may cause the device to be destroyed. */ - IDirect3DDevice9Ex_Release(parentDevice); - } - return ref; -} - -/* IDirect3DVertexShader9 Interface follow: */ -static HRESULT WINAPI IDirect3DVertexShader9Impl_GetDevice(IDirect3DVertexShader9 *iface, IDirect3DDevice9 **device) -{ - IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - - TRACE("iface %p, device %p.\n", iface, device); - - *device = (IDirect3DDevice9 *)This->parentDevice; - IDirect3DDevice9_AddRef(*device); - - TRACE("Returning device %p.\n", *device); - - return D3D_OK; -} - -static HRESULT WINAPI IDirect3DVertexShader9Impl_GetFunction(LPDIRECT3DVERTEXSHADER9 iface, VOID* pData, UINT* pSizeOfData) { - IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, data %p, data_size %p.\n", iface, pData, pSizeOfData); - - wined3d_mutex_lock(); - hr = IWineD3DVertexShader_GetFunction(This->wineD3DVertexShader, pData, pSizeOfData); - wined3d_mutex_unlock(); - - return hr; -} - - -static const IDirect3DVertexShader9Vtbl Direct3DVertexShader9_Vtbl = -{ - /* IUnknown */ - IDirect3DVertexShader9Impl_QueryInterface, - IDirect3DVertexShader9Impl_AddRef, - IDirect3DVertexShader9Impl_Release, - /* IDirect3DVertexShader9 */ - IDirect3DVertexShader9Impl_GetDevice, - IDirect3DVertexShader9Impl_GetFunction -}; - -static void STDMETHODCALLTYPE d3d9_vertexshader_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d9_vertexshader_wined3d_parent_ops = -{ - d3d9_vertexshader_wined3d_object_destroyed, -}; - -HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader, IDirect3DDevice9Impl *device, const DWORD *byte_code) -{ - HRESULT hr; - - shader->ref = 1; - shader->lpVtbl = &Direct3DVertexShader9_Vtbl; - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateVertexShader(device->WineD3DDevice, byte_code, NULL, - shader, &d3d9_vertexshader_wined3d_parent_ops, &shader->wineD3DVertexShader); - wined3d_mutex_unlock(); - if (FAILED(hr)) - { - WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr); - return hr; - } - - shader->parentDevice = (IDirect3DDevice9Ex *)device; - IDirect3DDevice9Ex_AddRef(shader->parentDevice); - - return D3D_OK; -} -- 2.11.4.GIT