Просмотр исходного кода

memory_manager: Add implement CpuToGpuAddress.

bunnei 8 лет назад
Родитель
Сommit
10c6d89119
2 измененных файлов с 27 добавлено и 0 удалено
  1. 17 0
      src/video_core/memory_manager.cpp
  2. 10 0
      src/video_core/memory_manager.h

+ 17 - 0
src/video_core/memory_manager.cpp

@@ -38,6 +38,9 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, u64 size) {
         PageSlot(*gpu_addr + offset) = cpu_addr + offset;
     }
 
+    MappedRegion region{cpu_addr, *gpu_addr, size};
+    mapped_regions.push_back(region);
+
     return *gpu_addr;
 }
 
@@ -49,6 +52,9 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size)
         PageSlot(gpu_addr + offset) = cpu_addr + offset;
     }
 
+    MappedRegion region{cpu_addr, gpu_addr, size};
+    mapped_regions.push_back(region);
+
     return gpu_addr;
 }
 
@@ -84,6 +90,17 @@ boost::optional<VAddr> MemoryManager::GpuToCpuAddress(GPUVAddr gpu_addr) {
     return base_addr + (gpu_addr & PAGE_MASK);
 }
 
+std::vector<GPUVAddr> MemoryManager::CpuToGpuAddress(VAddr cpu_addr) const {
+    std::vector<GPUVAddr> results;
+    for (const auto& region : mapped_regions) {
+        if (cpu_addr >= region.cpu_addr && cpu_addr < (region.cpu_addr + region.size)) {
+            u64 offset = cpu_addr - region.cpu_addr;
+            results.push_back(region.gpu_addr + offset);
+        }
+    }
+    return results;
+}
+
 bool MemoryManager::IsPageMapped(GPUVAddr gpu_addr) {
     return PageSlot(gpu_addr) != static_cast<u64>(PageStatus::Unmapped);
 }

+ 10 - 0
src/video_core/memory_manager.h

@@ -6,6 +6,7 @@
 
 #include <array>
 #include <memory>
+#include <vector>
 
 #include <boost/optional.hpp>
 
@@ -26,6 +27,7 @@ public:
     GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size);
     GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size);
     boost::optional<VAddr> GpuToCpuAddress(GPUVAddr gpu_addr);
+    std::vector<GPUVAddr> CpuToGpuAddress(VAddr cpu_addr) const;
 
     static constexpr u64 PAGE_BITS = 16;
     static constexpr u64 PAGE_SIZE = 1 << PAGE_BITS;
@@ -51,6 +53,14 @@ private:
 
     using PageBlock = std::array<VAddr, PAGE_BLOCK_SIZE>;
     std::array<std::unique_ptr<PageBlock>, PAGE_TABLE_SIZE> page_table{};
+
+    struct MappedRegion {
+        VAddr cpu_addr;
+        GPUVAddr gpu_addr;
+        u64 size;
+    };
+
+    std::vector<MappedRegion> mapped_regions;
 };
 
 } // namespace Tegra