Stefan Dösinger : ddraw: Some d3d-only code fixes.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jul 24 07:06:28 CDT 2007


Module: wine
Branch: master
Commit: 430239b470cea02cb79e6b6b83784f8e18634909
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=430239b470cea02cb79e6b6b83784f8e18634909

Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date:   Mon Jul 23 09:57:26 2007 +0200

ddraw: Some d3d-only code fixes.

Vertex declarations are a d3d feature, thus they should be destroyed
before d3d is shut down in wined3d. The surface type should be reset
afterwards to prevent avoid gl surface afterwards and before a new
render target is created.

---

 dlls/ddraw/ddraw.c   |   22 ++++++++++++++--------
 dlls/ddraw/main.c    |    7 -------
 dlls/ddraw/surface.c |   15 +++++++++++++++
 3 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index ce591f1..c903ad4 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -252,14 +252,6 @@ IDirectDrawImpl_AddRef(IDirectDraw7 *iface)
 void
 IDirectDrawImpl_Destroy(IDirectDrawImpl *This)
 {
-    int i;
-
-    for(i = 0; i < This->numConvertedDecls; i++)
-    {
-        IWineD3DVertexDeclaration_Release(This->decls[i].decl);
-    }
-    HeapFree(GetProcessHeap(), 0, This->decls);
-
     /* Clear the cooplevel to restore window and display mode */
     IDirectDraw7_SetCooperativeLevel(ICOM_INTERFACE(This, IDirectDraw7),
                                         NULL,
@@ -3086,6 +3078,20 @@ IDirectDrawImpl_AttachD3DDevice(IDirectDrawImpl *This,
         return hr;
     }
 
+    This->declArraySize = 2;
+    This->decls = HeapAlloc(GetProcessHeap(),
+                            HEAP_ZERO_MEMORY,
+                            sizeof(*This->decls) * This->declArraySize);
+    if(!This->decls)
+    {
+        ERR("Error allocating an array for the converted vertex decls\n");
+        This->declArraySize = 0;
+        hr = IWineD3DDevice_Uninit3D(This->wineD3DDevice,
+                                     D3D7CB_DestroyDepthStencilSurface,
+                                     D3D7CB_DestroySwapChain);
+        return E_OUTOFMEMORY;
+    }
+
     /* Create an Index Buffer parent */
     TRACE("(%p) Successfully initialized 3D\n", This);
     return DD_OK;
diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c
index 2d28626..54b35dc 100644
--- a/dlls/ddraw/main.c
+++ b/dlls/ddraw/main.c
@@ -319,13 +319,6 @@ DDRAW_Create(const GUID *guid,
     list_init(&This->surface_list);
     list_add_head(&global_ddraw_list, &This->ddraw_list_entry);
 
-    This->decls = HeapAlloc(GetProcessHeap(), 0, 0);
-    if(!This->decls)
-    {
-        ERR("Error allocating an empty array for the converted vertex decls\n");
-        goto err_out;
-    }
-
     /* Call QueryInterface to get the pointer to the requested interface. This also initializes
      * The required refcount
      */
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 1d61530..5dc823e 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -314,6 +314,13 @@ IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface)
             /* Unset any index buffer, just to be sure */
             IWineD3DDevice_SetIndices(ddraw->wineD3DDevice, NULL);
             IWineD3DDevice_SetDepthStencilSurface(ddraw->wineD3DDevice, NULL);
+            IWineD3DDevice_SetVertexDeclaration(ddraw->wineD3DDevice, NULL);
+            for(i = 0; i < ddraw->numConvertedDecls; i++)
+            {
+                IWineD3DVertexDeclaration_Release(ddraw->decls[i].decl);
+            }
+            HeapFree(GetProcessHeap(), 0, ddraw->decls);
+            ddraw->numConvertedDecls = 0;
 
             if(IWineD3DDevice_Uninit3D(ddraw->wineD3DDevice, D3D7CB_DestroyDepthStencilSurface, D3D7CB_DestroySwapChain) != D3D_OK)
             {
@@ -335,6 +342,14 @@ IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface)
             ddraw->d3d_initialized = FALSE;
             ddraw->d3d_target = NULL;
 
+            /* Reset to the default surface implementation type. This is needed if apps use
+             * non render target surfaces and expect blits to work after destroying the render
+             * target.
+             *
+             * TODO: Recreate existing offscreen surfaces
+             */
+            ddraw->ImplType = DefaultSurfaceType;
+
             /* Write a trace because D3D unloading was the reason for many
              * crashes during development.
              */




More information about the wine-cvs mailing list