diff options
| author | 2018-05-20 23:54:50 -0400 | |
|---|---|---|
| committer | 2018-05-20 23:54:50 -0400 | |
| commit | 58857b9f46992753059aa8a6c31aff0ee14c9f99 (patch) | |
| tree | d49a9d594878a2c2a948b13109e1a6e6c07ffaba /src/video_core | |
| parent | Correct audio command numbers & add or rename some functions (#455) (diff) | |
| parent | GPU: Implemented the nvmap Free ioctl. (diff) | |
| download | yuzu-58857b9f46992753059aa8a6c31aff0ee14c9f99.tar.gz yuzu-58857b9f46992753059aa8a6c31aff0ee14c9f99.tar.xz yuzu-58857b9f46992753059aa8a6c31aff0ee14c9f99.zip | |
Merge pull request #456 from Subv/unmap_buffer
Implemented nvhost-as-gpu's UnmapBuffer and nvmap's Free ioctls.
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/memory_manager.cpp | 19 | ||||
| -rw-r--r-- | src/video_core/memory_manager.h | 1 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 25984439d..5cefce9fc 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -58,6 +58,25 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size) | |||
| 58 | return gpu_addr; | 58 | return gpu_addr; |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | GPUVAddr MemoryManager::UnmapBuffer(GPUVAddr gpu_addr, u64 size) { | ||
| 62 | ASSERT((gpu_addr & PAGE_MASK) == 0); | ||
| 63 | |||
| 64 | for (u64 offset = 0; offset < size; offset += PAGE_SIZE) { | ||
| 65 | ASSERT(PageSlot(gpu_addr + offset) != static_cast<u64>(PageStatus::Allocated) && | ||
| 66 | PageSlot(gpu_addr + offset) != static_cast<u64>(PageStatus::Unmapped)); | ||
| 67 | PageSlot(gpu_addr + offset) = static_cast<u64>(PageStatus::Unmapped); | ||
| 68 | } | ||
| 69 | |||
| 70 | // Delete the region mappings that are contained within the unmapped region | ||
| 71 | mapped_regions.erase(std::remove_if(mapped_regions.begin(), mapped_regions.end(), | ||
| 72 | [&](const MappedRegion& region) { | ||
| 73 | return region.gpu_addr <= gpu_addr && | ||
| 74 | region.gpu_addr + region.size < gpu_addr + size; | ||
| 75 | }), | ||
| 76 | mapped_regions.end()); | ||
| 77 | return gpu_addr; | ||
| 78 | } | ||
| 79 | |||
| 61 | boost::optional<GPUVAddr> MemoryManager::FindFreeBlock(u64 size, u64 align) { | 80 | boost::optional<GPUVAddr> MemoryManager::FindFreeBlock(u64 size, u64 align) { |
| 62 | GPUVAddr gpu_addr = 0; | 81 | GPUVAddr gpu_addr = 0; |
| 63 | u64 free_space = 0; | 82 | u64 free_space = 0; |
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index 08140c83a..86765e72a 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h | |||
| @@ -25,6 +25,7 @@ public: | |||
| 25 | GPUVAddr AllocateSpace(GPUVAddr gpu_addr, u64 size, u64 align); | 25 | GPUVAddr AllocateSpace(GPUVAddr gpu_addr, u64 size, u64 align); |
| 26 | GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size); | 26 | GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size); |
| 27 | GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size); | 27 | GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size); |
| 28 | GPUVAddr UnmapBuffer(GPUVAddr gpu_addr, u64 size); | ||
| 28 | boost::optional<VAddr> GpuToCpuAddress(GPUVAddr gpu_addr); | 29 | boost::optional<VAddr> GpuToCpuAddress(GPUVAddr gpu_addr); |
| 29 | std::vector<GPUVAddr> CpuToGpuAddress(VAddr cpu_addr) const; | 30 | std::vector<GPUVAddr> CpuToGpuAddress(VAddr cpu_addr) const; |
| 30 | 31 | ||