rasterizer_cache: Expose FlushObject to Child classes and allow redefining of Register and Unregister

This commit is contained in:
Fernando Sahmkow 2019-02-08 19:24:04 -04:00 committed by FernandoS27
parent f15e2dd881
commit 45b6d2d349

View file

@ -104,7 +104,7 @@ protected:
} }
/// Register an object into the cache /// Register an object into the cache
void Register(const T& object) { virtual void Register(const T& object) {
object->SetIsRegistered(true); object->SetIsRegistered(true);
interval_cache.add({GetInterval(object), ObjectSet{object}}); interval_cache.add({GetInterval(object), ObjectSet{object}});
map_cache.insert({object->GetAddr(), object}); map_cache.insert({object->GetAddr(), object});
@ -112,7 +112,7 @@ protected:
} }
/// Unregisters an object from the cache /// Unregisters an object from the cache
void Unregister(const T& object) { virtual void Unregister(const T& object) {
object->SetIsRegistered(false); object->SetIsRegistered(false);
rasterizer.UpdatePagesCachedCount(object->GetAddr(), object->GetSizeInBytes(), -1); rasterizer.UpdatePagesCachedCount(object->GetAddr(), object->GetSizeInBytes(), -1);
// Only flush if use_accurate_gpu_emulation is enabled, as it incurs a performance hit // Only flush if use_accurate_gpu_emulation is enabled, as it incurs a performance hit
@ -129,6 +129,15 @@ protected:
return ++modified_ticks; return ++modified_ticks;
} }
/// Flushes the specified object, updating appropriate cache state as needed
void FlushObject(const T& object) {
if (!object->IsDirty()) {
return;
}
object->Flush();
object->MarkAsModified(false, *this);
}
private: private:
/// Returns a list of cached objects from the specified memory region, ordered by access time /// Returns a list of cached objects from the specified memory region, ordered by access time
std::vector<T> GetSortedObjectsFromRegion(VAddr addr, u64 size) { std::vector<T> GetSortedObjectsFromRegion(VAddr addr, u64 size) {
@ -154,15 +163,6 @@ private:
return objects; return objects;
} }
/// Flushes the specified object, updating appropriate cache state as needed
void FlushObject(const T& object) {
if (!object->IsDirty()) {
return;
}
object->Flush();
object->MarkAsModified(false, *this);
}
using ObjectSet = std::set<T>; using ObjectSet = std::set<T>;
using ObjectCache = std::unordered_map<VAddr, T>; using ObjectCache = std::unordered_map<VAddr, T>;
using IntervalCache = boost::icl::interval_map<VAddr, ObjectSet>; using IntervalCache = boost::icl::interval_map<VAddr, ObjectSet>;