mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	common: Add VirtualBuffer class, to abstract memory virtualization.
This commit is contained in:
		
							parent
							
								
									a238d08f71
								
							
						
					
					
						commit
						4ba2428c86
					
				| @ -155,6 +155,8 @@ add_library(common STATIC | |||||||
|     uuid.cpp |     uuid.cpp | ||||||
|     uuid.h |     uuid.h | ||||||
|     vector_math.h |     vector_math.h | ||||||
|  |     virtual_buffer.cpp | ||||||
|  |     virtual_buffer.h | ||||||
|     web_result.h |     web_result.h | ||||||
|     zstd_compression.cpp |     zstd_compression.cpp | ||||||
|     zstd_compression.h |     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…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei