aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/memory_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/memory_manager.cpp')
-rw-r--r--src/video_core/memory_manager.cpp44
1 files changed, 19 insertions, 25 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp
index 41806bfd29..c583fbdf7d 100644
--- a/src/video_core/memory_manager.cpp
+++ b/src/video_core/memory_manager.cpp
@@ -26,16 +26,14 @@ using Tegra::Memory::GuestMemoryFlags;
std::atomic<size_t> MemoryManager::unique_identifier_generator{};
-MemoryManager::MemoryManager(Core::System& system_, MaxwellDeviceMemoryManager& memory_,
- u64 address_space_bits_, GPUVAddr split_address_, u64 big_page_bits_,
- u64 page_bits_)
- : system{system_}, memory{memory_}, address_space_bits{address_space_bits_},
- split_address{split_address_}, page_bits{page_bits_}, big_page_bits{big_page_bits_},
- entries{}, big_entries{}, page_table{address_space_bits, address_space_bits + page_bits - 38,
- page_bits != big_page_bits ? page_bits : 0},
- kind_map{PTEKind::INVALID}, unique_identifier{unique_identifier_generator.fetch_add(
- 1, std::memory_order_acq_rel)},
- accumulator{std::make_unique<VideoCommon::InvalidationAccumulator>()} {
+MemoryManager::MemoryManager(Core::System& system_, MaxwellDeviceMemoryManager& memory_, u64 address_space_bits_, GPUVAddr split_address_, u64 big_page_bits_, u64 page_bits_)
+ : system{system_}, memory{memory_}, address_space_bits{address_space_bits_}
+ , split_address{split_address_}, page_bits{page_bits_}, big_page_bits{big_page_bits_}
+ , entries{}, big_entries{}
+ , page_table{address_space_bits, address_space_bits + page_bits - 38, page_bits != big_page_bits ? page_bits : 0}
+ , kind_map{PTEKind::INVALID}, unique_identifier{unique_identifier_generator.fetch_add(1, std::memory_order_acq_rel)}
+ , accumulator{}
+{
address_space_size = 1ULL << address_space_bits;
page_size = 1ULL << page_bits;
page_mask = page_size - 1ULL;
@@ -54,10 +52,9 @@ MemoryManager::MemoryManager(Core::System& system_, MaxwellDeviceMemoryManager&
entries.resize(page_table_size / 32, 0);
}
-MemoryManager::MemoryManager(Core::System& system_, u64 address_space_bits_,
- GPUVAddr split_address_, u64 big_page_bits_, u64 page_bits_)
- : MemoryManager(system_, system_.Host1x().MemoryManager(), address_space_bits_, split_address_,
- big_page_bits_, page_bits_) {}
+MemoryManager::MemoryManager(Core::System& system_, u64 address_space_bits_, GPUVAddr split_address_, u64 big_page_bits_, u64 page_bits_)
+ : MemoryManager(system_, system_.Host1x().MemoryManager(), address_space_bits_, split_address_, big_page_bits_, page_bits_)
+{}
MemoryManager::~MemoryManager() = default;
@@ -469,10 +466,9 @@ void MemoryManager::WriteBlockUnsafe(GPUVAddr gpu_dest_addr, const void* src_buf
WriteBlockImpl<false>(gpu_dest_addr, src_buffer, size, VideoCommon::CacheType::None);
}
-void MemoryManager::WriteBlockCached(GPUVAddr gpu_dest_addr, const void* src_buffer,
- std::size_t size) {
+void MemoryManager::WriteBlockCached(GPUVAddr gpu_dest_addr, const void* src_buffer, std::size_t size) {
WriteBlockImpl<false>(gpu_dest_addr, src_buffer, size, VideoCommon::CacheType::None);
- accumulator->Add(gpu_dest_addr, size);
+ accumulator.Add(gpu_dest_addr, size);
}
void MemoryManager::FlushRegion(GPUVAddr gpu_addr, size_t size,
@@ -756,15 +752,13 @@ void MemoryManager::GetSubmappedRangeImpl(
}
void MemoryManager::FlushCaching() {
- if (!accumulator->AnyAccumulated()) {
- return;
- }
- accumulator->Callback([this](GPUVAddr addr, size_t size) {
+ // Flush from the invalidate accumulator
+ if (accumulator.InvalidateAll([this](GPUVAddr addr, size_t size) {
GetSubmappedRangeImpl<false>(addr, size, page_stash2);
- });
- rasterizer->InnerInvalidation(VideoCommon::FixSmallVectorADL(page_stash2));
- page_stash2.clear();
- accumulator->Clear();
+ })) {
+ rasterizer->InnerInvalidation(VideoCommon::FixSmallVectorADL(page_stash2));
+ page_stash2.clear();
+ }
}
const u8* MemoryManager::GetSpan(const GPUVAddr src_addr, const std::size_t size) const {