From 196f1a74fd4dab9cf13d04b11b6af5f689001f23 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Wed, 3 Jul 2019 08:19:26 +0100 Subject: [PATCH] Disable new behavior when backbuffer hack is enabled: The two are incompatible --- src/core/hle/D3D8/Direct3D9/Direct3D9.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index d0cf4da90..f02155cc1 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -3226,12 +3226,20 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_SetViewport) GetHostRenderTargetDimensions(&HostRenderTarget_Width, &HostRenderTarget_Height); if (HostRenderTarget_Width != XboxRenderTarget_Width || HostRenderTarget_Height != XboxRenderTarget_Height) { LOG_TEST_CASE("RenderTarget width/height changed without calling SetRenderTarget"); - FreeHostResource(GetHostResourceKey(g_pXboxRenderTarget)); g_pD3DDevice->SetRenderTarget(0, GetHostSurface(g_pXboxRenderTarget, D3DUSAGE_RENDERTARGET)); - FreeHostResource(GetHostResourceKey(g_pXboxDepthStencil)); g_pD3DDevice->SetDepthStencilSurface(GetHostSurface(g_pXboxRenderTarget, D3DUSAGE_DEPTHSTENCIL)); + + // NOTE: If the host backbuffer hack is enabled, we must skip this operation for the back buffer, otherwise everything will break + // In that situation, there's nothing we can do without causing damage. + if (!g_DirectHostBackBufferAccess && g_pXboxRenderTarget != g_XboxBackBufferSurface) { + FreeHostResource(GetHostResourceKey(g_pXboxRenderTarget)); g_pD3DDevice->SetRenderTarget(0, GetHostSurface(g_pXboxRenderTarget, D3DUSAGE_RENDERTARGET)); + FreeHostResource(GetHostResourceKey(g_pXboxDepthStencil)); g_pD3DDevice->SetDepthStencilSurface(GetHostSurface(g_pXboxRenderTarget, D3DUSAGE_DEPTHSTENCIL)); + } } // Store the updated viewport data ready to pass to host SetViewPort - HostViewPort = XboxViewPort; + // Again, we can only do this when the host backbuffer hack is disabled, otherwise, we break + if (!g_DirectHostBackBufferAccess && g_pXboxRenderTarget != g_XboxBackBufferSurface) { + HostViewPort = XboxViewPort; + } if (g_ScaleViewport) { // Get current host render target dimensions