From 6071e998fd3bcc71defe0a4cf4a01dcd4ce6919b Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Sat, 24 Jul 2021 23:47:17 +0200 Subject: [PATCH] [d3d9] Handle invalid modes in Device::Reset --- src/d3d9/d3d9_device.cpp | 6 ++++-- src/d3d9/d3d9_swapchain.cpp | 16 +++++++++++----- src/d3d9/d3d9_swapchain.h | 2 +- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index a797d574..02a3a15c 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -7079,8 +7079,10 @@ namespace dxvk { } } - if (m_implicitSwapchain != nullptr) - m_implicitSwapchain->Reset(pPresentationParameters, pFullscreenDisplayMode); + if (m_implicitSwapchain != nullptr) { + if (FAILED(m_implicitSwapchain->Reset(pPresentationParameters, pFullscreenDisplayMode))) + return D3DERR_INVALIDCALL; + } else m_implicitSwapchain = new D3D9SwapChainEx(this, pPresentationParameters, pFullscreenDisplayMode); diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp index a374e155..6b80f1c4 100644 --- a/src/d3d9/d3d9_swapchain.cpp +++ b/src/d3d9/d3d9_swapchain.cpp @@ -594,7 +594,7 @@ namespace dxvk { } - void D3D9SwapChainEx::Reset( + HRESULT D3D9SwapChainEx::Reset( D3DPRESENT_PARAMETERS* pPresentParams, D3DDISPLAYMODEEX* pFullscreenDisplayMode) { D3D9DeviceLock lock = m_parent->LockDevice(); @@ -627,13 +627,17 @@ namespace dxvk { newRect.right - newRect.left, newRect.bottom - newRect.top, TRUE); } else { - if (changeFullscreen) - this->EnterFullscreenMode(pPresentParams, pFullscreenDisplayMode); + if (changeFullscreen) { + if (FAILED(this->EnterFullscreenMode(pPresentParams, pFullscreenDisplayMode))) + return D3DERR_INVALIDCALL; + } D3D9WindowMessageFilter filter(m_window); - if (!changeFullscreen) - ChangeDisplayMode(pPresentParams, pFullscreenDisplayMode); + if (!changeFullscreen) { + if (FAILED(ChangeDisplayMode(pPresentParams, pFullscreenDisplayMode))) + return D3DERR_INVALIDCALL; + } // Move the window so that it covers the entire output RECT rect; @@ -650,6 +654,8 @@ namespace dxvk { SetGammaRamp(0, &m_ramp); CreateBackBuffers(m_presentParams.BackBufferCount); + + return D3D_OK; } diff --git a/src/d3d9/d3d9_swapchain.h b/src/d3d9/d3d9_swapchain.h index 24feb3ef..150578ca 100644 --- a/src/d3d9/d3d9_swapchain.h +++ b/src/d3d9/d3d9_swapchain.h @@ -56,7 +56,7 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE GetDisplayModeEx(D3DDISPLAYMODEEX* pMode, D3DDISPLAYROTATION* pRotation); - void Reset( + HRESULT Reset( D3DPRESENT_PARAMETERS* pPresentParams, D3DDISPLAYMODEEX* pFullscreenDisplayMode);