Commit 18f7e503 by Frank Henigman Committed by Commit Bot

Vulkan: make DynamicBuffer reusable, always valid.

After a release() or destroy() it is now possible continue using a DynamicBuffer because we reset the internal variables and the next allocate() restarts everything. Also removed the valid() method as it wasn't very useful and made reuse more complicated. No functional change. BUG=angleproject:2405 Change-Id: I5ca9b758fb300618f6578ebc406494ad281c1622 Reviewed-on: https://chromium-review.googlesource.com/1144229 Commit-Queue: Frank Henigman <fjhenigman@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent dbd16127
......@@ -134,6 +134,10 @@ gl::Error ContextVk::initialize()
ANGLE_TRY(mDynamicDescriptorPools[kDriverUniformsDescriptorSetIndex].init(
this, driverUniformsPoolSize));
size_t minAlignment = static_cast<size_t>(
mRenderer->getPhysicalDeviceProperties().limits.minUniformBufferOffsetAlignment);
mDriverUniformsBuffer.init(minAlignment, mRenderer);
mPipelineDesc.reset(new vk::PipelineDesc());
mPipelineDesc->initDefaults();
......@@ -888,13 +892,6 @@ const FeaturesVk &ContextVk::getFeatures() const
angle::Result ContextVk::updateDriverUniforms(const gl::State &glState)
{
if (!mDriverUniformsBuffer.valid())
{
size_t minAlignment = static_cast<size_t>(
mRenderer->getPhysicalDeviceProperties().limits.minUniformBufferOffsetAlignment);
mDriverUniformsBuffer.init(minAlignment, mRenderer);
}
// Release any previously retained buffers.
mDriverUniformsBuffer.releaseRetainedBuffers(mRenderer);
......
......@@ -127,10 +127,7 @@ FramebufferVk::FramebufferVk(RendererVk *renderer,
mBlitPixelBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, kMinReadPixelsBufferSize)
{
mBlitPixelBuffer.init(1, renderer);
ASSERT(mBlitPixelBuffer.valid());
mReadPixelBuffer.init(1, renderer);
ASSERT(mReadPixelBuffer.valid());
}
FramebufferVk::~FramebufferVk() = default;
......
......@@ -100,12 +100,6 @@ void DynamicBuffer::init(size_t alignment, RendererVk *renderer)
DynamicBuffer::~DynamicBuffer()
{
ASSERT(mAlignment == 0);
}
bool DynamicBuffer::valid()
{
return mAlignment > 0;
}
angle::Result DynamicBuffer::allocate(Context *context,
......@@ -115,8 +109,6 @@ angle::Result DynamicBuffer::allocate(Context *context,
uint32_t *offsetOut,
bool *newBufferAllocatedOut)
{
ASSERT(valid());
size_t sizeToAllocate = roundUp(sizeInBytes, mAlignment);
angle::base::CheckedNumeric<size_t> checkedNextWriteOffset = mNextAllocationOffset;
......@@ -127,8 +119,7 @@ angle::Result DynamicBuffer::allocate(Context *context,
if (mMappedMemory)
{
ANGLE_TRY(flush(context));
mMemory.unmap(context->getDevice());
mMappedMemory = nullptr;
unmap(context->getDevice());
}
mRetainedBuffers.emplace_back(std::move(mBuffer), std::move(mMemory));
......@@ -213,9 +204,10 @@ angle::Result DynamicBuffer::invalidate(Context *context)
void DynamicBuffer::release(RendererVk *renderer)
{
unmap(renderer->getDevice());
reset();
releaseRetainedBuffers(renderer);
mAlignment = 0;
Serial currentSerial = renderer->getCurrentQueueSerial();
renderer->releaseObject(currentSerial, &mBuffer);
renderer->releaseObject(currentSerial, &mMemory);
......@@ -235,6 +227,9 @@ void DynamicBuffer::releaseRetainedBuffers(RendererVk *renderer)
void DynamicBuffer::destroy(VkDevice device)
{
unmap(device);
reset();
for (BufferAndMemory &toFree : mRetainedBuffers)
{
toFree.buffer.destroy(device);
......@@ -243,7 +238,6 @@ void DynamicBuffer::destroy(VkDevice device)
mRetainedBuffers.clear();
mAlignment = 0;
mBuffer.destroy(device);
mMemory.destroy(device);
}
......@@ -262,6 +256,22 @@ void DynamicBuffer::setMinimumSizeForTesting(size_t minSize)
mSize = 0;
}
void DynamicBuffer::unmap(VkDevice device)
{
if (mMappedMemory)
{
mMemory.unmap(device);
mMappedMemory = nullptr;
}
}
void DynamicBuffer::reset()
{
mSize = 0;
mNextAllocationOffset = 0;
mLastFlushOrInvalidateOffset = 0;
}
// DynamicDescriptorPool implementation.
DynamicDescriptorPool::DynamicDescriptorPool()
: mMaxSetsPerPool(kDefaultDescriptorPoolMaxSets),
......
......@@ -37,8 +37,6 @@ class DynamicBuffer : angle::NonCopyable
// Init is called after the buffer creation so that the alignment can be specified later.
void init(size_t alignment, RendererVk *renderer);
bool valid();
// This call will allocate a new region at the end of the buffer. It internally may trigger
// a new buffer to be created (which is returned in 'newBufferAllocatedOut'. This param may
// be nullptr.
......@@ -70,6 +68,9 @@ class DynamicBuffer : angle::NonCopyable
void setMinimumSizeForTesting(size_t minSize);
private:
void unmap(VkDevice device);
void reset();
VkBufferUsageFlags mUsage;
size_t mMinSize;
Buffer mBuffer;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment