diff options
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/host1x/host1x.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/memory_manager.cpp | 17 | ||||
| -rw-r--r-- | src/video_core/memory_manager.h | 8 |
4 files changed, 19 insertions, 14 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp index e6646ba04..68fe38874 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp | |||
| @@ -123,6 +123,8 @@ NvResult nvhost_as_gpu::AllocAsEx(IoctlAllocAsEx& params) { | |||
| 123 | vm.va_range_end = params.va_range_end; | 123 | vm.va_range_end = params.va_range_end; |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | const u64 max_big_page_bits = Common::Log2Ceil64(vm.va_range_end); | ||
| 127 | |||
| 126 | const auto start_pages{static_cast<u32>(vm.va_range_start >> VM::PAGE_SIZE_BITS)}; | 128 | const auto start_pages{static_cast<u32>(vm.va_range_start >> VM::PAGE_SIZE_BITS)}; |
| 127 | const auto end_pages{static_cast<u32>(vm.va_range_split >> VM::PAGE_SIZE_BITS)}; | 129 | const auto end_pages{static_cast<u32>(vm.va_range_split >> VM::PAGE_SIZE_BITS)}; |
| 128 | vm.small_page_allocator = std::make_shared<VM::Allocator>(start_pages, end_pages); | 130 | vm.small_page_allocator = std::make_shared<VM::Allocator>(start_pages, end_pages); |
| @@ -132,8 +134,8 @@ NvResult nvhost_as_gpu::AllocAsEx(IoctlAllocAsEx& params) { | |||
| 132 | static_cast<u32>((vm.va_range_end - vm.va_range_split) >> vm.big_page_size_bits)}; | 134 | static_cast<u32>((vm.va_range_end - vm.va_range_split) >> vm.big_page_size_bits)}; |
| 133 | vm.big_page_allocator = std::make_unique<VM::Allocator>(start_big_pages, end_big_pages); | 135 | vm.big_page_allocator = std::make_unique<VM::Allocator>(start_big_pages, end_big_pages); |
| 134 | 136 | ||
| 135 | gmmu = std::make_shared<Tegra::MemoryManager>(system, 40, vm.big_page_size_bits, | 137 | gmmu = std::make_shared<Tegra::MemoryManager>(system, max_big_page_bits, vm.va_range_split, |
| 136 | VM::PAGE_SIZE_BITS); | 138 | vm.big_page_size_bits, VM::PAGE_SIZE_BITS); |
| 137 | system.GPU().InitAddressSpace(*gmmu); | 139 | system.GPU().InitAddressSpace(*gmmu); |
| 138 | vm.initialised = true; | 140 | vm.initialised = true; |
| 139 | 141 | ||
diff --git a/src/video_core/host1x/host1x.cpp b/src/video_core/host1x/host1x.cpp index c4c7a5883..e923bfa22 100644 --- a/src/video_core/host1x/host1x.cpp +++ b/src/video_core/host1x/host1x.cpp | |||
| @@ -10,7 +10,7 @@ namespace Host1x { | |||
| 10 | 10 | ||
| 11 | Host1x::Host1x(Core::System& system_) | 11 | Host1x::Host1x(Core::System& system_) |
| 12 | : system{system_}, syncpoint_manager{}, | 12 | : system{system_}, syncpoint_manager{}, |
| 13 | memory_manager(system.DeviceMemory()), gmmu_manager{system, memory_manager, 32, 12}, | 13 | memory_manager(system.DeviceMemory()), gmmu_manager{system, memory_manager, 32, 0, 12}, |
| 14 | allocator{std::make_unique<Common::FlatAllocator<u32, 0, 32>>(1 << 12)} {} | 14 | allocator{std::make_unique<Common::FlatAllocator<u32, 0, 32>>(1 << 12)} {} |
| 15 | 15 | ||
| 16 | Host1x::~Host1x() = default; | 16 | Host1x::~Host1x() = default; |
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index a52f8e486..ffafc48ef 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -22,11 +22,12 @@ using Tegra::Memory::GuestMemoryFlags; | |||
| 22 | std::atomic<size_t> MemoryManager::unique_identifier_generator{}; | 22 | std::atomic<size_t> MemoryManager::unique_identifier_generator{}; |
| 23 | 23 | ||
| 24 | MemoryManager::MemoryManager(Core::System& system_, MaxwellDeviceMemoryManager& memory_, | 24 | MemoryManager::MemoryManager(Core::System& system_, MaxwellDeviceMemoryManager& memory_, |
| 25 | u64 address_space_bits_, u64 big_page_bits_, u64 page_bits_) | 25 | u64 address_space_bits_, GPUVAddr split_address_, u64 big_page_bits_, |
| 26 | u64 page_bits_) | ||
| 26 | : system{system_}, memory{memory_}, address_space_bits{address_space_bits_}, | 27 | : system{system_}, memory{memory_}, address_space_bits{address_space_bits_}, |
| 27 | page_bits{page_bits_}, big_page_bits{big_page_bits_}, entries{}, big_entries{}, | 28 | split_address{split_address_}, page_bits{page_bits_}, big_page_bits{big_page_bits_}, |
| 28 | page_table{address_space_bits, address_space_bits + page_bits - 38, | 29 | entries{}, big_entries{}, page_table{address_space_bits, address_space_bits + page_bits - 38, |
| 29 | page_bits != big_page_bits ? page_bits : 0}, | 30 | page_bits != big_page_bits ? page_bits : 0}, |
| 30 | kind_map{PTEKind::INVALID}, unique_identifier{unique_identifier_generator.fetch_add( | 31 | kind_map{PTEKind::INVALID}, unique_identifier{unique_identifier_generator.fetch_add( |
| 31 | 1, std::memory_order_acq_rel)}, | 32 | 1, std::memory_order_acq_rel)}, |
| 32 | accumulator{std::make_unique<VideoCommon::InvalidationAccumulator>()} { | 33 | accumulator{std::make_unique<VideoCommon::InvalidationAccumulator>()} { |
| @@ -48,10 +49,10 @@ MemoryManager::MemoryManager(Core::System& system_, MaxwellDeviceMemoryManager& | |||
| 48 | entries.resize(page_table_size / 32, 0); | 49 | entries.resize(page_table_size / 32, 0); |
| 49 | } | 50 | } |
| 50 | 51 | ||
| 51 | MemoryManager::MemoryManager(Core::System& system_, u64 address_space_bits_, u64 big_page_bits_, | 52 | MemoryManager::MemoryManager(Core::System& system_, u64 address_space_bits_, |
| 52 | u64 page_bits_) | 53 | GPUVAddr split_address_, u64 big_page_bits_, u64 page_bits_) |
| 53 | : MemoryManager(system_, system_.Host1x().MemoryManager(), address_space_bits_, big_page_bits_, | 54 | : MemoryManager(system_, system_.Host1x().MemoryManager(), address_space_bits_, split_address_, |
| 54 | page_bits_) {} | 55 | big_page_bits_, page_bits_) {} |
| 55 | 56 | ||
| 56 | MemoryManager::~MemoryManager() = default; | 57 | MemoryManager::~MemoryManager() = default; |
| 57 | 58 | ||
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index c5255f36c..ac7c1472a 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h | |||
| @@ -36,10 +36,11 @@ namespace Tegra { | |||
| 36 | class MemoryManager final { | 36 | class MemoryManager final { |
| 37 | public: | 37 | public: |
| 38 | explicit MemoryManager(Core::System& system_, u64 address_space_bits_ = 40, | 38 | explicit MemoryManager(Core::System& system_, u64 address_space_bits_ = 40, |
| 39 | u64 big_page_bits_ = 16, u64 page_bits_ = 12); | 39 | GPUVAddr split_address = 1ULL << 34, u64 big_page_bits_ = 16, |
| 40 | explicit MemoryManager(Core::System& system_, MaxwellDeviceMemoryManager& memory_, | ||
| 41 | u64 address_space_bits_ = 40, u64 big_page_bits_ = 16, | ||
| 42 | u64 page_bits_ = 12); | 40 | u64 page_bits_ = 12); |
| 41 | explicit MemoryManager(Core::System& system_, MaxwellDeviceMemoryManager& memory_, | ||
| 42 | u64 address_space_bits_ = 40, GPUVAddr split_address = 1ULL << 34, | ||
| 43 | u64 big_page_bits_ = 16, u64 page_bits_ = 12); | ||
| 43 | ~MemoryManager(); | 44 | ~MemoryManager(); |
| 44 | 45 | ||
| 45 | size_t GetID() const { | 46 | size_t GetID() const { |
| @@ -192,6 +193,7 @@ private: | |||
| 192 | MaxwellDeviceMemoryManager& memory; | 193 | MaxwellDeviceMemoryManager& memory; |
| 193 | 194 | ||
| 194 | const u64 address_space_bits; | 195 | const u64 address_space_bits; |
| 196 | GPUVAddr split_address; | ||
| 195 | const u64 page_bits; | 197 | const u64 page_bits; |
| 196 | u64 address_space_size; | 198 | u64 address_space_size; |
| 197 | u64 page_size; | 199 | u64 page_size; |