d3d8: All objects created by device should keep reference to it. If they

Vitaliy Margolen wine-patch at kievinfo.com
Sat May 6 16:44:01 CDT 2006


ChangeLog:
d3d8: All objects created by device should keep reference to it. if they
return object and not a handle.

The only object left to fix is surface. But it's a special case and needs
more work.

 dlls/d3d8/cubetexture.c   |    1 +
 dlls/d3d8/d3d8_private.h  |   18 +++++++++++++++---
 dlls/d3d8/device.c        |   12 ++++++++++--
 dlls/d3d8/indexbuffer.c   |    1 +
 dlls/d3d8/swapchain.c     |    1 +
 dlls/d3d8/texture.c       |    1 +
 dlls/d3d8/vertexshader.c  |    1 -
 dlls/d3d8/volumetexture.c |    1 +
 8 files changed, 30 insertions(+), 6 deletions(-)
-------------- next part --------------
2db58a6945ba41cb0f4e862968152622cba354dd
diff --git a/dlls/d3d8/cubetexture.c b/dlls/d3d8/cubetexture.c
index 2498855..50f81f7 100644
--- a/dlls/d3d8/cubetexture.c
+++ b/dlls/d3d8/cubetexture.c
@@ -57,6 +57,7 @@ ULONG WINAPI IDirect3DCubeTexture8Impl_R
     if (ref == 0) {
         TRACE("Releasing child %p\n", This->wineD3DCubeTexture);
         IWineD3DCubeTexture_Release(This->wineD3DCubeTexture);
+        IUnknown_Release(This->parentDevice);
         HeapFree(GetProcessHeap(), 0, This);
     }
     return ref;
diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h
index 29556d1..a66871b 100644
--- a/dlls/d3d8/d3d8_private.h
+++ b/dlls/d3d8/d3d8_private.h
@@ -229,6 +229,9 @@ struct IDirect3DSwapChain8Impl
 
     /* IDirect3DSwapChain8 fields */
     IWineD3DSwapChain             *wineD3DSwapChain;
+
+    /* Parent reference */
+    LPDIRECT3DDEVICE8              parentDevice;
 };
 
 /* ----------------- */
@@ -321,6 +324,9 @@ struct IDirect3DIndexBuffer8Impl
 
     /* IDirect3DResource8 fields */
     IWineD3DIndexBuffer             *wineD3DIndexBuffer;
+
+    /* Parent reference */
+    LPDIRECT3DDEVICE8                parentDevice;
 };
 
 /* --------------------- */
@@ -360,6 +366,9 @@ struct IDirect3DCubeTexture8Impl
 
     /* IDirect3DResource8 fields */
     IWineD3DCubeTexture             *wineD3DCubeTexture;
+
+    /* Parent reference */
+    LPDIRECT3DDEVICE8                parentDevice;
 };
 
 /* ----------------- */
@@ -382,6 +391,9 @@ struct IDirect3DTexture8Impl
 
     /* IDirect3DResourc8 fields */
     IWineD3DTexture             *wineD3DTexture;
+
+    /* Parent reference */
+    LPDIRECT3DDEVICE8            parentDevice;
 };
 
 /* ----------------------- */
@@ -404,6 +416,9 @@ struct IDirect3DVolumeTexture8Impl
 
     /* IDirect3DResource8 fields */
     IWineD3DVolumeTexture             *wineD3DVolumeTexture;
+
+    /* Parent reference */
+    LPDIRECT3DDEVICE8                  parentDevice;
 };
 
 /* ----------------------- */
@@ -532,9 +547,6 @@ struct IDirect3DVertexShader8Impl {
   LONG ref;
 
   IWineD3DVertexShader             *wineD3DVertexShader;
-
-  /* Parent reference */
-  LPDIRECT3DDEVICE8                 parentDevice;
 };
 
 
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index eed71e5..6cbbc27 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -214,6 +214,8 @@ HRESULT WINAPI IDirect3DDevice8Impl_Crea
         HeapFree(GetProcessHeap(), 0 , object);
         *pSwapChain = NULL;
     }else{
+        IUnknown_AddRef(iface);
+        object->parentDevice = iface;
         *pSwapChain = (IDirect3DSwapChain8 *)object;
     }
     TRACE("(%p) returning %p\n", This, *pSwapChain);
@@ -312,6 +314,8 @@ HRESULT WINAPI IDirect3DDevice8Impl_Crea
         HeapFree(GetProcessHeap(), 0, object);
 /*      *ppTexture = NULL; */
    } else {
+        IUnknown_AddRef(iface);
+        object->parentDevice = iface;
         *ppTexture = (LPDIRECT3DTEXTURE8) object;
    }
 
@@ -350,6 +354,8 @@ HRESULT WINAPI IDirect3DDevice8Impl_Crea
         HeapFree(GetProcessHeap(), 0, object);
         *ppVolumeTexture = NULL;
     } else {
+        IUnknown_AddRef(iface);
+        object->parentDevice = iface;
         *ppVolumeTexture = (LPDIRECT3DVOLUMETEXTURE8) object;
     }
     TRACE("(%p)  returning %p\n", This , *ppVolumeTexture);
@@ -387,6 +393,8 @@ HRESULT WINAPI IDirect3DDevice8Impl_Crea
         HeapFree(GetProcessHeap(), 0, object);
         *ppCubeTexture = NULL;
     } else {
+        IUnknown_AddRef(iface);
+        object->parentDevice = iface;
         *ppCubeTexture = (LPDIRECT3DCUBETEXTURE8) object;
     }
 
@@ -452,6 +460,8 @@ HRESULT WINAPI IDirect3DDevice8Impl_Crea
         HeapFree(GetProcessHeap(), 0, object);
         *ppIndexBuffer = NULL;
     } else {
+        IUnknown_AddRef(iface);
+        object->parentDevice = iface;
         *ppIndexBuffer = (LPDIRECT3DINDEXBUFFER8)object;
     }
     return hrc;
@@ -1071,8 +1081,6 @@ HRESULT WINAPI IDirect3DDevice8Impl_Crea
             FIXME("(%p) : Number of shaders exceeds the maximum number of possible shaders\n", This);
             hrc = E_OUTOFMEMORY;
         } else {
-            IUnknown_AddRef(iface);
-            object->parentDevice = iface;
             This->vShaders[i] = object;
             *ppShader = i + VS_HIGHESTFIXEDFXF + 1;
         }
diff --git a/dlls/d3d8/indexbuffer.c b/dlls/d3d8/indexbuffer.c
index 2f06cf9..316e1ff 100644
--- a/dlls/d3d8/indexbuffer.c
+++ b/dlls/d3d8/indexbuffer.c
@@ -56,6 +56,7 @@ ULONG WINAPI IDirect3DIndexBuffer8Impl_R
 
     if (ref == 0) {
         IWineD3DIndexBuffer_Release(This->wineD3DIndexBuffer);
+        IUnknown_Release(This->parentDevice);
         HeapFree(GetProcessHeap(), 0, This);
     }
     return ref;
diff --git a/dlls/d3d8/swapchain.c b/dlls/d3d8/swapchain.c
index 583b7ec..83b4c2f 100644
--- a/dlls/d3d8/swapchain.c
+++ b/dlls/d3d8/swapchain.c
@@ -56,6 +56,7 @@ ULONG WINAPI IDirect3DSwapChain8Impl_Rel
 
     if (ref == 0) {
         IWineD3DSwapChain_Release(This->wineD3DSwapChain);
+        IUnknown_Release(This->parentDevice);
         HeapFree(GetProcessHeap(), 0, This);
     }
     return ref;
diff --git a/dlls/d3d8/texture.c b/dlls/d3d8/texture.c
index 736673a..4839cc8 100644
--- a/dlls/d3d8/texture.c
+++ b/dlls/d3d8/texture.c
@@ -57,6 +57,7 @@ ULONG WINAPI IDirect3DTexture8Impl_Relea
 
     if (ref == 0) {
         IWineD3DTexture_Release(This->wineD3DTexture);
+        IUnknown_Release(This->parentDevice);
         HeapFree(GetProcessHeap(), 0, This);
     }
     return ref;
diff --git a/dlls/d3d8/vertexshader.c b/dlls/d3d8/vertexshader.c
index f11e756..5bba7aa 100644
--- a/dlls/d3d8/vertexshader.c
+++ b/dlls/d3d8/vertexshader.c
@@ -56,7 +56,6 @@ ULONG WINAPI IDirect3DVertexShader8Impl_
 
     if (ref == 0) {
         IWineD3DVertexShader_Release(This->wineD3DVertexShader);
-        IUnknown_Release(This->parentDevice);
         HeapFree(GetProcessHeap(), 0, This);
     }
     return ref;
diff --git a/dlls/d3d8/volumetexture.c b/dlls/d3d8/volumetexture.c
index 11cfaef..2377ae9 100644
--- a/dlls/d3d8/volumetexture.c
+++ b/dlls/d3d8/volumetexture.c
@@ -57,6 +57,7 @@ ULONG WINAPI IDirect3DVolumeTexture8Impl
 
     if (ref == 0) {
         IWineD3DVolumeTexture_Release(This->wineD3DVolumeTexture);
+        IUnknown_Release(This->parentDevice);
         HeapFree(GetProcessHeap(), 0, This);
     }
     return ref;


More information about the wine-patches mailing list