3
0
Fork 0
forked from suyu/suyu

Merge pull request #2350 from lioncash/vmem

video_core/memory_manager: Mark a few member functions with the const qualifier
This commit is contained in:
bunnei 2019-04-05 23:40:54 -04:00 committed by GitHub
commit 89b8801a97
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 22 deletions

View file

@ -77,16 +77,17 @@ GPUVAddr MemoryManager::UnmapBuffer(GPUVAddr gpu_addr, u64 size) {
return gpu_addr; return gpu_addr;
} }
GPUVAddr MemoryManager::FindFreeRegion(GPUVAddr region_start, u64 size) { GPUVAddr MemoryManager::FindFreeRegion(GPUVAddr region_start, u64 size) const {
// Find the first Free VMA. // Find the first Free VMA.
const VMAHandle vma_handle{std::find_if(vma_map.begin(), vma_map.end(), [&](const auto& vma) { const VMAHandle vma_handle{
if (vma.second.type != VirtualMemoryArea::Type::Unmapped) { std::find_if(vma_map.begin(), vma_map.end(), [region_start, size](const auto& vma) {
return false; if (vma.second.type != VirtualMemoryArea::Type::Unmapped) {
} return false;
}
const VAddr vma_end{vma.second.base + vma.second.size}; const VAddr vma_end{vma.second.base + vma.second.size};
return vma_end > region_start && vma_end >= region_start + size; return vma_end > region_start && vma_end >= region_start + size;
})}; })};
if (vma_handle == vma_map.end()) { if (vma_handle == vma_map.end()) {
return {}; return {};
@ -99,12 +100,12 @@ bool MemoryManager::IsAddressValid(GPUVAddr addr) const {
return (addr >> page_bits) < page_table.pointers.size(); return (addr >> page_bits) < page_table.pointers.size();
} }
std::optional<VAddr> MemoryManager::GpuToCpuAddress(GPUVAddr addr) { std::optional<VAddr> MemoryManager::GpuToCpuAddress(GPUVAddr addr) const {
if (!IsAddressValid(addr)) { if (!IsAddressValid(addr)) {
return {}; return {};
} }
VAddr cpu_addr{page_table.backing_addr[addr >> page_bits]}; const VAddr cpu_addr{page_table.backing_addr[addr >> page_bits]};
if (cpu_addr) { if (cpu_addr) {
return cpu_addr + (addr & page_mask); return cpu_addr + (addr & page_mask);
} }
@ -113,7 +114,7 @@ std::optional<VAddr> MemoryManager::GpuToCpuAddress(GPUVAddr addr) {
} }
template <typename T> template <typename T>
T MemoryManager::Read(GPUVAddr addr) { T MemoryManager::Read(GPUVAddr addr) const {
if (!IsAddressValid(addr)) { if (!IsAddressValid(addr)) {
return {}; return {};
} }
@ -165,10 +166,10 @@ void MemoryManager::Write(GPUVAddr addr, T data) {
} }
} }
template u8 MemoryManager::Read<u8>(GPUVAddr addr); template u8 MemoryManager::Read<u8>(GPUVAddr addr) const;
template u16 MemoryManager::Read<u16>(GPUVAddr addr); template u16 MemoryManager::Read<u16>(GPUVAddr addr) const;
template u32 MemoryManager::Read<u32>(GPUVAddr addr); template u32 MemoryManager::Read<u32>(GPUVAddr addr) const;
template u64 MemoryManager::Read<u64>(GPUVAddr addr); template u64 MemoryManager::Read<u64>(GPUVAddr addr) const;
template void MemoryManager::Write<u8>(GPUVAddr addr, u8 data); template void MemoryManager::Write<u8>(GPUVAddr addr, u8 data);
template void MemoryManager::Write<u16>(GPUVAddr addr, u16 data); template void MemoryManager::Write<u16>(GPUVAddr addr, u16 data);
template void MemoryManager::Write<u32>(GPUVAddr addr, u32 data); template void MemoryManager::Write<u32>(GPUVAddr addr, u32 data);
@ -179,8 +180,8 @@ u8* MemoryManager::GetPointer(GPUVAddr addr) {
return {}; return {};
} }
u8* page_pointer{page_table.pointers[addr >> page_bits]}; u8* const page_pointer{page_table.pointers[addr >> page_bits]};
if (page_pointer) { if (page_pointer != nullptr) {
return page_pointer + (addr & page_mask); return page_pointer + (addr & page_mask);
} }
@ -188,7 +189,21 @@ u8* MemoryManager::GetPointer(GPUVAddr addr) {
return {}; return {};
} }
void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) { const u8* MemoryManager::GetPointer(GPUVAddr addr) const {
if (!IsAddressValid(addr)) {
return {};
}
const u8* const page_pointer{page_table.pointers[addr >> page_bits]};
if (page_pointer != nullptr) {
return page_pointer + (addr & page_mask);
}
LOG_ERROR(HW_GPU, "Unknown GetPointer @ 0x{:016X}", addr);
return {};
}
void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const {
std::memcpy(dest_buffer, GetPointer(src_addr), size); std::memcpy(dest_buffer, GetPointer(src_addr), size);
} }
void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size) { void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size) {

View file

@ -50,17 +50,18 @@ public:
GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size); GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size);
GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr addr, u64 size); GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr addr, u64 size);
GPUVAddr UnmapBuffer(GPUVAddr addr, u64 size); GPUVAddr UnmapBuffer(GPUVAddr addr, u64 size);
std::optional<VAddr> GpuToCpuAddress(GPUVAddr addr); std::optional<VAddr> GpuToCpuAddress(GPUVAddr addr) const;
template <typename T> template <typename T>
T Read(GPUVAddr addr); T Read(GPUVAddr addr) const;
template <typename T> template <typename T>
void Write(GPUVAddr addr, T data); void Write(GPUVAddr addr, T data);
u8* GetPointer(GPUVAddr addr); u8* GetPointer(GPUVAddr addr);
const u8* GetPointer(GPUVAddr addr) const;
void ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size); void ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const;
void WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); void WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size);
void CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size); void CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size);
@ -127,7 +128,7 @@ private:
void UpdatePageTableForVMA(const VirtualMemoryArea& vma); void UpdatePageTableForVMA(const VirtualMemoryArea& vma);
/// Finds a free (unmapped region) of the specified size starting at the specified address. /// Finds a free (unmapped region) of the specified size starting at the specified address.
GPUVAddr FindFreeRegion(GPUVAddr region_start, u64 size); GPUVAddr FindFreeRegion(GPUVAddr region_start, u64 size) const;
private: private:
static constexpr u64 page_bits{16}; static constexpr u64 page_bits{16};