Skip to content

Commit

Permalink
Vulkan: Pass Context instead of Renderer to BufferHelper APIs
Browse files Browse the repository at this point in the history
This is preparation CL for later CL. In later CL we need to access
context argument in BufferHelper's barrier related functions. release()
also preferred to have context argument so that the events can be
recycled within share group. Because of this, a lot of functions has to
propagate back to pass context as argument instead of renderer.

Bug: angleproject:360274928
Change-Id: I13e930666eeeefbcff7b542d0e3126f3b07ce286
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6164686
Reviewed-by: Amirali Abdolrashidi <[email protected]>
Commit-Queue: Charlie Lao <[email protected]>
Reviewed-by: Shahbaz Youssefi <[email protected]>
  • Loading branch information
cclao authored and Angle LUCI CQ committed Jan 22, 2025
1 parent 680ff1f commit 1d25be5
Show file tree
Hide file tree
Showing 12 changed files with 136 additions and 93 deletions.
11 changes: 5 additions & 6 deletions src/libANGLE/renderer/vulkan/BufferVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -390,28 +390,27 @@ void BufferVk::destroy(const gl::Context *context)
(void)release(contextVk);
}

void BufferVk::releaseConversionBuffers(vk::Renderer *renderer)
void BufferVk::releaseConversionBuffers(vk::Context *context)
{
for (ConversionBuffer &buffer : mVertexConversionBuffers)
{
buffer.release(renderer);
buffer.release(context);
}
mVertexConversionBuffers.clear();
}

angle::Result BufferVk::release(ContextVk *contextVk)
{
vk::Renderer *renderer = contextVk->getRenderer();
if (mBuffer.valid())
{
ANGLE_TRY(contextVk->releaseBufferAllocation(&mBuffer));
}
if (mStagingBuffer.valid())
{
mStagingBuffer.release(renderer);
mStagingBuffer.release(contextVk);
}

releaseConversionBuffers(renderer);
releaseConversionBuffers(contextVk);

return angle::Result::Continue;
}
Expand Down Expand Up @@ -620,7 +619,7 @@ angle::Result BufferVk::allocStagingBuffer(ContextVk *contextVk,
mIsStagingBufferMapped = true;
return angle::Result::Continue;
}
mStagingBuffer.release(contextVk->getRenderer());
mStagingBuffer.release(contextVk);
}

ANGLE_TRY(
Expand Down
4 changes: 2 additions & 2 deletions src/libANGLE/renderer/vulkan/BufferVk.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class ConversionBuffer

bool valid() const { return mData && mData->valid(); }
vk::BufferHelper *getBuffer() const { return mData.get(); }
void release(vk::Renderer *renderer) { mData->release(renderer); }
void release(vk::Context *context) { mData->release(context); }
void destroy(vk::Renderer *renderer) { mData->destroy(renderer); }

private:
Expand Down Expand Up @@ -293,7 +293,7 @@ class BufferVk : public BufferImpl
VkMemoryPropertyFlags memoryPropertyFlags,
size_t size) const;

void releaseConversionBuffers(vk::Renderer *renderer);
void releaseConversionBuffers(vk::Context *context);

vk::BufferHelper mBuffer;

Expand Down
6 changes: 3 additions & 3 deletions src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1432,7 +1432,7 @@ angle::Result CLCommandQueueVk::addMemoryDependencies(cl::Memory *clMem)
{
CLBufferVk &vkMem = clMem->getImpl<CLBufferVk>();

mComputePassCommands->bufferWrite(VK_ACCESS_SHADER_WRITE_BIT,
mComputePassCommands->bufferWrite(mContext, VK_ACCESS_SHADER_WRITE_BIT,
vk::PipelineStage::ComputeShader, &vkMem.getBuffer());
}

Expand Down Expand Up @@ -2086,7 +2086,7 @@ angle::Result CLCommandQueueVk::onResourceAccess(const vk::CommandBufferAccess &
ANGLE_TRY(flushInternal());
}

mComputePassCommands->bufferRead(bufferAccess.accessType, bufferAccess.stage,
mComputePassCommands->bufferRead(mContext, bufferAccess.accessType, bufferAccess.stage,
bufferAccess.buffer);
}

Expand All @@ -2098,7 +2098,7 @@ angle::Result CLCommandQueueVk::onResourceAccess(const vk::CommandBufferAccess &
ANGLE_TRY(flushInternal());
}

mComputePassCommands->bufferWrite(bufferAccess.accessType, bufferAccess.stage,
mComputePassCommands->bufferWrite(mContext, bufferAccess.accessType, bufferAccess.stage,
bufferAccess.buffer);
if (bufferAccess.buffer->isHostVisible())
{
Expand Down
56 changes: 31 additions & 25 deletions src/libANGLE/renderer/vulkan/ContextVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -550,7 +550,8 @@ vk::ImageLayout GetImageWriteLayoutAndSubresource(const gl::ImageUnit &imageUnit
}

template <typename CommandBufferT>
void OnTextureBufferRead(vk::BufferHelper *buffer,
void OnTextureBufferRead(vk::Context *context,
vk::BufferHelper *buffer,
gl::ShaderBitSet stages,
CommandBufferT *commandBufferHelper)
{
Expand All @@ -562,21 +563,24 @@ void OnTextureBufferRead(vk::BufferHelper *buffer,
// Note: if another range of the same buffer is simultaneously used for storage,
// such as for transform feedback output, or SSBO, unnecessary barriers can be
// generated.
commandBufferHelper->bufferRead(VK_ACCESS_SHADER_READ_BIT, vk::GetPipelineStage(stage),
buffer);
commandBufferHelper->bufferRead(context, VK_ACCESS_SHADER_READ_BIT,
vk::GetPipelineStage(stage), buffer);
}
}

void OnImageBufferWrite(BufferVk *bufferVk,
template <typename CommandBufferT>
void OnImageBufferWrite(vk::Context *context,
BufferVk *bufferVk,
gl::ShaderBitSet stages,
vk::CommandBufferHelperCommon *commandBufferHelper)
CommandBufferT *commandBufferHelper)
{
vk::BufferHelper &buffer = bufferVk->getBuffer();

// TODO: accept multiple stages in bufferWrite. http://anglebug.com/42262235
for (gl::ShaderType stage : stages)
{
commandBufferHelper->bufferWrite(VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
commandBufferHelper->bufferWrite(context,
VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
vk::GetPipelineStage(stage), &buffer);
}
}
Expand Down Expand Up @@ -1294,8 +1298,8 @@ void ContextVk::onDestroy(const gl::Context *context)

mShareGroupVk->cleanupRefCountedEventGarbage();

mDefaultUniformStorage.release(mRenderer);
mEmptyBuffer.release(mRenderer);
mDefaultUniformStorage.release(this);
mEmptyBuffer.release(this);

for (vk::DynamicBuffer &defaultBuffer : mStreamedVertexBuffers)
{
Expand Down Expand Up @@ -1783,7 +1787,7 @@ angle::Result ContextVk::setupIndirectDraw(const gl::Context *context,
gl::DrawElementsType::InvalidEnum, nullptr, dirtyBitMask));

// Process indirect buffer after render pass has started.
mRenderPassCommands->bufferRead(VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
mRenderPassCommands->bufferRead(this, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
vk::PipelineStage::DrawIndirect, indirectBuffer);

return angle::Result::Continue;
Expand Down Expand Up @@ -2621,7 +2625,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl(
const gl::ShaderBitSet stages =
executable->getSamplerShaderBitsForTextureUnitIndex(textureUnit);

OnTextureBufferRead(buffer, stages, commandBufferHelper);
OnTextureBufferRead(this, buffer, stages, commandBufferHelper);

textureVk->retainBufferViews(commandBufferHelper);
continue;
Expand Down Expand Up @@ -2785,7 +2789,7 @@ angle::Result ContextVk::handleDirtyGraphicsVertexBuffers(DirtyBits::Iterator *d
vk::BufferHelper *arrayBuffer = arrayBufferResources[attribIndex];
if (arrayBuffer)
{
mRenderPassCommands->bufferRead(VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
mRenderPassCommands->bufferRead(this, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
vk::PipelineStage::VertexInput, arrayBuffer);
}
}
Expand All @@ -2806,7 +2810,7 @@ angle::Result ContextVk::handleDirtyGraphicsIndexBuffer(DirtyBits::Iterator *dir
mRenderPassCommandBuffer->bindIndexBuffer(buffer, bufferOffset + mCurrentIndexBufferOffset,
getVkIndexType(mCurrentDrawElementsType));

mRenderPassCommands->bufferRead(VK_ACCESS_INDEX_READ_BIT, vk::PipelineStage::VertexInput,
mRenderPassCommands->bufferRead(this, VK_ACCESS_INDEX_READ_BIT, vk::PipelineStage::VertexInput,
elementArrayBuffer);

return angle::Result::Continue;
Expand Down Expand Up @@ -2895,15 +2899,15 @@ angle::Result ContextVk::handleDirtyShaderResourcesImpl(CommandBufferHelperT *co
if (hasUniformBuffers)
{
mShaderBuffersDescriptorDesc.updateShaderBuffers(
commandBufferHelper, *executable, variableInfoMap,
this, commandBufferHelper, *executable, variableInfoMap,
mState.getOffsetBindingPointerUniformBuffers(), executable->getUniformBlocks(),
executableVk->getUniformBufferDescriptorType(), limits.maxUniformBufferRange,
mEmptyBuffer, mShaderBufferWriteDescriptorDescs, mDeferredMemoryBarriers);
}
if (hasStorageBuffers)
{
mShaderBuffersDescriptorDesc.updateShaderBuffers(
commandBufferHelper, *executable, variableInfoMap,
this, commandBufferHelper, *executable, variableInfoMap,
mState.getOffsetBindingPointerShaderStorageBuffers(),
executable->getShaderStorageBlocks(), executableVk->getStorageBufferDescriptorType(),
limits.maxStorageBufferRange, mEmptyBuffer, mShaderBufferWriteDescriptorDescs,
Expand All @@ -2912,7 +2916,7 @@ angle::Result ContextVk::handleDirtyShaderResourcesImpl(CommandBufferHelperT *co
if (hasAtomicCounterBuffers)
{
mShaderBuffersDescriptorDesc.updateAtomicCounters(
commandBufferHelper, *executable, variableInfoMap,
this, commandBufferHelper, *executable, variableInfoMap,
mState.getOffsetBindingPointerAtomicCounterBuffers(),
executable->getAtomicCounterBuffers(), limits.minStorageBufferOffsetAlignment,
mEmptyBuffer, mShaderBufferWriteDescriptorDescs);
Expand Down Expand Up @@ -2984,7 +2988,8 @@ angle::Result ContextVk::handleDirtyUniformBuffersImpl(CommandBufferT *commandBu
{
const GLuint binding = executable->getUniformBlockBinding(blockIndex);
mShaderBuffersDescriptorDesc.updateOneShaderBuffer(
commandBufferHelper, variableInfoMap, mState.getOffsetBindingPointerUniformBuffers(),
this, commandBufferHelper, variableInfoMap,
mState.getOffsetBindingPointerUniformBuffers(),
executable->getUniformBlocks()[blockIndex], binding,
executableVk->getUniformBufferDescriptorType(), limits.maxUniformBufferRange,
mEmptyBuffer, mShaderBufferWriteDescriptorDescs, mDeferredMemoryBarriers);
Expand Down Expand Up @@ -3041,7 +3046,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation(
{
vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex];
ASSERT(bufferHelper);
mRenderPassCommands->bufferWrite(VK_ACCESS_SHADER_WRITE_BIT,
mRenderPassCommands->bufferWrite(this, VK_ACCESS_SHADER_WRITE_BIT,
vk::PipelineStage::VertexShader, bufferHelper);
}

Expand Down Expand Up @@ -3101,7 +3106,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension(
{
vk::BufferHelper *bufferHelper = buffers[bufferIndex];
ASSERT(bufferHelper);
mRenderPassCommands->bufferWrite(VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,
mRenderPassCommands->bufferWrite(this, VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,
vk::PipelineStage::TransformFeedback, bufferHelper);
}

Expand All @@ -3110,7 +3115,8 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension(
// buffers of the transform feedback object are used together. The rest of the buffers are
// simply retained so they don't get deleted too early.
ASSERT(counterBuffers[0].valid());
mRenderPassCommands->bufferWrite(VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT |
mRenderPassCommands->bufferWrite(this,
VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT |
VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT,
vk::PipelineStage::TransformFeedback, &counterBuffers[0]);
for (size_t bufferIndex = 1; bufferIndex < bufferCount; ++bufferIndex)
Expand Down Expand Up @@ -6824,7 +6830,7 @@ angle::Result ContextVk::dispatchComputeIndirect(const gl::Context *context, GLi
ANGLE_TRY(setupDispatch(context));

// Process indirect buffer after command buffer has started.
mOutsideRenderPassCommands->bufferRead(VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
mOutsideRenderPassCommands->bufferRead(this, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
vk::PipelineStage::DrawIndirect, &buffer);

mOutsideRenderPassCommands->getCommandBuffer().dispatchIndirect(buffer.getBuffer(),
Expand Down Expand Up @@ -7467,7 +7473,7 @@ angle::Result ContextVk::initImageAllocation(vk::ImageHelper *imageHelper,

angle::Result ContextVk::releaseBufferAllocation(vk::BufferHelper *bufferHelper)
{
bufferHelper->releaseBufferAndDescriptorSetCache(mRenderer);
bufferHelper->releaseBufferAndDescriptorSetCache(this);

if (ANGLE_UNLIKELY(hasExcessPendingGarbage()))
{
Expand Down Expand Up @@ -7541,7 +7547,7 @@ angle::Result ContextVk::initBufferForVertexConversion(ConversionBuffer *convers
}
}

bufferHelper->release(mRenderer);
bufferHelper->release(this);
}

// Mark entire buffer dirty if we have to reallocate the buffer.
Expand Down Expand Up @@ -7721,7 +7727,7 @@ angle::Result ContextVk::updateActiveImages(CommandBufferHelperT *commandBufferH
{
BufferVk *bufferVk = vk::GetImpl(textureVk->getBuffer().get());

OnImageBufferWrite(bufferVk, shaderStages, commandBufferHelper);
OnImageBufferWrite(this, bufferVk, shaderStages, commandBufferHelper);

textureVk->retainBufferViews(commandBufferHelper);
continue;
Expand Down Expand Up @@ -8862,7 +8868,7 @@ angle::Result ContextVk::onResourceAccess(const vk::CommandBufferAccess &access)
ASSERT(!isRenderPassStartedAndUsesBufferForWrite(*bufferAccess.buffer));
ASSERT(!mOutsideRenderPassCommands->usesBufferForWrite(*bufferAccess.buffer));

mOutsideRenderPassCommands->bufferRead(bufferAccess.accessType, bufferAccess.stage,
mOutsideRenderPassCommands->bufferRead(this, bufferAccess.accessType, bufferAccess.stage,
bufferAccess.buffer);
}

Expand All @@ -8871,7 +8877,7 @@ angle::Result ContextVk::onResourceAccess(const vk::CommandBufferAccess &access)
ASSERT(!isRenderPassStartedAndUsesBuffer(*bufferAccess.buffer));
ASSERT(!mOutsideRenderPassCommands->usesBuffer(*bufferAccess.buffer));

mOutsideRenderPassCommands->bufferWrite(bufferAccess.accessType, bufferAccess.stage,
mOutsideRenderPassCommands->bufferWrite(this, bufferAccess.accessType, bufferAccess.stage,
bufferAccess.buffer);
}

Expand Down
10 changes: 4 additions & 6 deletions src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,14 @@ TransformFeedbackVk::~TransformFeedbackVk() {}
void TransformFeedbackVk::onDestroy(const gl::Context *context)
{
ContextVk *contextVk = vk::GetImpl(context);
vk::Renderer *renderer = contextVk->getRenderer();

releaseCounterBuffers(renderer);
releaseCounterBuffers(contextVk);
}

void TransformFeedbackVk::releaseCounterBuffers(vk::Renderer *renderer)
void TransformFeedbackVk::releaseCounterBuffers(vk::Context *context)
{
for (vk::BufferHelper &bufferHelper : mCounterBufferHelpers)
{
bufferHelper.release(renderer);
bufferHelper.release(context);
}
for (VkBuffer &buffer : mCounterBufferHandles)
{
Expand Down Expand Up @@ -153,7 +151,7 @@ angle::Result TransformFeedbackVk::end(const gl::Context *context)

contextVk->onEndTransformFeedback();

releaseCounterBuffers(contextVk->getRenderer());
releaseCounterBuffers(contextVk);

return angle::Result::Continue;
}
Expand Down
2 changes: 1 addition & 1 deletion src/libANGLE/renderer/vulkan/TransformFeedbackVk.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ class TransformFeedbackVk : public TransformFeedbackImpl, public angle::Observer
private:
void initializeXFBVariables(ContextVk *contextVk, uint32_t xfbBufferCount);

void releaseCounterBuffers(vk::Renderer *renderer);
void releaseCounterBuffers(vk::Context *context);

// This member variable is set when glBindTransformFeedbackBuffers/glBeginTransformFeedback
// is called and unset in dirty bit handler for transform feedback state change. If this
Expand Down
4 changes: 2 additions & 2 deletions src/libANGLE/renderer/vulkan/UtilsVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5205,8 +5205,8 @@ angle::Result LineLoopHelper::streamArrayIndirect(ContextVk *contextVk,

void LineLoopHelper::release(ContextVk *contextVk)
{
mDynamicIndexBuffer.release(contextVk->getRenderer());
mDynamicIndirectBuffer.release(contextVk->getRenderer());
mDynamicIndexBuffer.release(contextVk);
mDynamicIndirectBuffer.release(contextVk);
}

void LineLoopHelper::destroy(vk::Renderer *renderer)
Expand Down
10 changes: 4 additions & 6 deletions src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -340,16 +340,14 @@ void VertexArrayVk::destroy(const gl::Context *context)
{
ContextVk *contextVk = vk::GetImpl(context);

vk::Renderer *renderer = contextVk->getRenderer();

for (std::unique_ptr<vk::BufferHelper> &buffer : mCachedStreamIndexBuffers)
{
buffer->release(renderer);
buffer->release(contextVk);
}

mStreamedIndexData.release(renderer);
mTranslatedByteIndexData.release(renderer);
mTranslatedByteIndirectData.release(renderer);
mStreamedIndexData.release(contextVk);
mTranslatedByteIndexData.release(contextVk);
mTranslatedByteIndirectData.release(contextVk);
mLineLoopHelper.release(contextVk);
}

Expand Down
Loading

0 comments on commit 1d25be5

Please sign in to comment.