mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-14 02:42:44 +01:00
7f85abb281
This falls back to the old approach of using a virtual buffer. Windows is untested, but this build should fix support for Windows < 10 v1803. However without fastmem support at all.
70 lines
1.9 KiB
C++
70 lines
1.9 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"
|
|
#include "common/virtual_buffer.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{};
|
|
|
|
// Fallback if fastmem is not supported on this platform
|
|
std::unique_ptr<Common::VirtualBuffer<u8>> fallback_buffer;
|
|
};
|
|
|
|
} // namespace Common
|