60 lines
1.1 KiB
C++
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
|