Stefan Dösinger : ddraw: Use EnumAttachedSurfaces to search for a render target.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Apr 27 06:43:54 CDT 2007


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Sun Apr 22 20:26:16 2007 +0200

ddraw: Use EnumAttachedSurfaces to search for a render target.

---

 dlls/ddraw/ddraw.c |   44 +++++++++++++++++++++++++++++++++++---------
 1 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 3f8cea8..df107ce 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2574,6 +2574,28 @@ IDirectDrawImpl_EnumSurfaces(IDirectDraw7 *iface,
     return DD_OK;
 }
 
+static HRESULT WINAPI
+findRenderTarget(IDirectDrawSurface7 *surface,
+                 DDSURFACEDESC2 *desc,
+                 void *ctx)
+{
+    IDirectDrawSurfaceImpl *surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, surface);
+    IDirectDrawSurfaceImpl **target = (IDirectDrawSurfaceImpl **) ctx;
+
+    if(!surf->isRenderTarget) {
+        *target = surf;
+        IDirectDrawSurface7_Release(surface);
+        return DDENUMRET_CANCEL;
+    }
+
+    /* Recurse into the surface tree */
+    IDirectDrawSurface7_EnumAttachedSurfaces(surface, ctx, findRenderTarget);
+
+    IDirectDrawSurface7_Release(surface);
+    if(*target) return DDENUMRET_CANCEL;
+    else return DDENUMRET_OK; /* Continue with the next neighbor surface */
+}
+
 /*****************************************************************************
  * D3D7CB_CreateRenderTarget
  *
@@ -2606,25 +2628,29 @@ D3D7CB_CreateRenderTarget(IUnknown *device, IUnknown *pSuperior,
                           HANDLE* pSharedHandle)
 {
     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, device);
-    IDirectDrawSurfaceImpl *d3dSurface = (IDirectDrawSurfaceImpl *) This->d3d_target->first_complex;
+    IDirectDrawSurfaceImpl *d3dSurface = This->d3d_target->first_complex, *target = NULL;
     TRACE("(%p) call back\n", device);
 
-    /* Loop through the complex chain and try to find unused primary surfaces */
-    while(d3dSurface->isRenderTarget)
+    if(d3dSurface->isRenderTarget)
+    {
+        IDirectDrawSurface7_EnumAttachedSurfaces(ICOM_INTERFACE(d3dSurface, IDirectDrawSurface7),
+                                                 &target, findRenderTarget);
+    }
+    else
     {
-        d3dSurface = d3dSurface->next_complex;
-        if(!d3dSurface) break;
+        target = d3dSurface;
     }
-    if(!d3dSurface)
+
+    if(!target)
     {
-        d3dSurface = This->d3d_target;
+        target = This->d3d_target;
         ERR(" (%p) : No DirectDrawSurface found to create the back buffer. Using the front buffer as back buffer. Uncertain consequences\n", This);
     }
 
     /* TODO: Return failure if the dimensions do not match, but this shouldn't happen */
 
-    *ppSurface = d3dSurface->WineD3DSurface;
-    d3dSurface->isRenderTarget = TRUE;
+    *ppSurface = target->WineD3DSurface;
+    target->isRenderTarget = TRUE;
     TRACE("Returning wineD3DSurface %p, it belongs to surface %p\n", *ppSurface, d3dSurface);
     return D3D_OK;
 }




More information about the wine-cvs mailing list