From 483b17d410c1e9a323c9517d4323ec84a79ad995 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 24 Jan 2012 21:47:47 +0100 Subject: [PATCH] d3d8: Remove COM from the vertex shader implementation. --- dlls/d3d8/d3d8_private.h | 34 +++----------------- dlls/d3d8/device.c | 17 +++++----- dlls/d3d8/shader.c | 81 +++++++----------------------------------------- 3 files changed, 22 insertions(+), 110 deletions(-) diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h index 115db697c2a..fb09314c9e1 100644 --- a/dlls/d3d8/d3d8_private.h +++ b/dlls/d3d8/d3d8_private.h @@ -111,7 +111,6 @@ typedef struct IDirect3DSurface8Impl IDirect3DSurface8Impl; typedef struct IDirect3DSwapChain8Impl IDirect3DSwapChain8Impl; typedef struct IDirect3DVolume8Impl IDirect3DVolume8Impl; typedef struct IDirect3DVertexBuffer8Impl IDirect3DVertexBuffer8Impl; -typedef struct IDirect3DVertexShader8Impl IDirect3DVertexShader8Impl; /* =========================================================================== The interfaces themselves @@ -366,9 +365,6 @@ struct IDirect3DVolumeTexture8Impl HRESULT volumetexture_init(IDirect3DVolumeTexture8Impl *texture, IDirect3DDevice8Impl *device, UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; -DEFINE_GUID(IID_IDirect3DVertexShader8, -0xefc5557e, 0x6265, 0x4613, 0x8a, 0x94, 0x43, 0x85, 0x78, 0x89, 0xeb, 0x36); - DEFINE_GUID(IID_IDirect3DPixelShader8, 0x6d3bdbdc, 0x5b02, 0x4415, 0xb8, 0x52, 0xce, 0x5e, 0x8b, 0xcc, 0xb2, 0x89); @@ -387,28 +383,6 @@ HRESULT d3d8_vertex_declaration_init_fvf(struct d3d8_vertex_declaration *declara IDirect3DDevice8Impl *device, DWORD fvf) DECLSPEC_HIDDEN; /***************************************************************************** - * IDirect3DVertexShader8 interface - */ -#define INTERFACE IDirect3DVertexShader8 -DECLARE_INTERFACE_(IDirect3DVertexShader8, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; -}; -#undef INTERFACE - -/*** IUnknown methods ***/ -#define IDirect3DVertexShader8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirect3DVertexShader8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirect3DVertexShader8_Release(p) (p)->lpVtbl->Release(p) - -/* ------------------------- */ -/* IDirect3DVertexShader8Impl */ -/* ------------------------- */ - -/***************************************************************************** * IDirect3DPixelShader8 interface */ #define INTERFACE IDirect3DPixelShader8 @@ -430,14 +404,14 @@ DECLARE_INTERFACE_(IDirect3DPixelShader8,IUnknown) * IDirect3DVertexShader implementation structure */ -struct IDirect3DVertexShader8Impl { - IDirect3DVertexShader8 IDirect3DVertexShader8_iface; - LONG ref; +struct d3d8_vertex_shader +{ struct d3d8_vertex_declaration *vertex_declaration; struct wined3d_shader *wined3d_shader; }; -HRESULT vertexshader_init(IDirect3DVertexShader8Impl *shader, IDirect3DDevice8Impl *device, +void d3d8_vertex_shader_destroy(struct d3d8_vertex_shader *shader) DECLSPEC_HIDDEN; +HRESULT d3d8_vertex_shader_init(struct d3d8_vertex_shader *shader, IDirect3DDevice8Impl *device, const DWORD *declaration, const DWORD *byte_code, DWORD shader_handle, DWORD usage) DECLSPEC_HIDDEN; #define D3D8_MAX_VERTEX_SHADER_CONSTANTF 256 diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index f480d887d9a..e724824ad63 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -1987,7 +1987,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(IDirect3DDevice8 * const DWORD *declaration, const DWORD *byte_code, DWORD *shader, DWORD usage) { IDirect3DDevice8Impl *This = impl_from_IDirect3DDevice8(iface); - IDirect3DVertexShader8Impl *object; + struct d3d8_vertex_shader *object; DWORD shader_handle; DWORD handle; HRESULT hr; @@ -2016,7 +2016,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(IDirect3DDevice8 * shader_handle = handle + VS_HIGHESTFIXEDFXF + 1; - hr = vertexshader_init(object, This, declaration, byte_code, shader_handle, usage); + hr = d3d8_vertex_shader_init(object, This, declaration, byte_code, shader_handle, usage); if (FAILED(hr)) { WARN("Failed to initialize vertex shader, hr %#x.\n", hr); @@ -2102,7 +2102,7 @@ static struct d3d8_vertex_declaration *IDirect3DDevice8Impl_FindDecl(IDirect3DDe static HRESULT WINAPI IDirect3DDevice8Impl_SetVertexShader(IDirect3DDevice8 *iface, DWORD pShader) { IDirect3DDevice8Impl *This = impl_from_IDirect3DDevice8(iface); - IDirect3DVertexShader8Impl *shader; + struct d3d8_vertex_shader *shader; HRESULT hr; TRACE("iface %p, shader %#x.\n", iface, pShader); @@ -2181,7 +2181,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShader(IDirect3DDevice8 *ifa static HRESULT WINAPI IDirect3DDevice8Impl_DeleteVertexShader(IDirect3DDevice8 *iface, DWORD pShader) { IDirect3DDevice8Impl *This = impl_from_IDirect3DDevice8(iface); - IDirect3DVertexShader8Impl *shader; + struct d3d8_vertex_shader *shader; struct wined3d_shader *cur; TRACE("iface %p, shader %#x.\n", iface, pShader); @@ -2206,10 +2206,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeleteVertexShader(IDirect3DDevice8 * wined3d_mutex_unlock(); - if (IDirect3DVertexShader8_Release(&shader->IDirect3DVertexShader8_iface)) - { - ERR("Shader %p has references left, this shouldn't happen.\n", shader); - } + d3d8_vertex_shader_destroy(shader); return D3D_OK; } @@ -2263,7 +2260,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderDeclaration(IDirect3DD { IDirect3DDevice8Impl *This = impl_from_IDirect3DDevice8(iface); struct d3d8_vertex_declaration *declaration; - IDirect3DVertexShader8Impl *shader; + struct d3d8_vertex_shader *shader; TRACE("iface %p, shader %#x, data %p, data_size %p.\n", iface, pVertexShader, pData, pSizeOfData); @@ -2301,7 +2298,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderFunction(IDirect3DDevi DWORD pVertexShader, void *pData, DWORD *pSizeOfData) { IDirect3DDevice8Impl *This = impl_from_IDirect3DDevice8(iface); - IDirect3DVertexShader8Impl *shader = NULL; + struct d3d8_vertex_shader *shader = NULL; HRESULT hr; TRACE("iface %p, shader %#x, data %p, data_size %p.\n", diff --git a/dlls/d3d8/shader.c b/dlls/d3d8/shader.c index 2a5d16519b7..48d7a2b21e5 100644 --- a/dlls/d3d8/shader.c +++ b/dlls/d3d8/shader.c @@ -22,85 +22,29 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d8); -static inline IDirect3DVertexShader8Impl *impl_from_IDirect3DVertexShader8(IDirect3DVertexShader8 *iface) -{ - return CONTAINING_RECORD(iface, IDirect3DVertexShader8Impl, IDirect3DVertexShader8_iface); -} - -static HRESULT WINAPI d3d8_vertexshader_QueryInterface(IDirect3DVertexShader8 *iface, REFIID riid, void **object) +static void STDMETHODCALLTYPE d3d8_vertexshader_wined3d_object_destroyed(void *parent) { - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); - - if (IsEqualGUID(riid, &IID_IDirect3DVertexShader8) - || IsEqualGUID(riid, &IID_IUnknown)) - { - IUnknown_AddRef(iface); - *object = iface; - return S_OK; - } - - WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); - - *object = NULL; - return E_NOINTERFACE; + struct d3d8_vertex_shader *shader = parent; + d3d8_vertex_declaration_destroy(shader->vertex_declaration); + HeapFree(GetProcessHeap(), 0, shader); } -static ULONG WINAPI d3d8_vertexshader_AddRef(IDirect3DVertexShader8 *iface) +void d3d8_vertex_shader_destroy(struct d3d8_vertex_shader *shader) { - IDirect3DVertexShader8Impl *shader = impl_from_IDirect3DVertexShader8(iface); - ULONG refcount = InterlockedIncrement(&shader->ref); + TRACE("shader %p.\n", shader); - TRACE("%p increasing refcount to %u.\n", iface, refcount); - - if (refcount == 1 && shader->wined3d_shader) + if (shader->wined3d_shader) { wined3d_mutex_lock(); - wined3d_shader_incref(shader->wined3d_shader); + wined3d_shader_decref(shader->wined3d_shader); wined3d_mutex_unlock(); } - - return refcount; -} - -static void STDMETHODCALLTYPE d3d8_vertexshader_wined3d_object_destroyed(void *parent) -{ - IDirect3DVertexShader8Impl *shader = parent; - d3d8_vertex_declaration_destroy(shader->vertex_declaration); - HeapFree(GetProcessHeap(), 0, shader); -} - -static ULONG WINAPI d3d8_vertexshader_Release(IDirect3DVertexShader8 *iface) -{ - IDirect3DVertexShader8Impl *shader = impl_from_IDirect3DVertexShader8(iface); - ULONG refcount = InterlockedDecrement(&shader->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, refcount); - - if (!refcount) + else { - if (shader->wined3d_shader) - { - wined3d_mutex_lock(); - wined3d_shader_decref(shader->wined3d_shader); - wined3d_mutex_unlock(); - } - else - { - d3d8_vertexshader_wined3d_object_destroyed(shader); - } + d3d8_vertexshader_wined3d_object_destroyed(shader); } - - return refcount; } -static const IDirect3DVertexShader8Vtbl d3d8_vertexshader_vtbl = -{ - /* IUnknown */ - d3d8_vertexshader_QueryInterface, - d3d8_vertexshader_AddRef, - d3d8_vertexshader_Release, -}; - static const struct wined3d_parent_ops d3d8_vertexshader_wined3d_parent_ops = { d3d8_vertexshader_wined3d_object_destroyed, @@ -136,7 +80,7 @@ static HRESULT d3d8_vertexshader_create_vertexdeclaration(IDirect3DDevice8Impl * return D3D_OK; } -HRESULT vertexshader_init(IDirect3DVertexShader8Impl *shader, IDirect3DDevice8Impl *device, +HRESULT d3d8_vertex_shader_init(struct d3d8_vertex_shader *shader, IDirect3DDevice8Impl *device, const DWORD *declaration, const DWORD *byte_code, DWORD shader_handle, DWORD usage) { const DWORD *token = declaration; @@ -161,9 +105,6 @@ HRESULT vertexshader_init(IDirect3DVertexShader8Impl *shader, IDirect3DDevice8Im token += parse_token(token); } - shader->ref = 1; - shader->IDirect3DVertexShader8_iface.lpVtbl = &d3d8_vertexshader_vtbl; - hr = d3d8_vertexshader_create_vertexdeclaration(device, declaration, shader_handle, &shader->vertex_declaration); if (FAILED(hr)) { -- 2.11.4.GIT