2009/12/2 Stefan Dösinger <stefan(a)codeweavers.com>:
- updateSurfaceDesc((IWineD3DSurfaceImpl *)swapchain->frontBuffer, pPresentationParameters); + hr = updateSurfaceDesc((IWineD3DSurfaceImpl *)swapchain->frontBuffer, pPresentationParameters); + if(FAILED(hr)) + { + IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); + return hr; + } + for(i = 0; i < swapchain->presentParms.BackBufferCount; i++) { - updateSurfaceDesc((IWineD3DSurfaceImpl *)swapchain->backBuffer[i], pPresentationParameters); + hr = updateSurfaceDesc((IWineD3DSurfaceImpl *)swapchain->backBuffer[i], pPresentationParameters); + if(FAILED(hr)) + { + IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); + return hr; + } } IWineD3DDeviceImpl_Reset() suffers from similar issues in general, so maybe we just don't care, but if one of the updateSurfaceDesc() calls fails you're left with inconsistent surface sizes.
+ This->Flags |= SFLAG_INSYSMEM; Why is this in surface_init_sysmem(), instead of a ModifyLocation() call after the call to surface_init_sysmem()?