mirror of
https://github.com/yuzu-emu/yuzu.git
synced 2024-07-04 23:31:19 +01:00
c4609c92ee
In theory, if we have 2 MB continously mapped, this should save one layer of TLB. Let's make it at least more likely by aligning the memory.
66 lines
1.8 KiB
C++
66 lines
1.8 KiB
C++
// Copyright 2019 yuzu Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <memory>
|
|
#include "common/common_types.h"
|
|
|
|
namespace Common {
|
|
|
|
/**
|
|
* A low level linear memory buffer, which supports multiple mappings
|
|
* Its purpose is to rebuild a given sparse memory layout, including mirrors.
|
|
*/
|
|
class HostMemory {
|
|
public:
|
|
explicit HostMemory(size_t backing_size_, size_t virtual_size_);
|
|
~HostMemory();
|
|
|
|
/**
|
|
* Copy constructors. They shall return a copy of the buffer without the mappings.
|
|
* TODO: Implement them with COW if needed.
|
|
*/
|
|
HostMemory(const HostMemory& other) = delete;
|
|
HostMemory& operator=(const HostMemory& other) = delete;
|
|
|
|
/**
|
|
* Move constructors. They will move the buffer and the mappings to the new object.
|
|
*/
|
|
HostMemory(HostMemory&& other) noexcept;
|
|
HostMemory& operator=(HostMemory&& other) noexcept;
|
|
|
|
void Map(size_t virtual_offset, size_t host_offset, size_t length);
|
|
|
|
void Unmap(size_t virtual_offset, size_t length);
|
|
|
|
void Protect(size_t virtual_offset, size_t length, bool read, bool write);
|
|
|
|
[[nodiscard]] u8* BackingBasePointer() noexcept {
|
|
return backing_base;
|
|
}
|
|
[[nodiscard]] const u8* BackingBasePointer() const noexcept {
|
|
return backing_base;
|
|
}
|
|
|
|
[[nodiscard]] u8* VirtualBasePointer() noexcept {
|
|
return virtual_base;
|
|
}
|
|
[[nodiscard]] const u8* VirtualBasePointer() const noexcept {
|
|
return virtual_base;
|
|
}
|
|
|
|
private:
|
|
size_t backing_size{};
|
|
size_t virtual_size{};
|
|
|
|
// Low level handler for the platform dependent memory routines
|
|
class Impl;
|
|
std::unique_ptr<Impl> impl;
|
|
u8* backing_base{};
|
|
u8* virtual_base{};
|
|
size_t virtual_base_offset{};
|
|
};
|
|
|
|
} // namespace Common
|