Module: wine Branch: master Commit: cbc009b8d2fdd89cd81aa0f45e012b1d25193c26 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cbc009b8d2fdd89cd81aa0f45e...
Author: Henri Verbeet hverbeet@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)