summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/CMakeLists.txt2
-rw-r--r--src/common/virtual_buffer.cpp52
-rw-r--r--src/common/virtual_buffer.h58
3 files changed, 112 insertions, 0 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index eeceaa655..6ffc612e7 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -155,6 +155,8 @@ add_library(common STATIC
155 uuid.cpp 155 uuid.cpp
156 uuid.h 156 uuid.h
157 vector_math.h 157 vector_math.h
158 virtual_buffer.cpp
159 virtual_buffer.h
158 web_result.h 160 web_result.h
159 zstd_compression.cpp 161 zstd_compression.cpp
160 zstd_compression.h 162 zstd_compression.h
diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp
new file mode 100644
index 000000000..b426f4747
--- /dev/null
+++ b/src/common/virtual_buffer.cpp
@@ -0,0 +1,52 @@
1// Copyright 2020 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#ifdef _WIN32
6#include <windows.h>
7#else
8#include <stdio.h>
9#include <sys/mman.h>
10#include <sys/types.h>
11#if defined __APPLE__ || defined __FreeBSD__ || defined __OpenBSD__
12#include <sys/sysctl.h>
13#elif defined __HAIKU__
14#include <OS.h>
15#else
16#include <sys/sysinfo.h>
17#endif
18#endif
19
20#include "common/assert.h"
21#include "common/virtual_buffer.h"
22
23namespace Common {
24
25void* AllocateMemoryPages(std::size_t size) {
26#ifdef _WIN32
27 void* base{VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE)};
28#else
29 void* base{mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0)};
30
31 if (base == MAP_FAILED) {
32 base = nullptr;
33 }
34#endif
35
36 ASSERT(base);
37
38 return base;
39}
40
41void FreeMemoryPages(void* base, std::size_t size) {
42 if (!base) {
43 return;
44 }
45#ifdef _WIN32
46 ASSERT(VirtualFree(base, 0, MEM_RELEASE));
47#else
48 ASSERT(munmap(base, size) == 0);
49#endif
50}
51
52} // namespace Common
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