From a5ecbd0b2b92d831069eb916fb573782a434606c Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Sun, 4 Oct 2015 00:14:30 +0200 Subject: [PATCH] d3d12: Do not regenerate RTTs if they didn't change between draw call. --- rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp | 5 +++++ rpcs3/Emu/RSX/D3D12/D3D12GSRender.h | 7 +++++++ rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp | 14 ++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index a7ad6b7cee..0b838b6efa 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -138,6 +138,11 @@ D3D12DLLManagement::~D3D12DLLManagement() D3D12GSRender::D3D12GSRender() : GSRender(), m_D3D12Lib(), m_PSO(nullptr) { + m_previous_address_a = 0; + m_previous_address_b = 0; + m_previous_address_c = 0; + m_previous_address_d = 0; + m_previous_address_z = 0; gfxHandler = [this](u32 addr) { bool result = invalidateAddress(addr); if (result) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index 76d2f0ffd3..889af8890c 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -463,6 +463,13 @@ private: ID3D12Resource *m_dummyTexture; size_t m_lastWidth, m_lastHeight, m_lastDepth; + + // Store previous fbo addresses to detect RTT config changes. + u32 m_previous_address_a; + u32 m_previous_address_b; + u32 m_previous_address_c; + u32 m_previous_address_d; + u32 m_previous_address_z; public: GSFrameBase2 *m_frame; u32 m_draw_frames; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp index a50d8b6caa..f9f8dc3f6c 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp @@ -14,6 +14,20 @@ void D3D12GSRender::PrepareRenderTargets(ID3D12GraphicsCommandList *copycmdlist) { + // Exit early if there is no rtt changes + if ((m_previous_address_a == m_surface_offset_a) && + (m_previous_address_b == m_surface_offset_b) && + (m_previous_address_c == m_surface_offset_c) && + (m_previous_address_d == m_surface_offset_d) && + (m_previous_address_z == m_surface_offset_z)) + return; + + m_previous_address_a = m_surface_offset_a; + m_previous_address_b = m_surface_offset_b; + m_previous_address_c = m_surface_offset_c; + m_previous_address_d = m_surface_offset_d; + m_previous_address_z = m_surface_offset_z; + // FBO location has changed, previous data might be copied u32 address_a = m_set_context_dma_color_a ? GetAddress(m_surface_offset_a, m_context_dma_color_a - 0xfeed0000) : 0; u32 address_b = m_set_context_dma_color_b ? GetAddress(m_surface_offset_b, m_context_dma_color_b - 0xfeed0000) : 0;