mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-25 22:57:22 +00:00
memory_manager: Add implement CpuToGpuAddress.
This commit is contained in:
parent
239ac8abe2
commit
10c6d89119
2 changed files with 27 additions and 0 deletions
|
@ -38,6 +38,9 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, u64 size) {
|
||||||
PageSlot(*gpu_addr + offset) = cpu_addr + offset;
|
PageSlot(*gpu_addr + offset) = cpu_addr + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MappedRegion region{cpu_addr, *gpu_addr, size};
|
||||||
|
mapped_regions.push_back(region);
|
||||||
|
|
||||||
return *gpu_addr;
|
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;
|
PageSlot(gpu_addr + offset) = cpu_addr + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MappedRegion region{cpu_addr, gpu_addr, size};
|
||||||
|
mapped_regions.push_back(region);
|
||||||
|
|
||||||
return gpu_addr;
|
return gpu_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +90,17 @@ boost::optional<VAddr> MemoryManager::GpuToCpuAddress(GPUVAddr gpu_addr) {
|
||||||
return base_addr + (gpu_addr & PAGE_MASK);
|
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) {
|
bool MemoryManager::IsPageMapped(GPUVAddr gpu_addr) {
|
||||||
return PageSlot(gpu_addr) != static_cast<u64>(PageStatus::Unmapped);
|
return PageSlot(gpu_addr) != static_cast<u64>(PageStatus::Unmapped);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
|
@ -26,6 +27,7 @@ public:
|
||||||
GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size);
|
GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size);
|
||||||
GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size);
|
GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size);
|
||||||
boost::optional<VAddr> GpuToCpuAddress(GPUVAddr gpu_addr);
|
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_BITS = 16;
|
||||||
static constexpr u64 PAGE_SIZE = 1 << PAGE_BITS;
|
static constexpr u64 PAGE_SIZE = 1 << PAGE_BITS;
|
||||||
|
@ -51,6 +53,14 @@ private:
|
||||||
|
|
||||||
using PageBlock = std::array<VAddr, PAGE_BLOCK_SIZE>;
|
using PageBlock = std::array<VAddr, PAGE_BLOCK_SIZE>;
|
||||||
std::array<std::unique_ptr<PageBlock>, PAGE_TABLE_SIZE> page_table{};
|
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
|
} // namespace Tegra
|
||||||
|
|
Loading…
Reference in a new issue