60 lines
1.1 KiB
C++

#include "data_pool.hpp"
#include <cassert>
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<Page>());
}
offset = PAGE_SIZE * (pages.size() - 1);
}
std::uint8_t* result = &(*pages[page])[localOffset];
offset += bytes;
assert(reinterpret_cast<std::uintptr_t>(result) % alignment == 0);
return result;
}
} // namespace vk_capture