summaryrefslogtreecommitdiff
path: root/src/common/virtual_buffer.h
diff options
context:
space:
mode:
authorGravatar bunnei2020-04-08 17:35:07 -0400
committerGravatar bunnei2020-04-17 00:59:31 -0400
commit4ba2428c86d95fdfe9c580dd62e4a94309a4661c (patch)
tree6f69c0be2baa02bd6d298a4c3dd6ee23cf21b41e /src/common/virtual_buffer.h
parentkernel: errors: Add ERR_OUT_OF_RESOURCES. (diff)
downloadyuzu-4ba2428c86d95fdfe9c580dd62e4a94309a4661c.tar.gz
yuzu-4ba2428c86d95fdfe9c580dd62e4a94309a4661c.tar.xz
yuzu-4ba2428c86d95fdfe9c580dd62e4a94309a4661c.zip
common: Add VirtualBuffer class, to abstract memory virtualization.
Diffstat (limited to 'src/common/virtual_buffer.h')
-rw-r--r--src/common/virtual_buffer.h58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/common/virtual_buffer.h b/src/common/virtual_buffer.h
new file mode 100644
index 000000000..da064e59e
--- /dev/null
+++ b/src/common/virtual_buffer.h
@@ -0,0 +1,58 @@
1// Copyright 2020 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include "common/common_funcs.h"
8
9namespace Common {
10
11void* AllocateMemoryPages(std::size_t size);
12void FreeMemoryPages(void* base, std::size_t size);
13
14template <typename T>
15class VirtualBuffer final : NonCopyable {
16public:
17 constexpr VirtualBuffer() = default;
18 explicit VirtualBuffer(std::size_t count) : alloc_size{count * sizeof(T)} {
19 base_ptr = reinterpret_cast<T*>(AllocateMemoryPages(alloc_size));
20 }
21
22 ~VirtualBuffer() {
23 FreeMemoryPages(base_ptr, alloc_size);
24 }
25
26 void resize(std::size_t count) {
27 FreeMemoryPages(base_ptr, alloc_size);
28
29 alloc_size = count * sizeof(T);
30 base_ptr = reinterpret_cast<T*>(AllocateMemoryPages(alloc_size));
31 }
32
33 constexpr const T& operator[](std::size_t index) const {
34 return base_ptr[index];
35 }
36
37 constexpr T& operator[](std::size_t index) {
38 return base_ptr[index];
39 }
40
41 constexpr T* data() {
42 return base_ptr;
43 }
44
45 constexpr const T* data() const {
46 return base_ptr;
47 }
48
49 constexpr std::size_t size() const {
50 return alloc_size / sizeof(T);
51 }
52
53private:
54 std::size_t alloc_size{};
55 T* base_ptr{};
56};
57
58} // namespace Common