Module: wine
Branch: master
Commit: bbfbd66d9ff07623237aff04bf7c06dd0be8aa31
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bbfbd66d9ff07623237aff04b…
Author: Henri Verbeet <hverbeet(a)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);
Module: wine
Branch: master
Commit: cbc009b8d2fdd89cd81aa0f45e012b1d25193c26
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cbc009b8d2fdd89cd81aa0f45…
Author: Henri Verbeet <hverbeet(a)codeweavers.com>
Date: Wed Sep 7 20:21:58 2011 +0200
ddraw: Also check errors returned by ddraw_create_gdi_swapchain() in CreateSurface().
---
dlls/ddraw/ddraw.c | 80 +++++++++++++++++++++++++++------------------------
1 files changed, 42 insertions(+), 38 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 24d3647..7dd0f2d 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -3209,49 +3209,57 @@ static HRESULT CreateSurface(IDirectDrawImpl *ddraw, DDSURFACEDESC2 *DDSD,
return hr;
}
- /* 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 && !ddraw->d3d_initialized
- && desc2.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE))
- {
- IDirectDrawSurfaceImpl *target = object, *surface;
- struct list *entry;
-
- /* Search for the primary to use as render target */
- LIST_FOR_EACH(entry, &ddraw->surface_list)
+ 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)
{
- surface = LIST_ENTRY(entry, IDirectDrawSurfaceImpl, surface_list_entry);
- if((surface->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_FRONTBUFFER)) ==
- (DDSCAPS_PRIMARYSURFACE | DDSCAPS_FRONTBUFFER))
+ IDirectDrawSurfaceImpl *target = object, *surface;
+ struct list *entry;
+
+ /* Search for the primary to use as render target. */
+ LIST_FOR_EACH(entry, &ddraw->surface_list)
{
- /* found */
- target = surface;
- TRACE("Using primary %p as render target\n", target);
- break;
+ 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);
}
- TRACE("(%p) Attaching a D3DDevice, rendertarget = %p\n", ddraw, target);
- hr = ddraw_attach_d3d_device(ddraw, target);
- if (hr != D3D_OK)
+ if (FAILED(hr))
{
IDirectDrawSurfaceImpl *release_surf;
- ERR("ddraw_attach_d3d_device failed, hr %#x\n", hr);
+ ERR("Failed to create swapchain, hr %#x.\n", hr);
*Surf = NULL;
- /* The before created surface structures are in an incomplete state here.
- * WineD3D holds the reference on the IParents, and it released them on the failure
- * already. So the regular release method implementation would fail on the attempt
- * to destroy either the IParents or the swapchain. So free the surface here.
- * The surface structure here is a list, not a tree, because onscreen targets
- * cannot be cube textures
- */
- while(object)
+ /* The earlier created surface structures are in an incomplete
+ * state here. Wined3d holds the reference on the parents, and it
+ * released them on the failure already. So the regular release
+ * method implementation would fail on the attempt to destroy
+ * either the parents or the swapchain. So free the surface here.
+ * The surface structure here is a list, not a tree, because
+ * onscreen targets cannot be cube textures. */
+ while (object)
{
release_surf = object;
object = object->complex_array[0];
@@ -3261,10 +3269,6 @@ static HRESULT CreateSurface(IDirectDrawImpl *ddraw, DDSURFACEDESC2 *DDSD,
return hr;
}
}
- else if(!(ddraw->d3d_initialized) && desc2.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
- {
- ddraw_create_gdi_swapchain(ddraw, object);
- }
/* Create a WineD3DTexture if a texture was requested */
if (desc2.ddsCaps.dwCaps & DDSCAPS_TEXTURE)