diff options
| author | 2019-03-22 18:41:12 -0400 | |
|---|---|---|
| committer | 2019-03-22 18:41:12 -0400 | |
| commit | e5893db3e618fd276733a24eebc0606c5fd1e7f2 (patch) | |
| tree | 5a3ae98bb04d3fb3f513a51504b63940e70c5130 /src/core | |
| parent | Merge pull request #2277 from bunnei/fix-smo-transitions (diff) | |
| parent | memory_manager: Cleanup FindFreeRegion. (diff) | |
| download | yuzu-e5893db3e618fd276733a24eebc0606c5fd1e7f2.tar.gz yuzu-e5893db3e618fd276733a24eebc0606c5fd1e7f2.tar.xz yuzu-e5893db3e618fd276733a24eebc0606c5fd1e7f2.zip | |
Merge pull request #2256 from bunnei/gpu-vmm
gpu: Rewrite MemoryManager based on the VMManager implementation.
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp | 16 | ||||
| -rw-r--r-- | src/core/memory.cpp | 2 |
2 files changed, 5 insertions, 13 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 b031ebc66..af62d33d2 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp | |||
| @@ -89,7 +89,7 @@ u32 nvhost_as_gpu::Remap(const std::vector<u8>& input, std::vector<u8>& output) | |||
| 89 | for (const auto& entry : entries) { | 89 | for (const auto& entry : entries) { |
| 90 | LOG_WARNING(Service_NVDRV, "remap entry, offset=0x{:X} handle=0x{:X} pages=0x{:X}", | 90 | LOG_WARNING(Service_NVDRV, "remap entry, offset=0x{:X} handle=0x{:X} pages=0x{:X}", |
| 91 | entry.offset, entry.nvmap_handle, entry.pages); | 91 | entry.offset, entry.nvmap_handle, entry.pages); |
| 92 | Tegra::GPUVAddr offset = static_cast<Tegra::GPUVAddr>(entry.offset) << 0x10; | 92 | GPUVAddr offset = static_cast<GPUVAddr>(entry.offset) << 0x10; |
| 93 | auto object = nvmap_dev->GetObject(entry.nvmap_handle); | 93 | auto object = nvmap_dev->GetObject(entry.nvmap_handle); |
| 94 | if (!object) { | 94 | if (!object) { |
| 95 | LOG_CRITICAL(Service_NVDRV, "nvmap {} is an invalid handle!", entry.nvmap_handle); | 95 | LOG_CRITICAL(Service_NVDRV, "nvmap {} is an invalid handle!", entry.nvmap_handle); |
| @@ -102,7 +102,7 @@ u32 nvhost_as_gpu::Remap(const std::vector<u8>& input, std::vector<u8>& output) | |||
| 102 | u64 size = static_cast<u64>(entry.pages) << 0x10; | 102 | u64 size = static_cast<u64>(entry.pages) << 0x10; |
| 103 | ASSERT(size <= object->size); | 103 | ASSERT(size <= object->size); |
| 104 | 104 | ||
| 105 | Tegra::GPUVAddr returned = gpu.MemoryManager().MapBufferEx(object->addr, offset, size); | 105 | GPUVAddr returned = gpu.MemoryManager().MapBufferEx(object->addr, offset, size); |
| 106 | ASSERT(returned == offset); | 106 | ASSERT(returned == offset); |
| 107 | } | 107 | } |
| 108 | std::memcpy(output.data(), entries.data(), output.size()); | 108 | std::memcpy(output.data(), entries.data(), output.size()); |
| @@ -173,16 +173,8 @@ u32 nvhost_as_gpu::UnmapBuffer(const std::vector<u8>& input, std::vector<u8>& ou | |||
| 173 | return 0; | 173 | return 0; |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | auto& system_instance = Core::System::GetInstance(); | 176 | params.offset = Core::System::GetInstance().GPU().MemoryManager().UnmapBuffer(params.offset, |
| 177 | 177 | itr->second.size); | |
| 178 | // Remove this memory region from the rasterizer cache. | ||
| 179 | auto& gpu = system_instance.GPU(); | ||
| 180 | auto cpu_addr = gpu.MemoryManager().GpuToCpuAddress(params.offset); | ||
| 181 | ASSERT(cpu_addr); | ||
| 182 | gpu.FlushAndInvalidateRegion(ToCacheAddr(Memory::GetPointer(*cpu_addr)), itr->second.size); | ||
| 183 | |||
| 184 | params.offset = gpu.MemoryManager().UnmapBuffer(params.offset, itr->second.size); | ||
| 185 | |||
| 186 | buffer_mappings.erase(itr->second.offset); | 178 | buffer_mappings.erase(itr->second.offset); |
| 187 | 179 | ||
| 188 | std::memcpy(output.data(), ¶ms, output.size()); | 180 | std::memcpy(output.data(), ¶ms, output.size()); |
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 365ac82b4..332c1037c 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -48,7 +48,7 @@ static void MapPages(Common::PageTable& page_table, VAddr base, u64 size, u8* me | |||
| 48 | (base + size) * PAGE_SIZE); | 48 | (base + size) * PAGE_SIZE); |
| 49 | 49 | ||
| 50 | // During boot, current_page_table might not be set yet, in which case we need not flush | 50 | // During boot, current_page_table might not be set yet, in which case we need not flush |
| 51 | if (current_page_table) { | 51 | if (Core::System::GetInstance().IsPoweredOn()) { |
| 52 | Core::System::GetInstance().GPU().FlushAndInvalidateRegion(base << PAGE_BITS, | 52 | Core::System::GetInstance().GPU().FlushAndInvalidateRegion(base << PAGE_BITS, |
| 53 | size * PAGE_SIZE); | 53 | size * PAGE_SIZE); |
| 54 | } | 54 | } |