Henri Verbeet : ddraw: Introduce a function for creating the swapchain.
Alexandre Julliard
julliard at winehq.org
Thu Sep 8 14:52:10 CDT 2011
Module: wine
Branch: master
Commit: bbfbd66d9ff07623237aff04bf7c06dd0be8aa31
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bbfbd66d9ff07623237aff04bf7c06dd0be8aa31
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Wed Sep 7 20:21:59 2011 +0200
ddraw: Introduce a function for creating the swapchain.
---
dlls/ddraw/ddraw.c | 78 ++++++++++++++++++++++++++++------------------------
1 files changed, 42 insertions(+), 36 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 7dd0f2d..001a2be 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2833,6 +2833,47 @@ static HRESULT ddraw_create_gdi_swapchain(IDirectDrawImpl *ddraw, IDirectDrawSur
return hr;
}
+static HRESULT ddraw_create_swapchain(IDirectDrawImpl *ddraw, IDirectDrawSurfaceImpl *surface)
+{
+ HRESULT hr = WINED3D_OK;
+
+ /* If the implementation is OpenGL and there's no d3ddevice, attach a
+ * d3ddevice. But attach the d3ddevice only if the currently created
+ * surface was a primary surface (2D app in 3D mode) or a 3DDEVICE surface
+ * (3D app). The only case I can think of where this doesn't apply is when
+ * a 2D app was configured by the user to run with OpenGL and it didn't
+ * create the render target as first surface. In this case the render
+ * target creation will cause the 3D init. */
+ if (DefaultSurfaceType == SURFACE_OPENGL)
+ {
+ IDirectDrawSurfaceImpl *target = surface, *primary;
+ struct list *entry;
+
+ /* Search for the primary to use as render target. */
+ LIST_FOR_EACH(entry, &ddraw->surface_list)
+ {
+ primary = LIST_ENTRY(entry, IDirectDrawSurfaceImpl, surface_list_entry);
+ if ((primary->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_FRONTBUFFER))
+ == (DDSCAPS_PRIMARYSURFACE | DDSCAPS_FRONTBUFFER))
+ {
+ TRACE("Using primary %p as render target.\n", target);
+ target = primary;
+ break;
+ }
+ }
+
+ TRACE("Attaching a D3DDevice, rendertarget = %p.\n", target);
+ hr = ddraw_attach_d3d_device(ddraw, target);
+ }
+ else if (surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
+ {
+ hr = ddraw_create_gdi_swapchain(ddraw, surface);
+ }
+
+ return hr;
+
+}
+
/*****************************************************************************
* IDirectDraw7::CreateSurface
*
@@ -3211,42 +3252,7 @@ static HRESULT CreateSurface(IDirectDrawImpl *ddraw, DDSURFACEDESC2 *DDSD,
if (!ddraw->d3d_initialized && desc2.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE))
{
- HRESULT hr = WINED3D_OK;
-
- /* If the implementation is OpenGL and there's no d3ddevice, attach a
- * d3ddevice. But attach the d3ddevice only if the currently created
- * surface was a primary surface (2D app in 3D mode) or a 3DDEVICE
- * surface (3D app). The only case I can think of where this doesn't
- * apply is when a 2D app was configured by the user to run with
- * OpenGL and it didn't create the render target as first surface. In
- * this case the render target creation will cause the 3D init. */
- if (DefaultSurfaceType == SURFACE_OPENGL)
- {
- IDirectDrawSurfaceImpl *target = object, *surface;
- struct list *entry;
-
- /* Search for the primary to use as render target. */
- LIST_FOR_EACH(entry, &ddraw->surface_list)
- {
- surface = LIST_ENTRY(entry, IDirectDrawSurfaceImpl, surface_list_entry);
- if ((surface->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_FRONTBUFFER))
- == (DDSCAPS_PRIMARYSURFACE | DDSCAPS_FRONTBUFFER))
- {
- TRACE("Using primary %p as render target.\n", target);
- target = surface;
- break;
- }
- }
-
- TRACE("Attaching a D3DDevice, rendertarget = %p.\n", target);
- hr = ddraw_attach_d3d_device(ddraw, target);
- }
- else if (desc2.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
- {
- hr = ddraw_create_gdi_swapchain(ddraw, object);
- }
-
- if (FAILED(hr))
+ if (FAILED(hr = ddraw_create_swapchain(ddraw, object)))
{
IDirectDrawSurfaceImpl *release_surf;
ERR("Failed to create swapchain, hr %#x.\n", hr);
More information about the wine-cvs
mailing list