|
|
@ -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>; |
|
|
|