diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 19135d8f31..581780eaa4 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -1248,6 +1248,7 @@ void D3D12GSRender::Flip() CloseHandle(handle); m_perFrameStorage.Reset(); m_texturesRTTs.clear(); + m_texturesCache.clear(); m_frame->Flip(nullptr); } diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index 7f7492565b..01b5055dea 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -49,6 +49,8 @@ class D3D12GSRender : public GSRender private: // Copy of RTT to be used as texture std::unordered_map > m_texturesRTTs; + + std::unordered_map m_texturesCache; // std::vector m_post_draw_objs; PipelineStateObjectCache m_cachePSO; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp index 2f9ce01ca1..e2dd61a3d4 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp @@ -146,10 +146,15 @@ size_t D3D12GSRender::UploadTextures() } ID3D12Resource *vramTexture; - std::unordered_map >::const_iterator It = m_texturesRTTs.find(texaddr); - if (It != m_texturesRTTs.end()) + std::unordered_map >::const_iterator ItRTT = m_texturesRTTs.find(texaddr); + std::unordered_map::const_iterator ItCache = m_texturesCache.find(texaddr); + if (ItRTT != m_texturesRTTs.end()) { - vramTexture = It->second.Get(); + vramTexture = ItRTT->second.Get(); + } + else if (ItCache != m_texturesCache.end()) + { + vramTexture = ItCache->second; } else { @@ -242,6 +247,7 @@ size_t D3D12GSRender::UploadTextures() commandList->Close(); m_commandQueueGraphic->ExecuteCommandLists(1, (ID3D12CommandList**)&commandList); m_perFrameStorage.m_inflightCommandList.push_back(commandList); + m_texturesCache[texaddr] = vramTexture; } D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};