summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bunnei2018-04-21 14:40:51 -0400
committerGravatar bunnei2018-04-24 17:49:20 -0400
commit10c6d891190e407cf4fbcf6eb8ce2506ddf388ec (patch)
tree3ba8d73cf1906252012a4810be6f5b0b5bc9ca80
parentmemory_manager: Make GpuToCpuAddress return an optional. (diff)
downloadyuzu-10c6d891190e407cf4fbcf6eb8ce2506ddf388ec.tar.gz
yuzu-10c6d891190e407cf4fbcf6eb8ce2506ddf388ec.tar.xz
yuzu-10c6d891190e407cf4fbcf6eb8ce2506ddf388ec.zip
memory_manager: Add implement CpuToGpuAddress.
-rw-r--r--src/video_core/memory_manager.cpp17
-rw-r--r--src/video_core/memory_manager.h10
2 files changed, 27 insertions, 0 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp
index 9bbbb7e65..25984439d 100644
--- a/src/video_core/memory_manager.cpp
+++ b/src/video_core/memory_manager.cpp
@@ -38,6 +38,9 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, u64 size) {
38 PageSlot(*gpu_addr + offset) = cpu_addr + offset; 38 PageSlot(*gpu_addr + offset) = cpu_addr + offset;
39 } 39 }
40 40
41 MappedRegion region{cpu_addr, *gpu_addr, size};
42 mapped_regions.push_back(region);
43
41 return *gpu_addr; 44 return *gpu_addr;
42} 45}
43 46
@@ -49,6 +52,9 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size)
49 PageSlot(gpu_addr + offset) = cpu_addr + offset; 52 PageSlot(gpu_addr + offset) = cpu_addr + offset;
50 } 53 }
51 54
55 MappedRegion region{cpu_addr, gpu_addr, size};
56 mapped_regions.push_back(region);
57
52 return gpu_addr; 58 return gpu_addr;
53} 59}
54 60
@@ -84,6 +90,17 @@ boost::optional<VAddr> MemoryManager::GpuToCpuAddress(GPUVAddr gpu_addr) {
84 return base_addr + (gpu_addr & PAGE_MASK); 90 return base_addr + (gpu_addr & PAGE_MASK);
85} 91}
86 92
93std::vector<GPUVAddr> MemoryManager::CpuToGpuAddress(VAddr cpu_addr) const {
94 std::vector<GPUVAddr> results;
95 for (const auto& region : mapped_regions) {
96 if (cpu_addr >= region.cpu_addr && cpu_addr < (region.cpu_addr + region.size)) {
97 u64 offset = cpu_addr - region.cpu_addr;
98 results.push_back(region.gpu_addr + offset);
99 }
100 }
101 return results;
102}
103
87bool MemoryManager::IsPageMapped(GPUVAddr gpu_addr) { 104bool MemoryManager::IsPageMapped(GPUVAddr gpu_addr) {
88 return PageSlot(gpu_addr) != static_cast<u64>(PageStatus::Unmapped); 105 return PageSlot(gpu_addr) != static_cast<u64>(PageStatus::Unmapped);
89} 106}
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h
index 246c8fb7e..7d745101f 100644
--- a/src/video_core/memory_manager.h
+++ b/src/video_core/memory_manager.h
@@ -6,6 +6,7 @@
6 6
7#include <array> 7#include <array>
8#include <memory> 8#include <memory>
9#include <vector>
9 10
10#include <boost/optional.hpp> 11#include <boost/optional.hpp>
11 12
@@ -26,6 +27,7 @@ public:
26 GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size); 27 GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size);
27 GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size); 28 GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size);
28 boost::optional<VAddr> GpuToCpuAddress(GPUVAddr gpu_addr); 29 boost::optional<VAddr> GpuToCpuAddress(GPUVAddr gpu_addr);
30 std::vector<GPUVAddr> CpuToGpuAddress(VAddr cpu_addr) const;
29 31
30 static constexpr u64 PAGE_BITS = 16; 32 static constexpr u64 PAGE_BITS = 16;
31 static constexpr u64 PAGE_SIZE = 1 << PAGE_BITS; 33 static constexpr u64 PAGE_SIZE = 1 << PAGE_BITS;
@@ -51,6 +53,14 @@ private:
51 53
52 using PageBlock = std::array<VAddr, PAGE_BLOCK_SIZE>; 54 using PageBlock = std::array<VAddr, PAGE_BLOCK_SIZE>;
53 std::array<std::unique_ptr<PageBlock>, PAGE_TABLE_SIZE> page_table{}; 55 std::array<std::unique_ptr<PageBlock>, PAGE_TABLE_SIZE> page_table{};
56
57 struct MappedRegion {
58 VAddr cpu_addr;
59 GPUVAddr gpu_addr;
60 u64 size;
61 };
62
63 std::vector<MappedRegion> mapped_regions;
54}; 64};
55 65
56} // namespace Tegra 66} // namespace Tegra