|
|
@ -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 |