summaryrefslogtreecommitdiff
path: root/src/common/virtual_buffer.h
diff options
context:
space:
mode:
authorGravatar bunnei2020-11-18 20:40:10 -0800
committerGravatar GitHub2020-11-18 20:40:10 -0800
commit92344da20ce4801543c1d3148e1f1b62ba162ffb (patch)
treea5cd5980b1287dfd9b56e6df48cad3790e173284 /src/common/virtual_buffer.h
parentMerge pull request #4866 from Morph1984/mjolnir-p3-prod (diff)
parentvirtual_buffer: Add compile-time type-safety guarantees with VirtualBuffer (diff)
downloadyuzu-92344da20ce4801543c1d3148e1f1b62ba162ffb.tar.gz
yuzu-92344da20ce4801543c1d3148e1f1b62ba162ffb.tar.xz
yuzu-92344da20ce4801543c1d3148e1f1b62ba162ffb.zip
Merge pull request #4936 from lioncash/page
page_table: Allow page tables to be moved
Diffstat (limited to 'src/common/virtual_buffer.h')
-rw-r--r--src/common/virtual_buffer.h29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/common/virtual_buffer.h b/src/common/virtual_buffer.h
index 125cb42f0..078e61c77 100644
--- a/src/common/virtual_buffer.h
+++ b/src/common/virtual_buffer.h
@@ -4,25 +4,44 @@
4 4
5#pragma once 5#pragma once
6 6
7#include "common/common_funcs.h" 7#include <type_traits>
8#include <utility>
8 9
9namespace Common { 10namespace Common {
10 11
11void* AllocateMemoryPages(std::size_t size); 12void* AllocateMemoryPages(std::size_t size) noexcept;
12void FreeMemoryPages(void* base, std::size_t size); 13void FreeMemoryPages(void* base, std::size_t size) noexcept;
13 14
14template <typename T> 15template <typename T>
15class VirtualBuffer final : NonCopyable { 16class VirtualBuffer final {
16public: 17public:
18 static_assert(
19 std::is_trivially_constructible_v<T>,
20 "T must be trivially constructible, as non-trivial constructors will not be executed "
21 "with the current allocator");
22
17 constexpr VirtualBuffer() = default; 23 constexpr VirtualBuffer() = default;
18 explicit VirtualBuffer(std::size_t count) : alloc_size{count * sizeof(T)} { 24 explicit VirtualBuffer(std::size_t count) : alloc_size{count * sizeof(T)} {
19 base_ptr = reinterpret_cast<T*>(AllocateMemoryPages(alloc_size)); 25 base_ptr = reinterpret_cast<T*>(AllocateMemoryPages(alloc_size));
20 } 26 }
21 27
22 ~VirtualBuffer() { 28 ~VirtualBuffer() noexcept {
23 FreeMemoryPages(base_ptr, alloc_size); 29 FreeMemoryPages(base_ptr, alloc_size);
24 } 30 }
25 31
32 VirtualBuffer(const VirtualBuffer&) = delete;
33 VirtualBuffer& operator=(const VirtualBuffer&) = delete;
34
35 VirtualBuffer(VirtualBuffer&& other) noexcept
36 : alloc_size{std::exchange(other.alloc_size, 0)}, base_ptr{std::exchange(other.base_ptr),
37 nullptr} {}
38
39 VirtualBuffer& operator=(VirtualBuffer&& other) noexcept {
40 alloc_size = std::exchange(other.alloc_size, 0);
41 base_ptr = std::exchange(other.base_ptr, nullptr);
42 return *this;
43 }
44
26 void resize(std::size_t count) { 45 void resize(std::size_t count) {
27 FreeMemoryPages(base_ptr, alloc_size); 46 FreeMemoryPages(base_ptr, alloc_size);
28 47