From d47183e89e6b688f52c37210d308ddac10afe117 Mon Sep 17 00:00:00 2001 From: Jake Date: Thu, 3 Aug 2017 19:03:01 -0500 Subject: [PATCH] rsx: invalidate cache every frame: invalidate unbound rtt's in surface store --- rpcs3/Emu/RSX/Common/surface_store.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/rpcs3/Emu/RSX/Common/surface_store.h b/rpcs3/Emu/RSX/Common/surface_store.h index f8910839a7..a9e317ef98 100644 --- a/rpcs3/Emu/RSX/Common/surface_store.h +++ b/rpcs3/Emu/RSX/Common/surface_store.h @@ -3,6 +3,7 @@ #include "Utilities/GSL.h" #include "../GCM.h" #include +#include namespace rsx { @@ -115,6 +116,8 @@ namespace rsx std::list invalidated_resources; + std::unordered_set m_prev_bound_targets = {}; + surface_store() = default; ~surface_store() = default; surface_store(const surface_store&) = delete; @@ -283,6 +286,7 @@ namespace rsx // Create/Reuse requested rtts for (u8 surface_index : utility::get_rtt_indexes(set_surface_target)) { + m_prev_bound_targets.insert(surface_addresses[surface_index]); if (surface_addresses[surface_index] == 0) continue; @@ -477,6 +481,22 @@ namespace rsx for (auto &ds : m_depth_stencil_storage) Traits::invalidate_depth_surface_contents(command_list, Traits::get(std::get<1>(ds)), nullptr, true); + + for (auto it = m_render_targets_storage.begin(); it != m_render_targets_storage.end();) + { + auto check = std::find(m_prev_bound_targets.cbegin(), m_prev_bound_targets.cend(), it->first); + if (check == m_prev_bound_targets.end()) + { + surface_storage_type &rtt = it->second; + invalidated_resources.push_back(std::move(rtt)); + it = m_render_targets_storage.erase(it); + } + else + { + ++it; + } + } + m_prev_bound_targets.clear(); } /**