#include "data_pool.hpp" #include namespace vk_capture { // // internal defines // // // internal constants // // // internal types // // // internal variables // // // internal functions // // // public functions // void* DataPool::allocate(std::size_t bytes, std::size_t alignment) { assert(bytes > 0 && bytes <= PAGE_SIZE); assert(alignment > 0 && alignment <= alignof(std::max_align_t)); if (offset % alignment != 0) { offset += alignment - (offset % alignment); } const std::size_t remainingOnPage = PAGE_SIZE - (offset % PAGE_SIZE); const std::size_t page = offset / PAGE_SIZE; const std::size_t localOffset = offset % PAGE_SIZE; if (remainingOnPage == PAGE_SIZE || remainingOnPage < bytes) { // next page if (page + 1 >= pages.size()) { pages.push_back(std::make_unique()); } offset = PAGE_SIZE * (pages.size() - 1); } std::uint8_t* result = &(*pages[page])[localOffset]; offset += bytes; assert(reinterpret_cast(result) % alignment == 0); return result; } } // namespace vk_capture