|
|
@ -26,16 +26,14 @@ using Tegra::Memory::GuestMemoryFlags; |
|
|
|
|
|
|
|
|
std::atomic<size_t> MemoryManager::unique_identifier_generator{}; |
|
|
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; |
|
|
address_space_size = 1ULL << address_space_bits; |
|
|
page_size = 1ULL << page_bits; |
|
|
page_size = 1ULL << page_bits; |
|
|
page_mask = page_size - 1ULL; |
|
|
page_mask = page_size - 1ULL; |
|
|
@ -54,10 +52,9 @@ MemoryManager::MemoryManager(Core::System& system_, MaxwellDeviceMemoryManager& |
|
|
entries.resize(page_table_size / 32, 0); |
|
|
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; |
|
|
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); |
|
|
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); |
|
|
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, |
|
|
void MemoryManager::FlushRegion(GPUVAddr gpu_addr, size_t size, |
|
|
@ -756,15 +752,13 @@ void MemoryManager::GetSubmappedRangeImpl( |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void MemoryManager::FlushCaching() { |
|
|
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); |
|
|
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 { |
|
|
const u8* MemoryManager::GetSpan(const GPUVAddr src_addr, const std::size_t size) const { |
|
|
|