[PATCH 2/5] ddraw: Get rid of the surface implementation switching code.

Henri Verbeet hverbeet at codeweavers.com
Tue Aug 30 13:12:32 CDT 2011


Despite what the comment says, switching the implementation of an already
created surface isn't so straightforward.
---
 dlls/ddraw/ddraw.c       |  179 +--------------------------------------------
 dlls/ddraw/surface.c     |   25 -------
 dlls/wined3d/swapchain.c |    4 +-
 include/wine/wined3d.h   |    1 -
 4 files changed, 6 insertions(+), 203 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 1813b88..14e245b 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -206,20 +206,7 @@ static HRESULT WINAPI ddraw7_QueryInterface(IDirectDraw7 *iface, REFIID refiid,
               IsEqualGUID( &IID_IDirect3D7 , refiid ) )
     {
         /* Check the surface implementation */
-        if(This->ImplType == SURFACE_UNKNOWN)
-        {
-            /* Apps may create the IDirect3D Interface before the primary surface.
-             * set the surface implementation */
-            This->ImplType = SURFACE_OPENGL;
-            TRACE("(%p) Choosing OpenGL surfaces because a Direct3D interface was requested\n", This);
-        }
-        else if(This->ImplType != SURFACE_OPENGL && DefaultSurfaceType == SURFACE_UNKNOWN)
-        {
-            ERR("(%p) The App is requesting a D3D device, but a non-OpenGL surface type was chosen. Prepare for trouble!\n", This);
-            ERR(" (%p) You may want to contact wine-devel for help\n", This);
-            /* Should I assert(0) here??? */
-        }
-        else if(This->ImplType != SURFACE_OPENGL)
+        if (This->ImplType != SURFACE_OPENGL)
         {
             WARN("The app requests a Direct3D interface, but non-opengl surfaces where set in winecfg\n");
             /* Do not abort here, only reject 3D Device creation */
@@ -1399,8 +1386,6 @@ static HRESULT WINAPI ddraw7_GetFourCCCodes(IDirectDraw7 *iface, DWORD *NumCodes
 
     outsize = NumCodes && Codes ? *NumCodes : 0;
 
-    if(type == SURFACE_UNKNOWN) type = SURFACE_GDI;
-
     for (i = 0; i < (sizeof(formats) / sizeof(formats[0])); ++i)
     {
         hr = wined3d_check_device_format(This->wineD3D, WINED3DADAPTER_DEFAULT, WINED3DDEVTYPE_HAL,
@@ -2599,113 +2584,6 @@ static HRESULT WINAPI ddraw7_StartModeTest(IDirectDraw7 *iface, SIZE *Modes, DWO
 }
 
 /*****************************************************************************
- * ddraw_recreate_surfaces_cb
- *
- * Enumeration callback for ddraw_recreate_surface.
- * It re-recreates the WineD3DSurface. It's pretty straightforward
- *
- *****************************************************************************/
-HRESULT WINAPI ddraw_recreate_surfaces_cb(IDirectDrawSurface7 *surf, DDSURFACEDESC2 *desc, void *Context)
-{
-    IDirectDrawSurfaceImpl *surfImpl = impl_from_IDirectDrawSurface7(surf);
-    struct wined3d_resource_desc wined3d_desc;
-    struct wined3d_resource *wined3d_resource;
-    IDirectDrawImpl *This = surfImpl->ddraw;
-    struct wined3d_surface *wined3d_surface;
-    struct wined3d_swapchain *swapchain;
-    struct wined3d_clipper *clipper;
-    void *parent;
-    HRESULT hr;
-
-    TRACE("surface %p, surface_desc %p, context %p.\n",
-            surf, desc, Context);
-
-    /* For the enumeration */
-    IDirectDrawSurface7_Release(surf);
-
-    if(surfImpl->ImplType == This->ImplType) return DDENUMRET_OK; /* Continue */
-
-    /* Get the objects */
-    swapchain = surfImpl->wined3d_swapchain;
-    surfImpl->wined3d_swapchain = NULL;
-    wined3d_surface = surfImpl->wined3d_surface;
-
-    /* get the clipper */
-    clipper = wined3d_surface_get_clipper(wined3d_surface);
-
-    /* Get the surface properties */
-    wined3d_resource = wined3d_surface_get_resource(wined3d_surface);
-    wined3d_resource_get_desc(wined3d_resource, &wined3d_desc);
-
-    parent = wined3d_surface_get_parent(wined3d_surface);
-    hr = wined3d_surface_create(This->wined3d_device, wined3d_desc.width, wined3d_desc.height,
-            wined3d_desc.format, TRUE, FALSE, surfImpl->mipmap_level, wined3d_desc.usage, wined3d_desc.pool,
-            wined3d_desc.multisample_type, wined3d_desc.multisample_quality, This->ImplType,
-            parent, &ddraw_surface_wined3d_parent_ops, &surfImpl->wined3d_surface);
-    if (FAILED(hr))
-    {
-        surfImpl->wined3d_surface = wined3d_surface;
-        return hr;
-    }
-
-    wined3d_surface_set_clipper(surfImpl->wined3d_surface, clipper);
-
-    /* TODO: Copy the surface content, except for render targets */
-
-    /* If there's a swapchain, it owns the wined3d surfaces. So Destroy
-     * the swapchain
-     */
-    if (swapchain)
-    {
-        /* The backbuffers have the swapchain set as well, but the primary
-         * owns it and destroys it. */
-        if (surfImpl->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
-            wined3d_device_uninit_gdi(This->wined3d_device);
-        surfImpl->isRenderTarget = FALSE;
-    }
-    else
-    {
-        if (!wined3d_surface_decref(wined3d_surface))
-            TRACE("Surface released successful, next surface\n");
-        else
-            ERR("Something's still holding the old WineD3DSurface\n");
-    }
-
-    surfImpl->ImplType = This->ImplType;
-
-    return DDENUMRET_OK;
-}
-
-/*****************************************************************************
- * ddraw_recreate_surfaces
- *
- * A function, that converts all wineD3DSurfaces to the new implementation type
- * It enumerates all surfaces with IWineD3DDevice::EnumSurfaces, creates a
- * new WineD3DSurface, copies the content and releases the old surface
- *
- *****************************************************************************/
-static HRESULT ddraw_recreate_surfaces(IDirectDrawImpl *This)
-{
-    DDSURFACEDESC2 desc;
-    TRACE("(%p): Switch to implementation %d\n", This, This->ImplType);
-
-    if(This->ImplType != SURFACE_OPENGL && This->d3d_initialized)
-    {
-        /* Should happen almost never */
-        FIXME("(%p) Switching to non-opengl surfaces with d3d started. Is this a bug?\n", This);
-        /* Shutdown d3d */
-        wined3d_device_uninit_3d(This->wined3d_device);
-    }
-    /* Contrary: D3D starting is handled by the caller, because it knows the render target */
-
-    memset(&desc, 0, sizeof(desc));
-    desc.dwSize = sizeof(desc);
-
-    return IDirectDraw7_EnumSurfaces(&This->IDirectDraw7_iface, 0, &desc, This,
-            ddraw_recreate_surfaces_cb);
-}
-
-/*****************************************************************************
  * ddraw_create_surface
  *
  * A helper function for IDirectDraw7::CreateSurface. It creates a new surface
@@ -2734,59 +2612,10 @@ static HRESULT ddraw_create_surface(IDirectDrawImpl *This, DDSURFACEDESC2 *pDDSD
         DDRAW_dump_surface_desc(pDDSD);
     }
 
-    /* Select the surface type, if it wasn't chosen yet */
-    if(ImplType == SURFACE_UNKNOWN)
+    if ((pDDSD->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) && This->ImplType != SURFACE_OPENGL)
     {
-        /* Use GL Surfaces if a D3DDEVICE Surface is requested */
-        if(pDDSD->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)
-        {
-            TRACE("(%p) Choosing GL surfaces because a 3DDEVICE Surface was requested\n", This);
-            ImplType = SURFACE_OPENGL;
-        }
-
-        /* Otherwise use GDI surfaces for now */
-        else
-        {
-            TRACE("(%p) Choosing GDI surfaces for 2D rendering\n", This);
-            ImplType = SURFACE_GDI;
-        }
-
-        /* Policy if all surface implementations are available:
-         * First, check if a default type was set with winecfg. If not,
-         * try Xrender surfaces, and use them if they work. Next, check if
-         * accelerated OpenGL is available, and use GL surfaces in this
-         * case. If all else fails, use GDI surfaces. If a 3DDEVICE surface
-         * was created, always use OpenGL surfaces.
-         *
-         * (Note: Xrender surfaces are not implemented for now, the
-         * unaccelerated implementation uses GDI to render in Software)
-         */
-
-        /* Store the type. If it needs to be changed, all WineD3DSurfaces have to
-         * be re-created. This could be done with IDirectDrawSurface7::Restore
-         */
-        This->ImplType = ImplType;
-    }
-    else
-    {
-        if ((pDDSD->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)
-                && (This->ImplType != SURFACE_OPENGL)
-                && DefaultSurfaceType == SURFACE_UNKNOWN)
-        {
-            /* We have to change to OpenGL,
-             * and re-create all WineD3DSurfaces
-             */
-            ImplType = SURFACE_OPENGL;
-            This->ImplType = ImplType;
-            TRACE("(%p) Re-creating all surfaces\n", This);
-            ddraw_recreate_surfaces(This);
-            TRACE("(%p) Done recreating all surfaces\n", This);
-        }
-        else if(This->ImplType != SURFACE_OPENGL && pDDSD->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)
-        {
-            WARN("The application requests a 3D capable surface, but a non-opengl surface was set in the registry\n");
-            /* Do not fail surface creation, only fail 3D device creation */
-        }
+        WARN("The application requests a 3D capable surface, but a non-OpenGL surface type was set in the registry.\n");
+        /* Do not fail surface creation, only fail 3D device creation. */
     }
 
     /* Create the Surface object */
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 64a8e15..7fb9323 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -426,13 +426,6 @@ static void ddraw_surface_cleanup(IDirectDrawSurfaceImpl *surface)
 
         surface->wined3d_swapchain = NULL;
 
-        /* Reset to the default surface implementation type. This is needed
-         * if applications use non render target surfaces and expect blits to
-         * work after destroying the render target.
-         *
-         * TODO: Recreate existing offscreen surfaces. */
-        ddraw->ImplType = DefaultSurfaceType;
-
         TRACE("D3D unloaded.\n");
     }
 
@@ -2998,18 +2991,6 @@ static HRESULT WINAPI ddraw_surface7_IsLost(IDirectDrawSurface7 *iface)
     TRACE("iface %p.\n", iface);
 
     EnterCriticalSection(&ddraw_cs);
-    /* We lose the surface if the implementation was changed */
-    if(This->ImplType != This->ddraw->ImplType)
-    {
-        /* But this shouldn't happen. When we change the implementation,
-         * all surfaces are re-created automatically, and their content
-         * is copied
-         */
-        ERR(" (%p) Implementation was changed from %d to %d\n", This, This->ImplType, This->ddraw->ImplType);
-        LeaveCriticalSection(&ddraw_cs);
-        return DDERR_SURFACELOST;
-    }
-
     hr = wined3d_surface_is_lost(This->wined3d_surface);
     LeaveCriticalSection(&ddraw_cs);
     switch(hr)
@@ -3073,12 +3054,6 @@ static HRESULT WINAPI ddraw_surface7_Restore(IDirectDrawSurface7 *iface)
     TRACE("iface %p.\n", iface);
 
     EnterCriticalSection(&ddraw_cs);
-    if(This->ImplType != This->ddraw->ImplType)
-    {
-        /* Call the recreation callback. Make sure to AddRef first */
-        IDirectDrawSurface_AddRef(iface);
-        ddraw_recreate_surfaces_cb(iface, &This->surface_desc, NULL /* Not needed */);
-    }
     hr = wined3d_surface_restore(This->wined3d_surface);
     LeaveCriticalSection(&ddraw_cs);
     return hr;
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index fd2e236..d8cc0c9 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -886,8 +886,8 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, WINED3DSURFTY
             swapchain->swapchain_ops = &swapchain_gl_ops;
             break;
 
-        case SURFACE_UNKNOWN:
-            FIXME("Caller tried to create a SURFACE_UNKNOWN swapchain.\n");
+        default:
+            ERR("Invalid surface type %#x.\n", surface_type);
             return WINED3DERR_INVALIDCALL;
     }
 
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 4cdc1d7..c609637 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -783,7 +783,6 @@ typedef enum _WINED3DDECLUSAGE
 
 typedef enum _WINED3DSURFTYPE
 {
-    SURFACE_UNKNOWN                         = 0,    /* Default / Unknown surface type */
     SURFACE_OPENGL,                                 /* OpenGL surface: Renders using libGL, needed for 3D */
     SURFACE_GDI,                                    /* User surface. No 3D, DirectDraw rendering with GDI */
 } WINED3DSURFTYPE;
-- 
1.7.3.4




More information about the wine-patches mailing list