// // Copyright 2022 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // AllocatorHelperPool: // Implements the pool allocator helpers used in the command buffers. // #include "libANGLE/renderer/vulkan/AllocatorHelperPool.h" #include "libANGLE/renderer/vulkan/SecondaryCommandBuffer.h" namespace rx { namespace vk { void DedicatedCommandBlockAllocator::resetAllocator() { mAllocator.pop(); mAllocator.push(); } void DedicatedCommandBlockPool::reset(CommandBufferCommandTracker *commandBufferTracker) { mCommandBuffer->clearCommands(); mCurrentWritePointer = nullptr; mCurrentBytesRemaining = 0; commandBufferTracker->reset(); } // Initialize the SecondaryCommandBuffer by setting the allocator it will use angle::Result DedicatedCommandBlockPool::initialize(DedicatedCommandMemoryAllocator *allocator) { ASSERT(allocator); ASSERT(mCommandBuffer->hasEmptyCommands()); mAllocator = allocator; allocateNewBlock(); // Set first command to Invalid to start reinterpret_cast(*mCurrentWritePointer) = 0; return angle::Result::Continue; } bool DedicatedCommandBlockPool::empty() const { return mCommandBuffer->checkEmptyForPoolAlloc(); } void DedicatedCommandBlockPool::allocateNewBlock(size_t blockSize) { ASSERT(mAllocator); mCurrentWritePointer = mAllocator->fastAllocate(blockSize); mCurrentBytesRemaining = blockSize; mCommandBuffer->pushToCommands(mCurrentWritePointer); } void DedicatedCommandBlockPool::getMemoryUsageStats(size_t *usedMemoryOut, size_t *allocatedMemoryOut) const { mCommandBuffer->getMemoryUsageStatsForPoolAlloc(kBlockSize, usedMemoryOut, allocatedMemoryOut); } } // namespace vk } // namespace rx