From bd9758068345da7b6de0cfc871ed488a4578aadf Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20D=C3=B6singer?= Date: Fri, 16 Nov 2007 21:01:33 +0100 Subject: [PATCH] wined3d: Move IUnknown functions to IWineD3DBaseShader. --- dlls/wined3d/baseshader.c | 40 +++++++++++++++++++++++++++++++++++++++- dlls/wined3d/device.c | 4 ++-- dlls/wined3d/pixelshader.c | 34 ++++++++-------------------------- dlls/wined3d/vertexshader.c | 30 ++++++------------------------ dlls/wined3d/wined3d_private.h | 11 +++++------ 5 files changed, 60 insertions(+), 59 deletions(-) diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index 7f699270313..ff78a496457 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -1062,7 +1062,7 @@ void shader_trace_init( } } -void shader_delete_constant_list( +static void shader_delete_constant_list( struct list* clist) { struct list *ptr; @@ -1087,3 +1087,41 @@ const shader_backend_t none_shader_backend = { &shader_none_load_constants, &shader_none_cleanup }; + +/* ******************************************* + IWineD3DPixelShader IUnknown parts follow + ******************************************* */ +HRESULT WINAPI IWineD3DBaseShaderImpl_QueryInterface(IWineD3DBaseShader *iface, REFIID riid, LPVOID *ppobj) +{ + IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)iface; + TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppobj); + if (IsEqualGUID(riid, &IID_IUnknown) + || IsEqualGUID(riid, &IID_IWineD3DBase) + || IsEqualGUID(riid, &IID_IWineD3DBaseShader) + || IsEqualGUID(riid, &IID_IWineD3DPixelShader)) { + IUnknown_AddRef(iface); + *ppobj = This; + return S_OK; + } + *ppobj = NULL; + return E_NOINTERFACE; +} + +ULONG WINAPI IWineD3DBaseShaderImpl_AddRef(IWineD3DBaseShader *iface) { + IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface; + TRACE("(%p) : AddRef increasing from %d\n", This, This->baseShader.ref); + return InterlockedIncrement(&This->baseShader.ref); +} + +ULONG WINAPI IWineD3DBaseShaderImpl_Release(IWineD3DBaseShader *iface) { + IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)iface; + ULONG ref; + TRACE("(%p) : Releasing from %d\n", This, This->baseShader.ref); + ref = InterlockedDecrement(&This->baseShader.ref); + if (ref == 0) { + shader_delete_constant_list(&This->baseShader.constantsF); + shader_delete_constant_list(&This->baseShader.constantsB); + shader_delete_constant_list(&This->baseShader.constantsI); + } + return ref; +} diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 584dbc3be3f..eb656bbaf92 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -71,8 +71,8 @@ static void WINAPI IWineD3DDeviceImpl_AddResource(IWineD3DDevice *iface, IWineD3 object=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3D##type##Impl)); \ D3DMEMCHECK(object, pp##type); \ object->lpVtbl = &IWineD3D##type##_Vtbl; \ - object->parent = parent; \ - object->ref = 1; \ + object->parent = parent; \ + object->baseShader.ref = 1; \ object->baseShader.device = (IWineD3DDevice*) This; \ list_init(&object->baseShader.linked_programs); \ *pp##type = (IWineD3D##type *) object; \ diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index 2c8424d8d25..5654c46c07d 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -42,29 +42,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); #endif #define GLNAME_REQUIRE_GLSL ((const char *)1) -/* ******************************************* - IWineD3DPixelShader IUnknown parts follow - ******************************************* */ -static HRESULT WINAPI IWineD3DPixelShaderImpl_QueryInterface(IWineD3DPixelShader *iface, REFIID riid, LPVOID *ppobj) -{ - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface; - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppobj); - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IWineD3DBase) - || IsEqualGUID(riid, &IID_IWineD3DBaseShader) - || IsEqualGUID(riid, &IID_IWineD3DPixelShader)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } - *ppobj = NULL; - return E_NOINTERFACE; + +static HRESULT WINAPI IWineD3DPixelShaderImpl_QueryInterface(IWineD3DPixelShader *iface, REFIID riid, LPVOID *ppobj) { + return IWineD3DBaseShaderImpl_QueryInterface((IWineD3DBaseShader *) iface, riid, ppobj); } static ULONG WINAPI IWineD3DPixelShaderImpl_AddRef(IWineD3DPixelShader *iface) { - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface; - TRACE("(%p) : AddRef increasing from %d\n", This, This->ref); - return InterlockedIncrement(&This->ref); + return IWineD3DBaseShaderImpl_AddRef((IWineD3DBaseShader *) iface); } static void destroy_glsl_pshader(IWineD3DPixelShaderImpl *This) { @@ -86,17 +70,15 @@ static void destroy_glsl_pshader(IWineD3DPixelShaderImpl *This) { static ULONG WINAPI IWineD3DPixelShaderImpl_Release(IWineD3DPixelShader *iface) { IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface; ULONG ref; - TRACE("(%p) : Releasing from %d\n", This, This->ref); - ref = InterlockedDecrement(&This->ref); - if (ref == 0) { + ref = IWineD3DBaseShaderImpl_Release((IWineD3DBaseShader *) iface); + + if(ref == 0) { if (This->baseShader.shader_mode == SHADER_GLSL && This->baseShader.prgId != 0) { destroy_glsl_pshader(This); } - shader_delete_constant_list(&This->baseShader.constantsF); - shader_delete_constant_list(&This->baseShader.constantsB); - shader_delete_constant_list(&This->baseShader.constantsI); HeapFree(GetProcessHeap(), 0, This); } + return ref; } diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c index 5baf00d989b..ab03e25fa5f 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -437,33 +437,19 @@ static VOID IWineD3DVertexShaderImpl_GenerateShader( /* ******************************************* IWineD3DVertexShader IUnknown parts follow ******************************************* */ -static HRESULT WINAPI IWineD3DVertexShaderImpl_QueryInterface(IWineD3DVertexShader *iface, REFIID riid, LPVOID *ppobj) -{ - IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface; - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppobj); - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IWineD3DBase) - || IsEqualGUID(riid, &IID_IWineD3DBaseShader) - || IsEqualGUID(riid, &IID_IWineD3DVertexShader)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } - *ppobj = NULL; - return E_NOINTERFACE; +static HRESULT WINAPI IWineD3DVertexShaderImpl_QueryInterface(IWineD3DVertexShader *iface, REFIID riid, LPVOID *ppobj) { + return IWineD3DBaseShaderImpl_QueryInterface((IWineD3DBaseShader *) iface, riid, ppobj); } -static ULONG WINAPI IWineD3DVertexShaderImpl_AddRef(IWineD3DVertexShader *iface) { - IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface; - TRACE("(%p) : AddRef increasing from %d\n", This, This->ref); - return InterlockedIncrement(&This->ref); +static ULONG WINAPI IWineD3DVertexShaderImpl_AddRef(IWineD3DVertexShader *iface) { + return IWineD3DBaseShaderImpl_AddRef((IWineD3DBaseShader *) iface); } static ULONG WINAPI IWineD3DVertexShaderImpl_Release(IWineD3DVertexShader *iface) { IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface; ULONG ref; - TRACE("(%p) : Releasing from %d\n", This, This->ref); - ref = InterlockedDecrement(&This->ref); + ref = IWineD3DBaseShaderImpl_Release((IWineD3DBaseShader *) iface); + if (ref == 0) { if (This->baseShader.shader_mode == SHADER_GLSL && This->baseShader.prgId != 0) { struct list *linked_programs = &This->baseShader.linked_programs; @@ -480,11 +466,7 @@ static ULONG WINAPI IWineD3DVertexShaderImpl_Release(IWineD3DVertexShader *iface GL_EXTCALL(glDeleteObjectARB(This->baseShader.prgId)); checkGLcall("glDeleteObjectARB"); } - shader_delete_constant_list(&This->baseShader.constantsF); - shader_delete_constant_list(&This->baseShader.constantsB); - shader_delete_constant_list(&This->baseShader.constantsI); HeapFree(GetProcessHeap(), 0, This); - } return ref; } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 428b8df411e..62fb8347181 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1748,9 +1748,6 @@ extern const SHADER_OPCODE* shader_get_opcode( IWineD3DBaseShader *iface, const DWORD code); -extern void shader_delete_constant_list( - struct list* clist); - void delete_glsl_program_entry(IWineD3DDevice *iface, struct glsl_shader_prog_link *entry); /* Vertex shader utility functions */ @@ -1882,6 +1879,7 @@ extern void pshader_glsl_input_pack( */ typedef struct IWineD3DBaseShaderClass { + LONG ref; DWORD hex_version; SHADER_LIMITS limits; SHADER_PARSE_STATE parse_state; @@ -1924,12 +1922,15 @@ typedef struct IWineD3DBaseShaderClass typedef struct IWineD3DBaseShaderImpl { /* IUnknown */ const IWineD3DBaseShaderVtbl *lpVtbl; - LONG ref; /* IWineD3DBaseShader */ IWineD3DBaseShaderClass baseShader; } IWineD3DBaseShaderImpl; +HRESULT WINAPI IWineD3DBaseShaderImpl_QueryInterface(IWineD3DBaseShader *iface, REFIID riid, LPVOID *ppobj); +ULONG WINAPI IWineD3DBaseShaderImpl_AddRef(IWineD3DBaseShader *iface); +ULONG WINAPI IWineD3DBaseShaderImpl_Release(IWineD3DBaseShader *iface); + extern HRESULT shader_get_registers_used( IWineD3DBaseShader *iface, shader_reg_maps* reg_maps, @@ -2038,7 +2039,6 @@ static inline BOOL shader_is_scalar(DWORD param) { typedef struct IWineD3DVertexShaderImpl { /* IUnknown parts*/ const IWineD3DVertexShaderVtbl *lpVtbl; - LONG ref; /* Note: Ref counting not required */ /* IWineD3DBaseShader */ IWineD3DBaseShaderClass baseShader; @@ -2079,7 +2079,6 @@ enum vertexprocessing_mode { typedef struct IWineD3DPixelShaderImpl { /* IUnknown parts */ const IWineD3DPixelShaderVtbl *lpVtbl; - LONG ref; /* Note: Ref counting not required */ /* IWineD3DBaseShader */ IWineD3DBaseShaderClass baseShader; -- 2.11.4.GIT