Memory Tracking: Optimize tracking to only use atomic writes when contested with the host GPU
This commit is contained in:
parent
47d0d292d5
commit
da440da9f5
19 changed files with 153 additions and 38 deletions
|
@ -132,6 +132,19 @@ void BufferCache<P>::CachedWriteMemory(VAddr cpu_addr, u64 size) {
|
|||
InlineMemoryImplementation(cpu_addr, size, tmp_buffer);
|
||||
}
|
||||
|
||||
template <class P>
|
||||
bool BufferCache<P>::OnCPUWrite(VAddr cpu_addr, u64 size) {
|
||||
const bool is_dirty = IsRegionRegistered(cpu_addr, size);
|
||||
if (!is_dirty) {
|
||||
return false;
|
||||
}
|
||||
if (memory_tracker.IsRegionGpuModified(cpu_addr, size)) {
|
||||
return true;
|
||||
}
|
||||
WriteMemory(cpu_addr, size);
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class P>
|
||||
std::optional<VideoCore::RasterizerDownloadArea> BufferCache<P>::GetFlushArea(VAddr cpu_addr,
|
||||
u64 size) {
|
||||
|
@ -1574,7 +1587,7 @@ bool BufferCache<P>::InlineMemory(VAddr dest_address, size_t copy_size,
|
|||
|
||||
template <class P>
|
||||
void BufferCache<P>::InlineMemoryImplementation(VAddr dest_address, size_t copy_size,
|
||||
std::span<const u8> inlined_buffer) {
|
||||
std::span<const u8> inlined_buffer) {
|
||||
const IntervalType subtract_interval{dest_address, dest_address + copy_size};
|
||||
ClearDownload(subtract_interval);
|
||||
common_ranges.subtract(subtract_interval);
|
||||
|
|
|
@ -245,6 +245,8 @@ public:
|
|||
|
||||
void CachedWriteMemory(VAddr cpu_addr, u64 size);
|
||||
|
||||
bool OnCPUWrite(VAddr cpu_addr, u64 size);
|
||||
|
||||
void DownloadMemory(VAddr cpu_addr, u64 size);
|
||||
|
||||
std::optional<VideoCore::RasterizerDownloadArea> GetFlushArea(VAddr cpu_addr, u64 size);
|
||||
|
@ -543,7 +545,8 @@ private:
|
|||
|
||||
void ClearDownload(IntervalType subtract_interval);
|
||||
|
||||
void InlineMemoryImplementation(VAddr dest_address, size_t copy_size, std::span<const u8> inlined_buffer);
|
||||
void InlineMemoryImplementation(VAddr dest_address, size_t copy_size,
|
||||
std::span<const u8> inlined_buffer);
|
||||
|
||||
VideoCore::RasterizerInterface& rasterizer;
|
||||
Core::Memory::Memory& cpu_memory;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue