From 8cdaf19a83514d515235914ee1d389bd0cf39e65 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 28 Apr 2026 00:24:54 +0200 Subject: [video_core] simplify InvalidationAccumulator (#3890) various redundant fields aren't required, so just redo it for good measure Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3890 Reviewed-by: crueter Reviewed-by: CamilleLaVey --- src/video_core/memory_manager.cpp | 44 +++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 25 deletions(-) (limited to 'src/video_core/memory_manager.cpp') 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 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()} { +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(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(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(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 { -- cgit v1.2.3