From 0be7e8228952c2e08644e4ebc56aa0274042bdae Mon Sep 17 00:00:00 2001 From: bunnei Date: Tue, 9 Oct 2018 19:28:58 -0400 Subject: rasterizer_cache: Reintroduce method for flushing. --- src/video_core/rasterizer_cache.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/video_core/rasterizer_cache.h') diff --git a/src/video_core/rasterizer_cache.h b/src/video_core/rasterizer_cache.h index 083b283b0..4a34491a9 100644 --- a/src/video_core/rasterizer_cache.h +++ b/src/video_core/rasterizer_cache.h @@ -17,6 +17,22 @@ template class RasterizerCache : NonCopyable { public: + /// Write any cached resources overlapping the region back to memory (if dirty) + void FlushRegion(Tegra::GPUVAddr addr, size_t size) { + if (size == 0) + return; + + const ObjectInterval interval{addr, addr + size}; + for (auto& pair : boost::make_iterator_range(object_cache.equal_range(interval))) { + for (auto& cached_object : pair.second) { + if (!cached_object) + continue; + + cached_object->Flush(); + } + } + } + /// Mark the specified region as being invalidated void InvalidateRegion(VAddr addr, u64 size) { if (size == 0) @@ -71,6 +87,7 @@ protected: void Unregister(const T& object) { auto& rasterizer = Core::System::GetInstance().Renderer().Rasterizer(); rasterizer.UpdatePagesCachedCount(object->GetAddr(), object->GetSizeInBytes(), -1); + object->Flush(); object_cache.subtract({GetInterval(object), ObjectSet{object}}); } -- cgit v1.2.3