diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index 4bb5d6fd7..761d12b71 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -155,6 +155,8 @@ static std::queue g_Xbox_CallbackQueue; static bool g_bHack_DisableHostGPUQueries = false; // TODO : Make configurable static IDirect3DQuery *g_pHostQueryWaitForIdle = nullptr; static IDirect3DQuery *g_pHostQueryCallbackEvent = nullptr; +static int g_RenderUpscaleFactor = 1; +static int g_RenderTargetUpscaleFactor = 1; static std::condition_variable g_VBConditionVariable; // Used in BlockUntilVerticalBlank static std::mutex g_VBConditionMutex; // Used in BlockUntilVerticalBlank @@ -2275,6 +2277,7 @@ static DWORD WINAPI EmuCreateDeviceProxy(LPVOID) if (g_EmuCDPD.bCreate) { // Apply render scale factor for high-resolution rendering g_RenderUpscaleFactor = g_XBVideo.renderScaleFactor; + g_RenderTargetUpscaleFactor = 1; // Setup the HostPresentationParameters { @@ -3077,14 +3080,6 @@ void GetRenderTargetBaseDimensions(float& x, float& y) { y /= aaY; } -// Get the host upscale factor for the current rendertarget -// Currently, only the host backbuffer is upscaled -int GetRenderTargetUpscaleFactor() { - return g_pXbox_RenderTarget == g_pXbox_BackBufferSurface - ? g_RenderUpscaleFactor - : 1; -} - void Direct3D_CreateDevice_Start ( xbox::X_D3DPRESENT_PARAMETERS *pPresentationParameters @@ -3162,7 +3157,8 @@ void Direct3D_CreateDevice_End() } // We must also properly setup the host state - // Update only the Back buffer + // Update only the Back buffer, not the depth buffer + // This will also update g_RenderTargetUpscaleFactor and g_ZScale CxbxImpl_SetRenderTarget(g_pXbox_BackBufferSurface, xbox::zeroptr); } @@ -4120,8 +4116,8 @@ void ValidateRenderTargetDimensions(DWORD HostRenderTarget_Width, DWORD HostRend // Because of this, we need to validate that the associated host resource still matches the dimensions of the Xbox Render Target // If not, we must force them to be re-created // TEST CASE: Chihiro Factory Test Program - DWORD XboxRenderTarget_Width_Scaled = XboxRenderTarget_Width * GetRenderTargetUpscaleFactor(); - DWORD XboxRenderTarget_Height_Scaled = XboxRenderTarget_Height * GetRenderTargetUpscaleFactor(); + DWORD XboxRenderTarget_Width_Scaled = XboxRenderTarget_Width * g_RenderTargetUpscaleFactor; + DWORD XboxRenderTarget_Height_Scaled = XboxRenderTarget_Height * g_RenderTargetUpscaleFactor; if (HostRenderTarget_Width != XboxRenderTarget_Width_Scaled || HostRenderTarget_Height != XboxRenderTarget_Height_Scaled) { LOG_TEST_CASE("Existing RenderTarget width/height changed"); @@ -4862,14 +4858,15 @@ xbox::void_xt WINAPI xbox::EMUPATCH(D3DDevice_Clear) // Scale the fill based on our scale factor and MSAA scale float aaX, aaY; GetMultiSampleScaleRaw(aaX, aaY); - auto rtUpscale = GetRenderTargetUpscaleFactor(); + aaX *= g_RenderTargetUpscaleFactor; + aaY *= g_RenderTargetUpscaleFactor; std::vector rects(Count); for (DWORD i = 0; i < Count; i++) { - rects[i].x1 = static_cast(pRects[i].x1 * aaX * rtUpscale); - rects[i].x2 = static_cast(pRects[i].x2 * aaX * rtUpscale); - rects[i].y1 = static_cast(pRects[i].y1 * aaY * rtUpscale); - rects[i].y2 = static_cast(pRects[i].y2 * aaY * rtUpscale); + rects[i].x1 = static_cast(pRects[i].x1 * aaX); + rects[i].x2 = static_cast(pRects[i].x2 * aaX); + rects[i].y1 = static_cast(pRects[i].y1 * aaY); + rects[i].y2 = static_cast(pRects[i].y2 * aaY); } hRet = g_pD3DDevice->Clear(Count, rects.data(), HostFlags, Color, Z, Stencil); } else { @@ -7138,15 +7135,16 @@ void CxbxUpdateHostViewport() { LOG_TEST_CASE("Could not get rendertarget dimensions while setting the viewport"); } - auto rtUpscale = GetRenderTargetUpscaleFactor(); + aaScaleX *= g_RenderTargetUpscaleFactor; + aaScaleY *= g_RenderTargetUpscaleFactor; if (g_Xbox_VertexShader_IsFixedFunction) { // Set viewport D3DVIEWPORT hostViewport = g_Xbox_Viewport; - hostViewport.X *= (aaScaleX * rtUpscale); - hostViewport.Y *= (aaScaleY * rtUpscale); - hostViewport.Width *= (aaScaleX * rtUpscale); - hostViewport.Height *= (aaScaleY * rtUpscale); + hostViewport.X *= aaScaleX; + hostViewport.Y *= aaScaleY; + hostViewport.Width *= aaScaleX; + hostViewport.Height *= aaScaleY; g_pD3DDevice->SetViewport(&hostViewport); // Reset scissor rect @@ -7178,10 +7176,10 @@ void CxbxUpdateHostViewport() { // Scissor to viewport g_pD3DDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); RECT viewportRect; - viewportRect.left = g_Xbox_Viewport.X * aaScaleX * rtUpscale; - viewportRect.top = g_Xbox_Viewport.Y * aaScaleY * rtUpscale; - viewportRect.right = viewportRect.left + g_Xbox_Viewport.Width * aaScaleX * rtUpscale; - viewportRect.bottom = viewportRect.top + g_Xbox_Viewport.Height * aaScaleY * rtUpscale; + viewportRect.left = g_Xbox_Viewport.X * aaScaleX; + viewportRect.top = g_Xbox_Viewport.Y * aaScaleY; + viewportRect.right = viewportRect.left + g_Xbox_Viewport.Width * aaScaleX; + viewportRect.bottom = viewportRect.top + g_Xbox_Viewport.Height * aaScaleY; g_pD3DDevice->SetScissorRect(&viewportRect); } } @@ -7877,6 +7875,10 @@ static void CxbxImpl_SetRenderTarget } } + // Get the host upscale factor for the current rendertarget + // Currently, only the host backbuffer is upscaled + g_RenderTargetUpscaleFactor = (g_pXbox_RenderTarget == g_pXbox_BackBufferSurface) ? g_RenderUpscaleFactor : 1; + // Set default viewport now we've updated the rendertarget // Note the Xbox does this, but before _our_ SetRenderTarget sets up the render target // Test case: Dashboard diff --git a/src/core/kernel/support/Emu.cpp b/src/core/kernel/support/Emu.cpp index 7a54920e6..a89ef301f 100644 --- a/src/core/kernel/support/Emu.cpp +++ b/src/core/kernel/support/Emu.cpp @@ -51,7 +51,6 @@ volatile bool g_bPrintfOn = true; bool g_DisablePixelShaders = false; bool g_UseAllCores = false; bool g_SkipRdtscPatching = false; -int g_RenderUpscaleFactor = 1; // Delta added to host SystemTime, used in KiClockIsr and KeSetSystemTime // This shouldn't need to be atomic, but because raising the IRQL to high lv in KeSetSystemTime doesn't really stop KiClockIsr from running, diff --git a/src/core/kernel/support/Emu.h b/src/core/kernel/support/Emu.h index 4e2c16f53..3517827c8 100644 --- a/src/core/kernel/support/Emu.h +++ b/src/core/kernel/support/Emu.h @@ -95,5 +95,4 @@ typedef WORD INDEX16; extern bool g_DisablePixelShaders; extern bool g_UseAllCores; extern bool g_SkipRdtscPatching; -extern int g_RenderUpscaleFactor; #endif