[PATCH 2/5] d3d9: COM cleanup for the IDirect3DVertexDeclaration9 interface.

Henri Verbeet hverbeet at codeweavers.com
Thu Apr 12 15:49:03 CDT 2012


---
 dlls/d3d9/buffer.c            |    1 -
 dlls/d3d9/d3d9_private.h      |    5 +++-
 dlls/d3d9/device.c            |   11 ++++---
 dlls/d3d9/shader.c            |    1 -
 dlls/d3d9/surface.c           |    1 -
 dlls/d3d9/vertexdeclaration.c |   61 +++++++++++++++++++++++++---------------
 6 files changed, 48 insertions(+), 32 deletions(-)

diff --git a/dlls/d3d9/buffer.c b/dlls/d3d9/buffer.c
index 1be06a5..90bc4b7 100644
--- a/dlls/d3d9/buffer.c
+++ b/dlls/d3d9/buffer.c
@@ -19,7 +19,6 @@
  */
 
 #include "config.h"
-#include <assert.h>
 #include "d3d9_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h
index 485ee12..3c97682 100644
--- a/dlls/d3d9/d3d9_private.h
+++ b/dlls/d3d9/d3d9_private.h
@@ -23,6 +23,7 @@
 #ifndef __WINE_D3D9_PRIVATE_H
 #define __WINE_D3D9_PRIVATE_H
 
+#include <assert.h>
 #include <stdarg.h>
 
 #define NONAMELESSUNION
@@ -386,7 +387,7 @@ HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Im
  */
 typedef struct IDirect3DVertexDeclaration9Impl {
   /* IUnknown fields */
-  const IDirect3DVertexDeclaration9Vtbl *lpVtbl;
+  IDirect3DVertexDeclaration9 IDirect3DVertexDeclaration9_iface;
   LONG    ref;
 
   D3DVERTEXELEMENT9 *elements;
@@ -402,6 +403,8 @@ typedef struct IDirect3DVertexDeclaration9Impl {
 
 HRESULT d3d9_vertex_declaration_create(IDirect3DDevice9Impl *device,
         const D3DVERTEXELEMENT9 *elements, IDirect3DVertexDeclaration9Impl **declaration) DECLSPEC_HIDDEN;
+IDirect3DVertexDeclaration9Impl *unsafe_impl_from_IDirect3DVertexDeclaration9(
+        IDirect3DVertexDeclaration9 *iface) DECLSPEC_HIDDEN;
 
 /* ---------------------- */
 /* IDirect3DVertexShader9 */
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index b265d82..1caf3ca 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -2058,7 +2058,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ProcessVertices(IDirect3DDevice9Ex *i
 {
     IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface);
     IDirect3DVertexBuffer9Impl *dest = unsafe_impl_from_IDirect3DVertexBuffer9(pDestBuffer);
-    IDirect3DVertexDeclaration9Impl *Decl = (IDirect3DVertexDeclaration9Impl *) pVertexDecl;
+    IDirect3DVertexDeclaration9Impl *Decl = unsafe_impl_from_IDirect3DVertexDeclaration9(pVertexDecl);
     HRESULT hr;
 
     TRACE("iface %p, src_start_idx %u, dst_idx %u, vertex_count %u, dst_buffer %p, declaration %p, flags %#x.\n",
@@ -2088,7 +2088,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexDeclaration(IDirect3DDevi
     }
 
     if (SUCCEEDED(hr = d3d9_vertex_declaration_create(device, elements, &object)))
-        *declaration = (IDirect3DVertexDeclaration9 *)object;
+        *declaration = &object->IDirect3DVertexDeclaration9_iface;
 
     return hr;
 }
@@ -2097,13 +2097,14 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(IDirect3DDevice9
         IDirect3DVertexDeclaration9 *declaration)
 {
     IDirect3DDevice9Impl *This = impl_from_IDirect3DDevice9Ex(iface);
+    IDirect3DVertexDeclaration9Impl *decl_impl = unsafe_impl_from_IDirect3DVertexDeclaration9(declaration);
     HRESULT hr;
 
     TRACE("iface %p, declaration %p.\n", iface, declaration);
 
     wined3d_mutex_lock();
     hr = wined3d_device_set_vertex_declaration(This->wined3d_device,
-            declaration ? ((IDirect3DVertexDeclaration9Impl *)declaration)->wineD3DVertexDeclaration : NULL);
+            decl_impl ? decl_impl->wineD3DVertexDeclaration : NULL);
     wined3d_mutex_unlock();
 
     return hr;
@@ -2184,7 +2185,7 @@ static struct wined3d_vertex_declaration *device_get_fvf_declaration(IDirect3DDe
         fvf_decls = HeapReAlloc(GetProcessHeap(), 0, fvf_decls, sizeof(*fvf_decls) * (device->fvf_decl_size + grow));
         if (!fvf_decls)
         {
-            IDirect3DVertexDeclaration9_Release((IDirect3DVertexDeclaration9 *)d3d9_declaration);
+            IDirect3DVertexDeclaration9_Release(&d3d9_declaration->IDirect3DVertexDeclaration9_iface);
             return NULL;
         }
         device->fvf_decls = fvf_decls;
@@ -2194,7 +2195,7 @@ static struct wined3d_vertex_declaration *device_get_fvf_declaration(IDirect3DDe
     d3d9_declaration->convFVF = fvf;
     wined3d_declaration = d3d9_declaration->wineD3DVertexDeclaration;
     wined3d_vertex_declaration_incref(wined3d_declaration);
-    IDirect3DVertexDeclaration9_Release((IDirect3DVertexDeclaration9 *)d3d9_declaration);
+    IDirect3DVertexDeclaration9_Release(&d3d9_declaration->IDirect3DVertexDeclaration9_iface);
 
     memmove(fvf_decls + low + 1, fvf_decls + low, sizeof(*fvf_decls) * (device->fvf_decl_count - low));
     fvf_decls[low].decl = wined3d_declaration;
diff --git a/dlls/d3d9/shader.c b/dlls/d3d9/shader.c
index b9de07c..5835d45 100644
--- a/dlls/d3d9/shader.c
+++ b/dlls/d3d9/shader.c
@@ -18,7 +18,6 @@
  */
 
 #include "config.h"
-#include <assert.h>
 #include "d3d9_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
diff --git a/dlls/d3d9/surface.c b/dlls/d3d9/surface.c
index e453ed8..4cbb3ea 100644
--- a/dlls/d3d9/surface.c
+++ b/dlls/d3d9/surface.c
@@ -20,7 +20,6 @@
  */
 
 #include "config.h"
-#include <assert.h>
 #include "d3d9_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
diff --git a/dlls/d3d9/vertexdeclaration.c b/dlls/d3d9/vertexdeclaration.c
index 4636b14..65d8d18 100644
--- a/dlls/d3d9/vertexdeclaration.c
+++ b/dlls/d3d9/vertexdeclaration.c
@@ -53,6 +53,11 @@ static D3DDECLTYPE_INFO const d3d_dtype_lookup[D3DDECLTYPE_UNUSED] = {
 #define D3D_DECL_SIZE(type)          d3d_dtype_lookup[type].size
 #define D3D_DECL_TYPESIZE(type)      d3d_dtype_lookup[type].typesize
 
+static inline IDirect3DVertexDeclaration9Impl *impl_from_IDirect3DVertexDeclaration9(IDirect3DVertexDeclaration9 *iface)
+{
+    return CONTAINING_RECORD(iface, IDirect3DVertexDeclaration9Impl, IDirect3DVertexDeclaration9_iface);
+}
+
 HRESULT vdecl_convert_fvf(
     DWORD fvf,
     D3DVERTEXELEMENT9** ppVertexElements) {
@@ -213,34 +218,36 @@ static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_QueryInterface(IDirect3DVe
     return E_NOINTERFACE;
 }
 
-static ULONG WINAPI IDirect3DVertexDeclaration9Impl_AddRef(LPDIRECT3DVERTEXDECLARATION9 iface) {
-    IDirect3DVertexDeclaration9Impl *This = (IDirect3DVertexDeclaration9Impl *)iface;
-    ULONG ref = InterlockedIncrement(&This->ref);
+static ULONG WINAPI IDirect3DVertexDeclaration9Impl_AddRef(IDirect3DVertexDeclaration9 *iface)
+{
+    IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
+    ULONG ref = InterlockedIncrement(&declaration->ref);
 
     TRACE("%p increasing refcount to %u.\n", iface, ref);
 
     if (ref == 1)
     {
-        IDirect3DDevice9Ex_AddRef(This->parentDevice);
+        IDirect3DDevice9Ex_AddRef(declaration->parentDevice);
         wined3d_mutex_lock();
-        wined3d_vertex_declaration_incref(This->wineD3DVertexDeclaration);
+        wined3d_vertex_declaration_incref(declaration->wineD3DVertexDeclaration);
         wined3d_mutex_unlock();
     }
 
     return ref;
 }
 
-static ULONG WINAPI IDirect3DVertexDeclaration9Impl_Release(LPDIRECT3DVERTEXDECLARATION9 iface) {
-    IDirect3DVertexDeclaration9Impl *This = (IDirect3DVertexDeclaration9Impl *)iface;
-    ULONG ref = InterlockedDecrement(&This->ref);
+static ULONG WINAPI IDirect3DVertexDeclaration9Impl_Release(IDirect3DVertexDeclaration9 *iface)
+{
+    IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
+    ULONG ref = InterlockedDecrement(&declaration->ref);
 
     TRACE("%p decreasing refcount to %u.\n", iface, ref);
 
     if (!ref)
     {
-        IDirect3DDevice9Ex *parentDevice = This->parentDevice;
+        IDirect3DDevice9Ex *parentDevice = declaration->parentDevice;
         wined3d_mutex_lock();
-        wined3d_vertex_declaration_decref(This->wineD3DVertexDeclaration);
+        wined3d_vertex_declaration_decref(declaration->wineD3DVertexDeclaration);
         wined3d_mutex_unlock();
 
         /* Release the device last, as it may cause the device to be destroyed. */
@@ -253,11 +260,11 @@ static ULONG WINAPI IDirect3DVertexDeclaration9Impl_Release(LPDIRECT3DVERTEXDECL
 static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDevice(IDirect3DVertexDeclaration9 *iface,
         IDirect3DDevice9 **device)
 {
-    IDirect3DVertexDeclaration9Impl *This = (IDirect3DVertexDeclaration9Impl *)iface;
+    IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
 
     TRACE("iface %p, device %p.\n", iface, device);
 
-    *device = (IDirect3DDevice9 *)This->parentDevice;
+    *device = (IDirect3DDevice9 *)declaration->parentDevice;
     IDirect3DDevice9_AddRef(*device);
 
     TRACE("Returning device %p.\n", *device);
@@ -265,21 +272,21 @@ static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDevice(IDirect3DVertexD
     return D3D_OK;
 }
 
-static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDeclaration(LPDIRECT3DVERTEXDECLARATION9 iface, D3DVERTEXELEMENT9* pDecl, UINT* pNumElements) {
-    IDirect3DVertexDeclaration9Impl *This = (IDirect3DVertexDeclaration9Impl *)iface;
+static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDeclaration(IDirect3DVertexDeclaration9 *iface,
+        D3DVERTEXELEMENT9 *elements, UINT *element_count)
+{
+    IDirect3DVertexDeclaration9Impl *declaration = impl_from_IDirect3DVertexDeclaration9(iface);
 
-    TRACE("iface %p, elements %p, element_count %p.\n", iface, pDecl, pNumElements);
+    TRACE("iface %p, elements %p, element_count %p.\n", iface, elements, element_count);
 
-    *pNumElements = This->element_count;
+    *element_count = declaration->element_count;
 
-    /* Passing a NULL pDecl is used to just retrieve the number of elements */
-    if (!pDecl) {
-        TRACE("NULL pDecl passed. Returning D3D_OK.\n");
+    /* Passing a NULL elements is used to just retrieve the number of elements */
+    if (!elements)
         return D3D_OK;
-    }
 
-    TRACE("Copying %p to %p\n", This->elements, pDecl);
-    CopyMemory(pDecl, This->elements, This->element_count * sizeof(D3DVERTEXELEMENT9));
+    TRACE("Copying %p to %p.\n", declaration->elements, elements);
+    memcpy(elements, declaration->elements, sizeof(*declaration->elements) * declaration->element_count);
 
     return D3D_OK;
 }
@@ -295,6 +302,14 @@ static const IDirect3DVertexDeclaration9Vtbl Direct3DVertexDeclaration9_Vtbl =
     IDirect3DVertexDeclaration9Impl_GetDeclaration
 };
 
+IDirect3DVertexDeclaration9Impl *unsafe_impl_from_IDirect3DVertexDeclaration9(IDirect3DVertexDeclaration9 *iface)
+{
+    if (!iface)
+        return NULL;
+    assert(iface->lpVtbl == &Direct3DVertexDeclaration9_Vtbl);
+    return CONTAINING_RECORD(iface, IDirect3DVertexDeclaration9Impl, IDirect3DVertexDeclaration9_iface);
+}
+
 static void STDMETHODCALLTYPE d3d9_vertexdeclaration_wined3d_object_destroyed(void *parent)
 {
     IDirect3DVertexDeclaration9Impl *declaration = parent;
@@ -367,7 +382,7 @@ static HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declarati
         return hr;
     }
 
-    declaration->lpVtbl = &Direct3DVertexDeclaration9_Vtbl;
+    declaration->IDirect3DVertexDeclaration9_iface.lpVtbl = &Direct3DVertexDeclaration9_Vtbl;
     declaration->ref = 1;
 
     element_count = wined3d_element_count + 1;
-- 
1.7.3.4




More information about the wine-patches mailing list