[PATCH 4/5] d3d8: Introduce a resource structure.

Stefan Dösinger stefan at codeweavers.com
Thu Mar 6 09:59:30 CST 2014


---
 dlls/d3d8/buffer.c       | 40 ++++++++++++++++++++-----------------
 dlls/d3d8/d3d8_main.c    |  9 +++++++++
 dlls/d3d8/d3d8_private.h | 23 ++++++++++++---------
 dlls/d3d8/device.c       | 10 +++++-----
 dlls/d3d8/surface.c      | 22 ++++++++++----------
 dlls/d3d8/texture.c      | 52 +++++++++++++++++++++++++-----------------------
 dlls/d3d8/volume.c       | 10 ++++++----
 7 files changed, 95 insertions(+), 71 deletions(-)

diff --git a/dlls/d3d8/buffer.c b/dlls/d3d8/buffer.c
index 775595a..badd341 100644
--- a/dlls/d3d8/buffer.c
+++ b/dlls/d3d8/buffer.c
@@ -48,13 +48,13 @@ static HRESULT WINAPI d3d8_vertexbuffer_QueryInterface(IDirect3DVertexBuffer8 *i
 static ULONG WINAPI d3d8_vertexbuffer_AddRef(IDirect3DVertexBuffer8 *iface)
 {
     struct d3d8_vertexbuffer *buffer = impl_from_IDirect3DVertexBuffer8(iface);
-    ULONG refcount = InterlockedIncrement(&buffer->refcount);
+    ULONG refcount = InterlockedIncrement(&buffer->resource.refcount);
 
     TRACE("%p increasing refcount to %u.\n", iface, refcount);
 
     if (refcount == 1)
     {
-        IDirect3DDevice8_AddRef(buffer->parent_device);
+        IDirect3DDevice8_AddRef(buffer->resource.parent_device);
         wined3d_mutex_lock();
         wined3d_buffer_incref(buffer->wined3d_buffer);
         wined3d_mutex_unlock();
@@ -66,13 +66,13 @@ static ULONG WINAPI d3d8_vertexbuffer_AddRef(IDirect3DVertexBuffer8 *iface)
 static ULONG WINAPI d3d8_vertexbuffer_Release(IDirect3DVertexBuffer8 *iface)
 {
     struct d3d8_vertexbuffer *buffer = impl_from_IDirect3DVertexBuffer8(iface);
-    ULONG refcount = InterlockedDecrement(&buffer->refcount);
+    ULONG refcount = InterlockedDecrement(&buffer->resource.refcount);
 
     TRACE("%p decreasing refcount to %u.\n", iface, refcount);
 
     if (!refcount)
     {
-        IDirect3DDevice8 *device = buffer->parent_device;
+        IDirect3DDevice8 *device = buffer->resource.parent_device;
 
         wined3d_mutex_lock();
         wined3d_buffer_decref(buffer->wined3d_buffer);
@@ -92,7 +92,7 @@ static HRESULT WINAPI d3d8_vertexbuffer_GetDevice(IDirect3DVertexBuffer8 *iface,
 
     TRACE("iface %p, device %p.\n", iface, device);
 
-    *device = buffer->parent_device;
+    *device = buffer->resource.parent_device;
     IDirect3DDevice8_AddRef(*device);
 
     TRACE("Returning device %p.\n", *device);
@@ -274,7 +274,9 @@ static const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl =
 
 static void STDMETHODCALLTYPE d3d8_vertexbuffer_wined3d_object_destroyed(void *parent)
 {
-    HeapFree(GetProcessHeap(), 0, parent);
+    struct d3d8_vertexbuffer *buffer = parent;
+    d3d8_resource_cleanup(&buffer->resource);
+    HeapFree(GetProcessHeap(), 0, buffer);
 }
 
 static const struct wined3d_parent_ops d3d8_vertexbuffer_wined3d_parent_ops =
@@ -288,7 +290,7 @@ HRESULT vertexbuffer_init(struct d3d8_vertexbuffer *buffer, struct d3d8_device *
     HRESULT hr;
 
     buffer->IDirect3DVertexBuffer8_iface.lpVtbl = &Direct3DVertexBuffer8_Vtbl;
-    buffer->refcount = 1;
+    d3d8_resource_init(&buffer->resource);
     buffer->fvf = fvf;
 
     wined3d_mutex_lock();
@@ -301,8 +303,8 @@ HRESULT vertexbuffer_init(struct d3d8_vertexbuffer *buffer, struct d3d8_device *
         return hr;
     }
 
-    buffer->parent_device = &device->IDirect3DDevice8_iface;
-    IDirect3DDevice8_AddRef(buffer->parent_device);
+    buffer->resource.parent_device = &device->IDirect3DDevice8_iface;
+    IDirect3DDevice8_AddRef(buffer->resource.parent_device);
 
     return D3D_OK;
 }
@@ -343,13 +345,13 @@ static HRESULT WINAPI d3d8_indexbuffer_QueryInterface(IDirect3DIndexBuffer8 *ifa
 static ULONG WINAPI d3d8_indexbuffer_AddRef(IDirect3DIndexBuffer8 *iface)
 {
     struct d3d8_indexbuffer *buffer = impl_from_IDirect3DIndexBuffer8(iface);
-    ULONG refcount = InterlockedIncrement(&buffer->refcount);
+    ULONG refcount = InterlockedIncrement(&buffer->resource.refcount);
 
     TRACE("%p increasing refcount to %u.\n", iface, refcount);
 
     if (refcount == 1)
     {
-        IDirect3DDevice8_AddRef(buffer->parent_device);
+        IDirect3DDevice8_AddRef(buffer->resource.parent_device);
         wined3d_mutex_lock();
         wined3d_buffer_incref(buffer->wined3d_buffer);
         wined3d_mutex_unlock();
@@ -361,13 +363,13 @@ static ULONG WINAPI d3d8_indexbuffer_AddRef(IDirect3DIndexBuffer8 *iface)
 static ULONG WINAPI d3d8_indexbuffer_Release(IDirect3DIndexBuffer8 *iface)
 {
     struct d3d8_indexbuffer *buffer = impl_from_IDirect3DIndexBuffer8(iface);
-    ULONG refcount = InterlockedDecrement(&buffer->refcount);
+    ULONG refcount = InterlockedDecrement(&buffer->resource.refcount);
 
     TRACE("%p decreasing refcount to %u.\n", iface, refcount);
 
     if (!refcount)
     {
-        IDirect3DDevice8 *device = buffer->parent_device;
+        IDirect3DDevice8 *device = buffer->resource.parent_device;
 
         wined3d_mutex_lock();
         wined3d_buffer_decref(buffer->wined3d_buffer);
@@ -387,7 +389,7 @@ static HRESULT WINAPI d3d8_indexbuffer_GetDevice(IDirect3DIndexBuffer8 *iface,
 
     TRACE("iface %p, device %p.\n", iface, device);
 
-    *device = buffer->parent_device;
+    *device = buffer->resource.parent_device;
     IDirect3DDevice8_AddRef(*device);
 
     TRACE("Returning device %p.\n", *device);
@@ -568,7 +570,9 @@ static const IDirect3DIndexBuffer8Vtbl d3d8_indexbuffer_vtbl =
 
 static void STDMETHODCALLTYPE d3d8_indexbuffer_wined3d_object_destroyed(void *parent)
 {
-    HeapFree(GetProcessHeap(), 0, parent);
+    struct d3d8_indexbuffer *buffer = parent;
+    d3d8_resource_cleanup(&buffer->resource);
+    HeapFree(GetProcessHeap(), 0, buffer);
 }
 
 static const struct wined3d_parent_ops d3d8_indexbuffer_wined3d_parent_ops =
@@ -582,7 +586,7 @@ HRESULT indexbuffer_init(struct d3d8_indexbuffer *buffer, struct d3d8_device *de
     HRESULT hr;
 
     buffer->IDirect3DIndexBuffer8_iface.lpVtbl = &d3d8_indexbuffer_vtbl;
-    buffer->refcount = 1;
+    d3d8_resource_init(&buffer->resource);
     buffer->format = wined3dformat_from_d3dformat(format);
 
     wined3d_mutex_lock();
@@ -595,8 +599,8 @@ HRESULT indexbuffer_init(struct d3d8_indexbuffer *buffer, struct d3d8_device *de
         return hr;
     }
 
-    buffer->parent_device = &device->IDirect3DDevice8_iface;
-    IDirect3DDevice8_AddRef(buffer->parent_device);
+    buffer->resource.parent_device = &device->IDirect3DDevice8_iface;
+    IDirect3DDevice8_AddRef(buffer->resource.parent_device);
 
     return D3D_OK;
 }
diff --git a/dlls/d3d8/d3d8_main.c b/dlls/d3d8/d3d8_main.c
index 1157465..2175a33 100644
--- a/dlls/d3d8/d3d8_main.c
+++ b/dlls/d3d8/d3d8_main.c
@@ -137,3 +137,12 @@ HRESULT WINAPI ValidatePixelShader(DWORD* pixelshader, DWORD* reserved1, BOOL bo
         }
   return ret;
 }
+
+void d3d8_resource_cleanup(struct d3d8_resource *resource)
+{
+}
+
+void d3d8_resource_init(struct d3d8_resource *resource)
+{
+    resource->refcount = 1;
+}
diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h
index 436818f..df0066b 100644
--- a/dlls/d3d8/d3d8_private.h
+++ b/dlls/d3d8/d3d8_private.h
@@ -174,10 +174,19 @@ struct d3d8_device
 HRESULT device_init(struct d3d8_device *device, struct d3d8 *parent, struct wined3d *wined3d, UINT adapter,
         D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters) DECLSPEC_HIDDEN;
 
+struct d3d8_resource
+{
+    LONG refcount;
+    IDirect3DDevice8 *parent_device;
+};
+
+void d3d8_resource_cleanup(struct d3d8_resource *resource) DECLSPEC_HIDDEN;
+void d3d8_resource_init(struct d3d8_resource *resource) DECLSPEC_HIDDEN;
+
 struct d3d8_volume
 {
     IDirect3DVolume8 IDirect3DVolume8_iface;
-    LONG refcount;
+    struct d3d8_resource resource;
     struct wined3d_volume *wined3d_volume;
     IUnknown *container;
     IUnknown *forwardReference;
@@ -200,9 +209,8 @@ HRESULT d3d8_swapchain_create(struct d3d8_device *device, struct wined3d_swapcha
 struct d3d8_surface
 {
     IDirect3DSurface8 IDirect3DSurface8_iface;
-    LONG refcount;
+    struct d3d8_resource resource;
     struct wined3d_surface *wined3d_surface;
-    IDirect3DDevice8 *parent_device;
 
     /* The surface container */
     IUnknown                    *container;
@@ -218,9 +226,8 @@ struct d3d8_surface *unsafe_impl_from_IDirect3DSurface8(IDirect3DSurface8 *iface
 struct d3d8_vertexbuffer
 {
     IDirect3DVertexBuffer8 IDirect3DVertexBuffer8_iface;
-    LONG refcount;
+    struct d3d8_resource resource;
     struct wined3d_buffer *wined3d_buffer;
-    IDirect3DDevice8 *parent_device;
     DWORD fvf;
 };
 
@@ -231,9 +238,8 @@ struct d3d8_vertexbuffer *unsafe_impl_from_IDirect3DVertexBuffer8(IDirect3DVerte
 struct d3d8_indexbuffer
 {
     IDirect3DIndexBuffer8 IDirect3DIndexBuffer8_iface;
-    LONG refcount;
+    struct d3d8_resource resource;
     struct wined3d_buffer *wined3d_buffer;
-    IDirect3DDevice8 *parent_device;
     enum wined3d_format_id format;
 };
 
@@ -244,9 +250,8 @@ struct d3d8_indexbuffer *unsafe_impl_from_IDirect3DIndexBuffer8(IDirect3DIndexBu
 struct d3d8_texture
 {
     IDirect3DBaseTexture8 IDirect3DBaseTexture8_iface;
-    LONG refcount;
+    struct d3d8_resource resource;
     struct wined3d_texture *wined3d_texture;
-    IDirect3DDevice8 *parent_device;
 };
 
 HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *device,
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index d28ada5..c1a3c17 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -600,7 +600,7 @@ static HRESULT CDECL reset_enum_callback(struct wined3d_resource *resource)
         }
 
         surface = wined3d_resource_get_parent(resource);
-        if (surface->refcount)
+        if (surface->resource.refcount)
         {
             WARN("Surface %p (resource %p) in pool D3DPOOL_DEFAULT blocks the Reset call.\n", surface, resource);
             return D3DERR_DEVICELOST;
@@ -916,7 +916,7 @@ static HRESULT d3d8_device_create_surface(struct d3d8_device *device, UINT width
     sub_resource = wined3d_texture_get_sub_resource(texture, 0);
     surface_impl = wined3d_resource_get_parent(sub_resource);
     surface_impl->forwardReference = NULL;
-    surface_impl->parent_device = &device->IDirect3DDevice8_iface;
+    surface_impl->resource.parent_device = &device->IDirect3DDevice8_iface;
     *surface = &surface_impl->IDirect3DSurface8_iface;
     IDirect3DSurface8_AddRef(*surface);
     wined3d_texture_decref(texture);
@@ -2942,8 +2942,8 @@ static HRESULT CDECL device_parent_surface_created(struct wined3d_device_parent
     TRACE("Created surface %p.\n", d3d_surface);
 
     d3d_surface->container = container_parent;
-    IDirect3DDevice8_Release(d3d_surface->parent_device);
-    d3d_surface->parent_device = NULL;
+    IDirect3DDevice8_Release(d3d_surface->resource.parent_device);
+    d3d_surface->resource.parent_device = NULL;
 
     IDirect3DSurface8_Release(&d3d_surface->IDirect3DSurface8_iface);
     d3d_surface->forwardReference = container_parent;
@@ -3002,7 +3002,7 @@ static HRESULT CDECL device_parent_create_swapchain_surface(struct wined3d_devic
 
     d3d_surface = wined3d_surface_get_parent(*surface);
     d3d_surface->forwardReference = NULL;
-    d3d_surface->parent_device = &device->IDirect3DDevice8_iface;
+    d3d_surface->resource.parent_device = &device->IDirect3DDevice8_iface;
 
     return hr;
 }
diff --git a/dlls/d3d8/surface.c b/dlls/d3d8/surface.c
index f1b143a..95face4 100644
--- a/dlls/d3d8/surface.c
+++ b/dlls/d3d8/surface.c
@@ -62,14 +62,14 @@ static ULONG WINAPI d3d8_surface_AddRef(IDirect3DSurface8 *iface)
     else
     {
         /* No container, handle our own refcounting */
-        ULONG ref = InterlockedIncrement(&surface->refcount);
+        ULONG ref = InterlockedIncrement(&surface->resource.refcount);
 
         TRACE("%p increasing refcount to %u.\n", iface, ref);
 
         if (ref == 1)
         {
-            if (surface->parent_device)
-                IDirect3DDevice8_AddRef(surface->parent_device);
+            if (surface->resource.parent_device)
+                IDirect3DDevice8_AddRef(surface->resource.parent_device);
             wined3d_mutex_lock();
             wined3d_surface_incref(surface->wined3d_surface);
             wined3d_mutex_unlock();
@@ -94,13 +94,13 @@ static ULONG WINAPI d3d8_surface_Release(IDirect3DSurface8 *iface)
     else
     {
         /* No container, handle our own refcounting */
-        ULONG ref = InterlockedDecrement(&surface->refcount);
+        ULONG ref = InterlockedDecrement(&surface->resource.refcount);
 
         TRACE("%p decreasing refcount to %u.\n", iface, ref);
 
         if (!ref)
         {
-            IDirect3DDevice8 *parent_device = surface->parent_device;
+            IDirect3DDevice8 *parent_device = surface->resource.parent_device;
 
             /* Implicit surfaces are destroyed with the device, not if refcount reaches 0. */
             wined3d_mutex_lock();
@@ -138,7 +138,7 @@ static HRESULT WINAPI d3d8_surface_GetDevice(IDirect3DSurface8 *iface, IDirect3D
         return hr;
     }
 
-    *device = surface->parent_device;
+    *device = surface->resource.parent_device;
     IDirect3DDevice8_AddRef(*device);
 
     TRACE("Returning device %p.\n", *device);
@@ -325,7 +325,9 @@ static const IDirect3DSurface8Vtbl d3d8_surface_vtbl =
 
 static void STDMETHODCALLTYPE surface_wined3d_object_destroyed(void *parent)
 {
-    HeapFree(GetProcessHeap(), 0, parent);
+    struct d3d8_surface *surface = parent;
+    d3d8_resource_cleanup(&surface->resource);
+    HeapFree(GetProcessHeap(), 0, surface);
 }
 
 static const struct wined3d_parent_ops d3d8_surface_wined3d_parent_ops =
@@ -337,11 +339,11 @@ void surface_init(struct d3d8_surface *surface, struct wined3d_surface *wined3d_
         struct d3d8_device *device, const struct wined3d_parent_ops **parent_ops)
 {
     surface->IDirect3DSurface8_iface.lpVtbl = &d3d8_surface_vtbl;
-    surface->refcount = 1;
+    d3d8_resource_init(&surface->resource);
     wined3d_surface_incref(wined3d_surface);
     surface->wined3d_surface = wined3d_surface;
-    surface->parent_device = &device->IDirect3DDevice8_iface;
-    IDirect3DDevice8_AddRef(surface->parent_device);
+    surface->resource.parent_device = &device->IDirect3DDevice8_iface;
+    IDirect3DDevice8_AddRef(surface->resource.parent_device);
 
     *parent_ops = &d3d8_surface_wined3d_parent_ops;
 }
diff --git a/dlls/d3d8/texture.c b/dlls/d3d8/texture.c
index e3e8ca4..06bc754 100644
--- a/dlls/d3d8/texture.c
+++ b/dlls/d3d8/texture.c
@@ -59,13 +59,13 @@ static HRESULT WINAPI d3d8_texture_2d_QueryInterface(IDirect3DTexture8 *iface, R
 static ULONG WINAPI d3d8_texture_2d_AddRef(IDirect3DTexture8 *iface)
 {
     struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
-    ULONG ref = InterlockedIncrement(&texture->refcount);
+    ULONG ref = InterlockedIncrement(&texture->resource.refcount);
 
     TRACE("%p increasing refcount to %u.\n", iface, ref);
 
     if (ref == 1)
     {
-        IDirect3DDevice8_AddRef(texture->parent_device);
+        IDirect3DDevice8_AddRef(texture->resource.parent_device);
         wined3d_mutex_lock();
         wined3d_texture_incref(texture->wined3d_texture);
         wined3d_mutex_unlock();
@@ -77,13 +77,13 @@ static ULONG WINAPI d3d8_texture_2d_AddRef(IDirect3DTexture8 *iface)
 static ULONG WINAPI d3d8_texture_2d_Release(IDirect3DTexture8 *iface)
 {
     struct d3d8_texture *texture = impl_from_IDirect3DTexture8(iface);
-    ULONG ref = InterlockedDecrement(&texture->refcount);
+    ULONG ref = InterlockedDecrement(&texture->resource.refcount);
 
     TRACE("%p decreasing refcount to %u.\n", iface, ref);
 
     if (!ref)
     {
-        IDirect3DDevice8 *parent_device = texture->parent_device;
+        IDirect3DDevice8 *parent_device = texture->resource.parent_device;
 
         wined3d_mutex_lock();
         wined3d_texture_decref(texture->wined3d_texture);
@@ -101,7 +101,7 @@ static HRESULT WINAPI d3d8_texture_2d_GetDevice(IDirect3DTexture8 *iface, IDirec
 
     TRACE("iface %p, device %p.\n", iface, device);
 
-    *device = texture->parent_device;
+    *device = texture->resource.parent_device;
     IDirect3DDevice8_AddRef(*device);
 
     TRACE("Returning device %p.\n", *device);
@@ -427,13 +427,13 @@ static HRESULT WINAPI d3d8_texture_cube_QueryInterface(IDirect3DCubeTexture8 *if
 static ULONG WINAPI d3d8_texture_cube_AddRef(IDirect3DCubeTexture8 *iface)
 {
     struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
-    ULONG ref = InterlockedIncrement(&texture->refcount);
+    ULONG ref = InterlockedIncrement(&texture->resource.refcount);
 
     TRACE("%p increasing refcount to %u.\n", iface, ref);
 
     if (ref == 1)
     {
-        IDirect3DDevice8_AddRef(texture->parent_device);
+        IDirect3DDevice8_AddRef(texture->resource.parent_device);
         wined3d_mutex_lock();
         wined3d_texture_incref(texture->wined3d_texture);
         wined3d_mutex_unlock();
@@ -445,13 +445,13 @@ static ULONG WINAPI d3d8_texture_cube_AddRef(IDirect3DCubeTexture8 *iface)
 static ULONG WINAPI d3d8_texture_cube_Release(IDirect3DCubeTexture8 *iface)
 {
     struct d3d8_texture *texture = impl_from_IDirect3DCubeTexture8(iface);
-    ULONG ref = InterlockedDecrement(&texture->refcount);
+    ULONG ref = InterlockedDecrement(&texture->resource.refcount);
 
     TRACE("%p decreasing refcount to %u.\n", iface, ref);
 
     if (!ref)
     {
-        IDirect3DDevice8 *parent_device = texture->parent_device;
+        IDirect3DDevice8 *parent_device = texture->resource.parent_device;
 
         TRACE("Releasing child %p.\n", texture->wined3d_texture);
 
@@ -471,7 +471,7 @@ static HRESULT WINAPI d3d8_texture_cube_GetDevice(IDirect3DCubeTexture8 *iface,
 
     TRACE("iface %p, device %p.\n", iface, device);
 
-    *device = texture->parent_device;
+    *device = texture->resource.parent_device;
     IDirect3DDevice8_AddRef(*device);
 
     TRACE("Returning device %p.\n", *device);
@@ -820,13 +820,13 @@ static HRESULT WINAPI d3d8_texture_3d_QueryInterface(IDirect3DVolumeTexture8 *if
 static ULONG WINAPI d3d8_texture_3d_AddRef(IDirect3DVolumeTexture8 *iface)
 {
     struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
-    ULONG ref = InterlockedIncrement(&texture->refcount);
+    ULONG ref = InterlockedIncrement(&texture->resource.refcount);
 
     TRACE("%p increasing refcount to %u.\n", iface, ref);
 
     if (ref == 1)
     {
-        IDirect3DDevice8_AddRef(texture->parent_device);
+        IDirect3DDevice8_AddRef(texture->resource.parent_device);
         wined3d_mutex_lock();
         wined3d_texture_incref(texture->wined3d_texture);
         wined3d_mutex_unlock();
@@ -838,13 +838,13 @@ static ULONG WINAPI d3d8_texture_3d_AddRef(IDirect3DVolumeTexture8 *iface)
 static ULONG WINAPI d3d8_texture_3d_Release(IDirect3DVolumeTexture8 *iface)
 {
     struct d3d8_texture *texture = impl_from_IDirect3DVolumeTexture8(iface);
-    ULONG ref = InterlockedDecrement(&texture->refcount);
+    ULONG ref = InterlockedDecrement(&texture->resource.refcount);
 
     TRACE("%p decreasing refcount to %u.\n", iface, ref);
 
     if (!ref)
     {
-        IDirect3DDevice8 *parent_device = texture->parent_device;
+        IDirect3DDevice8 *parent_device = texture->resource.parent_device;
 
         wined3d_mutex_lock();
         wined3d_texture_decref(texture->wined3d_texture);
@@ -862,7 +862,7 @@ static HRESULT WINAPI d3d8_texture_3d_GetDevice(IDirect3DVolumeTexture8 *iface,
 
     TRACE("iface %p, device %p.\n", iface, device);
 
-    *device = texture->parent_device;
+    *device = texture->resource.parent_device;
     IDirect3DDevice8_AddRef(*device);
 
     TRACE("Returning device %p.\n", *device);
@@ -1174,7 +1174,9 @@ struct d3d8_texture *unsafe_impl_from_IDirect3DBaseTexture8(IDirect3DBaseTexture
 
 static void STDMETHODCALLTYPE d3d8_texture_wined3d_object_destroyed(void *parent)
 {
-    HeapFree(GetProcessHeap(), 0, parent);
+    struct d3d8_texture *texture = parent;
+    d3d8_resource_cleanup(&texture->resource);
+    HeapFree(GetProcessHeap(), 0, texture);
 }
 
 static const struct wined3d_parent_ops d3d8_texture_wined3d_parent_ops =
@@ -1190,7 +1192,7 @@ HRESULT texture_init(struct d3d8_texture *texture, struct d3d8_device *device,
     HRESULT hr;
 
     texture->IDirect3DBaseTexture8_iface.lpVtbl = (const IDirect3DBaseTexture8Vtbl *)&Direct3DTexture8_Vtbl;
-    texture->refcount = 1;
+    d3d8_resource_init(&texture->resource);
 
     desc.resource_type = WINED3D_RTYPE_TEXTURE;
     desc.format = wined3dformat_from_d3dformat(format);
@@ -1217,8 +1219,8 @@ HRESULT texture_init(struct d3d8_texture *texture, struct d3d8_device *device,
         return hr;
     }
 
-    texture->parent_device = &device->IDirect3DDevice8_iface;
-    IDirect3DDevice8_AddRef(texture->parent_device);
+    texture->resource.parent_device = &device->IDirect3DDevice8_iface;
+    IDirect3DDevice8_AddRef(texture->resource.parent_device);
 
     return D3D_OK;
 }
@@ -1231,7 +1233,7 @@ HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *devic
     HRESULT hr;
 
     texture->IDirect3DBaseTexture8_iface.lpVtbl = (const IDirect3DBaseTexture8Vtbl *)&Direct3DCubeTexture8_Vtbl;
-    texture->refcount = 1;
+    d3d8_resource_init(&texture->resource);
 
     desc.resource_type = WINED3D_RTYPE_CUBE_TEXTURE;
     desc.format = wined3dformat_from_d3dformat(format);
@@ -1258,8 +1260,8 @@ HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *devic
         return hr;
     }
 
-    texture->parent_device = &device->IDirect3DDevice8_iface;
-    IDirect3DDevice8_AddRef(texture->parent_device);
+    texture->resource.parent_device = &device->IDirect3DDevice8_iface;
+    IDirect3DDevice8_AddRef(texture->resource.parent_device);
 
     return D3D_OK;
 }
@@ -1271,7 +1273,7 @@ HRESULT volumetexture_init(struct d3d8_texture *texture, struct d3d8_device *dev
     HRESULT hr;
 
     texture->IDirect3DBaseTexture8_iface.lpVtbl = (const IDirect3DBaseTexture8Vtbl *)&Direct3DVolumeTexture8_Vtbl;
-    texture->refcount = 1;
+    d3d8_resource_init(&texture->resource);
 
     desc.resource_type = WINED3D_RTYPE_VOLUME_TEXTURE;
     desc.format = wined3dformat_from_d3dformat(format);
@@ -1295,8 +1297,8 @@ HRESULT volumetexture_init(struct d3d8_texture *texture, struct d3d8_device *dev
         return hr;
     }
 
-    texture->parent_device = &device->IDirect3DDevice8_iface;
-    IDirect3DDevice8_AddRef(texture->parent_device);
+    texture->resource.parent_device = &device->IDirect3DDevice8_iface;
+    IDirect3DDevice8_AddRef(texture->resource.parent_device);
 
     return D3D_OK;
 }
diff --git a/dlls/d3d8/volume.c b/dlls/d3d8/volume.c
index e2376d4..1a4e80c 100644
--- a/dlls/d3d8/volume.c
+++ b/dlls/d3d8/volume.c
@@ -61,7 +61,7 @@ static ULONG WINAPI d3d8_volume_AddRef(IDirect3DVolume8 *iface)
     else
     {
         /* No container, handle our own refcounting */
-        ULONG ref = InterlockedIncrement(&volume->refcount);
+        ULONG ref = InterlockedIncrement(&volume->resource.refcount);
 
         TRACE("%p increasing refcount to %u.\n", iface, ref);
 
@@ -91,7 +91,7 @@ static ULONG WINAPI d3d8_volume_Release(IDirect3DVolume8 *iface)
     else
     {
         /* No container, handle our own refcounting */
-        ULONG ref = InterlockedDecrement(&volume->refcount);
+        ULONG ref = InterlockedDecrement(&volume->resource.refcount);
 
         TRACE("%p decreasing refcount to %u.\n", iface, ref);
 
@@ -275,7 +275,9 @@ static const IDirect3DVolume8Vtbl d3d8_volume_vtbl =
 
 static void STDMETHODCALLTYPE volume_wined3d_object_destroyed(void *parent)
 {
-    HeapFree(GetProcessHeap(), 0, parent);
+    struct d3d8_volume *volume = parent;
+    d3d8_resource_cleanup(&volume->resource);
+    HeapFree(GetProcessHeap(), 0, volume);
 }
 
 static const struct wined3d_parent_ops d3d8_volume_wined3d_parent_ops =
@@ -287,7 +289,7 @@ void volume_init(struct d3d8_volume *volume, struct wined3d_volume *wined3d_volu
         const struct wined3d_parent_ops **parent_ops)
 {
     volume->IDirect3DVolume8_iface.lpVtbl = &d3d8_volume_vtbl;
-    volume->refcount = 1;
+    d3d8_resource_init(&volume->resource);
     wined3d_volume_incref(wined3d_volume);
     volume->wined3d_volume = wined3d_volume;
 
-- 
1.8.3.2




More information about the wine-patches mailing list