forked from eden-emu/eden
		
	common: Add VirtualBuffer class, to abstract memory virtualization.
This commit is contained in:
		
							parent
							
								
									a238d08f71
								
							
						
					
					
						commit
						4ba2428c86
					
				
					 3 changed files with 112 additions and 0 deletions
				
			
		|  | @ -155,6 +155,8 @@ add_library(common STATIC | |||
|     uuid.cpp | ||||
|     uuid.h | ||||
|     vector_math.h | ||||
|     virtual_buffer.cpp | ||||
|     virtual_buffer.h | ||||
|     web_result.h | ||||
|     zstd_compression.cpp | ||||
|     zstd_compression.h | ||||
|  |  | |||
							
								
								
									
										52
									
								
								src/common/virtual_buffer.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/common/virtual_buffer.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,52 @@ | |||
| // Copyright 2020 yuzu Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #ifdef _WIN32 | ||||
| #include <windows.h> | ||||
| #else | ||||
| #include <stdio.h> | ||||
| #include <sys/mman.h> | ||||
| #include <sys/types.h> | ||||
| #if defined __APPLE__ || defined __FreeBSD__ || defined __OpenBSD__ | ||||
| #include <sys/sysctl.h> | ||||
| #elif defined __HAIKU__ | ||||
| #include <OS.h> | ||||
| #else | ||||
| #include <sys/sysinfo.h> | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #include "common/assert.h" | ||||
| #include "common/virtual_buffer.h" | ||||
| 
 | ||||
| namespace Common { | ||||
| 
 | ||||
| void* AllocateMemoryPages(std::size_t size) { | ||||
| #ifdef _WIN32 | ||||
|     void* base{VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE)}; | ||||
| #else | ||||
|     void* base{mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0)}; | ||||
| 
 | ||||
|     if (base == MAP_FAILED) { | ||||
|         base = nullptr; | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     ASSERT(base); | ||||
| 
 | ||||
|     return base; | ||||
| } | ||||
| 
 | ||||
| void FreeMemoryPages(void* base, std::size_t size) { | ||||
|     if (!base) { | ||||
|         return; | ||||
|     } | ||||
| #ifdef _WIN32 | ||||
|     ASSERT(VirtualFree(base, 0, MEM_RELEASE)); | ||||
| #else | ||||
|     ASSERT(munmap(base, size) == 0); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| } // namespace Common
 | ||||
							
								
								
									
										58
									
								
								src/common/virtual_buffer.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/common/virtual_buffer.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,58 @@ | |||
| // Copyright 2020 yuzu Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "common/common_funcs.h" | ||||
| 
 | ||||
| namespace Common { | ||||
| 
 | ||||
| void* AllocateMemoryPages(std::size_t size); | ||||
| void FreeMemoryPages(void* base, std::size_t size); | ||||
| 
 | ||||
| template <typename T> | ||||
| class VirtualBuffer final : NonCopyable { | ||||
| public: | ||||
|     constexpr VirtualBuffer() = default; | ||||
|     explicit VirtualBuffer(std::size_t count) : alloc_size{count * sizeof(T)} { | ||||
|         base_ptr = reinterpret_cast<T*>(AllocateMemoryPages(alloc_size)); | ||||
|     } | ||||
| 
 | ||||
|     ~VirtualBuffer() { | ||||
|         FreeMemoryPages(base_ptr, alloc_size); | ||||
|     } | ||||
| 
 | ||||
|     void resize(std::size_t count) { | ||||
|         FreeMemoryPages(base_ptr, alloc_size); | ||||
| 
 | ||||
|         alloc_size = count * sizeof(T); | ||||
|         base_ptr = reinterpret_cast<T*>(AllocateMemoryPages(alloc_size)); | ||||
|     } | ||||
| 
 | ||||
|     constexpr const T& operator[](std::size_t index) const { | ||||
|         return base_ptr[index]; | ||||
|     } | ||||
| 
 | ||||
|     constexpr T& operator[](std::size_t index) { | ||||
|         return base_ptr[index]; | ||||
|     } | ||||
| 
 | ||||
|     constexpr T* data() { | ||||
|         return base_ptr; | ||||
|     } | ||||
| 
 | ||||
|     constexpr const T* data() const { | ||||
|         return base_ptr; | ||||
|     } | ||||
| 
 | ||||
|     constexpr std::size_t size() const { | ||||
|         return alloc_size / sizeof(T); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     std::size_t alloc_size{}; | ||||
|     T* base_ptr{}; | ||||
| }; | ||||
| 
 | ||||
| } // namespace Common
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bunnei
						bunnei