From 1d25be59b75550d8744e16e2eba97fd2b332807f Mon Sep 17 00:00:00 2001 From: Charlie Lao Date: Thu, 9 Jan 2025 11:09:22 -0800 Subject: [PATCH] Vulkan: Pass Context instead of Renderer to BufferHelper APIs 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 Commit-Queue: Charlie Lao Reviewed-by: Shahbaz Youssefi --- src/libANGLE/renderer/vulkan/BufferVk.cpp | 11 ++-- src/libANGLE/renderer/vulkan/BufferVk.h | 4 +- .../renderer/vulkan/CLCommandQueueVk.cpp | 6 +- src/libANGLE/renderer/vulkan/ContextVk.cpp | 56 ++++++++++--------- .../renderer/vulkan/TransformFeedbackVk.cpp | 10 ++-- .../renderer/vulkan/TransformFeedbackVk.h | 2 +- src/libANGLE/renderer/vulkan/UtilsVk.cpp | 4 +- .../renderer/vulkan/VertexArrayVk.cpp | 10 ++-- .../renderer/vulkan/vk_cache_utils.cpp | 27 ++++++--- src/libANGLE/renderer/vulkan/vk_cache_utils.h | 9 ++- src/libANGLE/renderer/vulkan/vk_helpers.cpp | 50 +++++++++++------ src/libANGLE/renderer/vulkan/vk_helpers.h | 40 ++++++++----- 12 files changed, 136 insertions(+), 93 deletions(-) diff --git a/src/libANGLE/renderer/vulkan/BufferVk.cpp b/src/libANGLE/renderer/vulkan/BufferVk.cpp index 129baaa25ac..6eab24e9892 100644 --- a/src/libANGLE/renderer/vulkan/BufferVk.cpp +++ b/src/libANGLE/renderer/vulkan/BufferVk.cpp @@ -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; } @@ -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( diff --git a/src/libANGLE/renderer/vulkan/BufferVk.h b/src/libANGLE/renderer/vulkan/BufferVk.h index 2cc41d2ec9a..59fd765a312 100644 --- a/src/libANGLE/renderer/vulkan/BufferVk.h +++ b/src/libANGLE/renderer/vulkan/BufferVk.h @@ -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: @@ -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; diff --git a/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp b/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp index 8c153cd241f..2c7f6192603 100644 --- a/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp +++ b/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp @@ -1432,7 +1432,7 @@ angle::Result CLCommandQueueVk::addMemoryDependencies(cl::Memory *clMem) { CLBufferVk &vkMem = clMem->getImpl(); - mComputePassCommands->bufferWrite(VK_ACCESS_SHADER_WRITE_BIT, + mComputePassCommands->bufferWrite(mContext, VK_ACCESS_SHADER_WRITE_BIT, vk::PipelineStage::ComputeShader, &vkMem.getBuffer()); } @@ -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); } @@ -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()) { diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp index 0e54640aaac..f3eaac5303d 100644 --- a/src/libANGLE/renderer/vulkan/ContextVk.cpp +++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp @@ -550,7 +550,8 @@ vk::ImageLayout GetImageWriteLayoutAndSubresource(const gl::ImageUnit &imageUnit } template -void OnTextureBufferRead(vk::BufferHelper *buffer, +void OnTextureBufferRead(vk::Context *context, + vk::BufferHelper *buffer, gl::ShaderBitSet stages, CommandBufferT *commandBufferHelper) { @@ -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 +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); } } @@ -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) { @@ -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; @@ -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; @@ -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); } } @@ -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; @@ -2895,7 +2899,7 @@ 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); @@ -2903,7 +2907,7 @@ angle::Result ContextVk::handleDirtyShaderResourcesImpl(CommandBufferHelperT *co if (hasStorageBuffers) { mShaderBuffersDescriptorDesc.updateShaderBuffers( - commandBufferHelper, *executable, variableInfoMap, + this, commandBufferHelper, *executable, variableInfoMap, mState.getOffsetBindingPointerShaderStorageBuffers(), executable->getShaderStorageBlocks(), executableVk->getStorageBufferDescriptorType(), limits.maxStorageBufferRange, mEmptyBuffer, mShaderBufferWriteDescriptorDescs, @@ -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); @@ -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); @@ -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); } @@ -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); } @@ -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) @@ -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(), @@ -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())) { @@ -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. @@ -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; @@ -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); } @@ -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); } diff --git a/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp b/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp index 6eee1fe2b3d..e10ce3d9f04 100644 --- a/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp +++ b/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp @@ -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) { @@ -153,7 +151,7 @@ angle::Result TransformFeedbackVk::end(const gl::Context *context) contextVk->onEndTransformFeedback(); - releaseCounterBuffers(contextVk->getRenderer()); + releaseCounterBuffers(contextVk); return angle::Result::Continue; } diff --git a/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h b/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h index 468a953eafb..c05c94c38d2 100644 --- a/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h +++ b/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h @@ -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 diff --git a/src/libANGLE/renderer/vulkan/UtilsVk.cpp b/src/libANGLE/renderer/vulkan/UtilsVk.cpp index 0c81375698c..8db9e450096 100644 --- a/src/libANGLE/renderer/vulkan/UtilsVk.cpp +++ b/src/libANGLE/renderer/vulkan/UtilsVk.cpp @@ -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) diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp index 6f3e1c4eff6..9e999dbf18b 100644 --- a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp +++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp @@ -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 &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); } diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp index 08b7b037429..6903b643d82 100644 --- a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp +++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp @@ -6439,6 +6439,7 @@ void DescriptorSetDescBuilder::setEmptyBuffer(uint32_t infoDescIndex, template void DescriptorSetDescBuilder::updateOneShaderBuffer( + Context *context, CommandBufferT *commandBufferHelper, const ShaderInterfaceVariableInfoMap &variableInfoMap, const gl::BufferVector &buffers, @@ -6486,7 +6487,7 @@ void DescriptorSetDescBuilder::updateOneShaderBuffer( descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; if (isUniformBuffer) { - commandBufferHelper->bufferRead(VK_ACCESS_UNIFORM_READ_BIT, block.activeShaders(), + commandBufferHelper->bufferRead(context, VK_ACCESS_UNIFORM_READ_BIT, block.activeShaders(), &bufferHelper); } else @@ -6499,8 +6500,8 @@ void DescriptorSetDescBuilder::updateOneShaderBuffer( // marked read-only. This also helps BufferVk make better decisions during // buffer data uploads and copies by knowing that the buffers are not actually // being written to. - commandBufferHelper->bufferRead(VK_ACCESS_SHADER_READ_BIT, block.activeShaders(), - &bufferHelper); + commandBufferHelper->bufferRead(context, VK_ACCESS_SHADER_READ_BIT, + block.activeShaders(), &bufferHelper); } else if ((bufferHelper.getCurrentWriteAccess() & VK_ACCESS_SHADER_WRITE_BIT) != 0 && (memoryBarrierBits & kBufferMemoryBarrierBits) == 0) @@ -6523,7 +6524,8 @@ void DescriptorSetDescBuilder::updateOneShaderBuffer( for (const gl::ShaderType shaderType : block.activeShaders()) { const vk::PipelineStage pipelineStage = vk::GetPipelineStage(shaderType); - commandBufferHelper->bufferWrite(accessFlags, pipelineStage, &bufferHelper); + commandBufferHelper->bufferWrite(context, accessFlags, pipelineStage, + &bufferHelper); } } } @@ -6549,6 +6551,7 @@ void DescriptorSetDescBuilder::updateOneShaderBuffer( template void DescriptorSetDescBuilder::updateShaderBuffers( + Context *context, CommandBufferT *commandBufferHelper, const gl::ProgramExecutable &executable, const ShaderInterfaceVariableInfoMap &variableInfoMap, @@ -6569,14 +6572,15 @@ void DescriptorSetDescBuilder::updateShaderBuffers( const GLuint binding = isUniformBuffer ? executable.getUniformBlockBinding(blockIndex) : executable.getShaderStorageBlockBinding(blockIndex); - updateOneShaderBuffer(commandBufferHelper, variableInfoMap, buffers, blocks[blockIndex], - binding, descriptorType, maxBoundBufferRange, emptyBuffer, - writeDescriptorDescs, memoryBarrierBits); + updateOneShaderBuffer(context, commandBufferHelper, variableInfoMap, buffers, + blocks[blockIndex], binding, descriptorType, maxBoundBufferRange, + emptyBuffer, writeDescriptorDescs, memoryBarrierBits); } } template void DescriptorSetDescBuilder::updateAtomicCounters( + Context *context, CommandBufferT *commandBufferHelper, const gl::ProgramExecutable &executable, const ShaderInterfaceVariableInfoMap &variableInfoMap, @@ -6627,7 +6631,8 @@ void DescriptorSetDescBuilder::updateAtomicCounters( for (const gl::ShaderType shaderType : atomicCounterBuffer.activeShaders()) { const vk::PipelineStage pipelineStage = vk::GetPipelineStage(shaderType); - 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, pipelineStage, &bufferHelper); } @@ -6652,6 +6657,7 @@ void DescriptorSetDescBuilder::updateAtomicCounters( // Explicit instantiation template void DescriptorSetDescBuilder::updateOneShaderBuffer( + Context *context, RenderPassCommandBufferHelper *commandBufferHelper, const ShaderInterfaceVariableInfoMap &variableInfoMap, const gl::BufferVector &buffers, @@ -6664,6 +6670,7 @@ template void DescriptorSetDescBuilder::updateOneShaderBuffer( + Context *context, OutsideRenderPassCommandBufferHelper *commandBufferHelper, const ShaderInterfaceVariableInfoMap &variableInfoMap, const gl::BufferVector &buffers, @@ -6676,6 +6683,7 @@ template void DescriptorSetDescBuilder::updateOneShaderBuffer( + Context *context, OutsideRenderPassCommandBufferHelper *commandBufferHelper, const gl::ProgramExecutable &executable, const ShaderInterfaceVariableInfoMap &variableInfoMap, @@ -6688,6 +6696,7 @@ template void DescriptorSetDescBuilder::updateShaderBuffers( + Context *context, RenderPassCommandBufferHelper *commandBufferHelper, const gl::ProgramExecutable &executable, const ShaderInterfaceVariableInfoMap &variableInfoMap, @@ -6700,6 +6709,7 @@ template void DescriptorSetDescBuilder::updateShaderBuffers( + Context *context, OutsideRenderPassCommandBufferHelper *commandBufferHelper, const gl::ProgramExecutable &executable, const ShaderInterfaceVariableInfoMap &variableInfoMap, @@ -6710,6 +6720,7 @@ template void DescriptorSetDescBuilder::updateAtomicCounters( + Context *context, RenderPassCommandBufferHelper *commandBufferHelper, const gl::ProgramExecutable &executable, const ShaderInterfaceVariableInfoMap &variableInfoMap, diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.h b/src/libANGLE/renderer/vulkan/vk_cache_utils.h index d3b95d91135..4f51870057e 100644 --- a/src/libANGLE/renderer/vulkan/vk_cache_utils.h +++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.h @@ -1950,7 +1950,8 @@ class DescriptorSetDescBuilder final // Specific helpers for shader resource descriptors. template - void updateOneShaderBuffer(CommandBufferT *commandBufferHelper, + void updateOneShaderBuffer(Context *context, + CommandBufferT *commandBufferHelper, const ShaderInterfaceVariableInfoMap &variableInfoMap, const gl::BufferVector &buffers, const gl::InterfaceBlock &block, @@ -1961,7 +1962,8 @@ class DescriptorSetDescBuilder final const WriteDescriptorDescs &writeDescriptorDescs, const GLbitfield memoryBarrierBits); template - void updateShaderBuffers(CommandBufferT *commandBufferHelper, + void updateShaderBuffers(Context *context, + CommandBufferT *commandBufferHelper, const gl::ProgramExecutable &executable, const ShaderInterfaceVariableInfoMap &variableInfoMap, const gl::BufferVector &buffers, @@ -1972,7 +1974,8 @@ class DescriptorSetDescBuilder final const WriteDescriptorDescs &writeDescriptorDescs, const GLbitfield memoryBarrierBits); template - void updateAtomicCounters(CommandBufferT *commandBufferHelper, + void updateAtomicCounters(Context *context, + CommandBufferT *commandBufferHelper, const gl::ProgramExecutable &executable, const ShaderInterfaceVariableInfoMap &variableInfoMap, const gl::BufferVector &buffers, diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp index b7488a4065e..3b1204b0834 100644 --- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp +++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp @@ -1071,11 +1071,11 @@ bool CanCopyWithTransferForCopyImage(Renderer *renderer, dstImage->getActualFormatID(), dstTilingMode); } -void ReleaseBufferListToRenderer(Renderer *renderer, BufferHelperQueue *buffers) +void ReleaseBufferListToRenderer(Context *context, BufferHelperQueue *buffers) { for (std::unique_ptr &toFree : *buffers) { - toFree->release(renderer); + toFree->release(context); } buffers->clear(); } @@ -1826,14 +1826,15 @@ void CommandBufferHelperCommon::assertCanBeRecycledImpl() ASSERT(!DerivedT::ExecutesInline() || derived->getCommandBuffer().empty()); } -void CommandBufferHelperCommon::bufferWrite(VkAccessFlags writeAccessType, +void CommandBufferHelperCommon::bufferWrite(Context *context, + VkAccessFlags writeAccessType, PipelineStage writeStage, BufferHelper *buffer) { buffer->setWriteQueueSerial(mQueueSerial); VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[writeStage]; - buffer->recordWriteBarrier(writeAccessType, stageBits, writeStage, &mPipelineBarriers); + buffer->recordWriteBarrier(context, writeAccessType, stageBits, writeStage, &mPipelineBarriers); // Make sure host-visible buffer writes result in a barrier inserted at the end of the frame to // make the results visible to the host. The buffer may be mapped by the application in the @@ -1857,12 +1858,13 @@ void CommandBufferHelperCommon::executeBarriers(Renderer *renderer, CommandsStat mEventBarriers.execute(renderer, &commandsState->primaryCommands); } -void CommandBufferHelperCommon::bufferReadImpl(VkAccessFlags readAccessType, +void CommandBufferHelperCommon::bufferReadImpl(Context *context, + VkAccessFlags readAccessType, PipelineStage readStage, BufferHelper *buffer) { VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[readStage]; - buffer->recordReadBarrier(readAccessType, stageBits, readStage, &mPipelineBarriers); + buffer->recordReadBarrier(context, readAccessType, stageBits, readStage, &mPipelineBarriers); ASSERT(!usesBufferForWrite(*buffer)); } @@ -3728,7 +3730,7 @@ angle::Result DynamicBuffer::allocate(Context *context, { mSize = minRequiredBlockSize; // Clear the free list since the free buffers are now either too small or too big. - ReleaseBufferListToRenderer(renderer, &mBufferFreeList); + ReleaseBufferListToRenderer(context, &mBufferFreeList); } // The front of the free list should be the oldest. Thus if it is in use the rest of the @@ -3756,16 +3758,16 @@ angle::Result DynamicBuffer::allocate(Context *context, return angle::Result::Continue; } -void DynamicBuffer::release(Renderer *renderer) +void DynamicBuffer::release(Context *context) { reset(); - ReleaseBufferListToRenderer(renderer, &mInFlightBuffers); - ReleaseBufferListToRenderer(renderer, &mBufferFreeList); + ReleaseBufferListToRenderer(context, &mInFlightBuffers); + ReleaseBufferListToRenderer(context, &mBufferFreeList); if (mBuffer) { - mBuffer->release(renderer); + mBuffer->release(context); mBuffer.reset(nullptr); } } @@ -3784,7 +3786,7 @@ void DynamicBuffer::updateQueueSerialAndReleaseInFlightBuffers(ContextVk *contex // suballocation's size. We need to use the whole block memory size here. if (bufferHelper->getBlockMemorySize() != mSize) { - bufferHelper->release(contextVk->getRenderer()); + bufferHelper->release(contextVk); } else { @@ -5670,6 +5672,16 @@ void BufferHelper::destroy(Renderer *renderer) } void BufferHelper::release(Renderer *renderer) +{ + releaseImpl(renderer); +} + +void BufferHelper::release(Context *context) +{ + releaseImpl(context->getRenderer()); +} + +void BufferHelper::releaseImpl(Renderer *renderer) { ASSERT(mDescriptorSetCacheManager.empty()); unmap(renderer); @@ -5696,8 +5708,9 @@ void BufferHelper::release(Renderer *renderer) } } -void BufferHelper::releaseBufferAndDescriptorSetCache(Renderer *renderer) +void BufferHelper::releaseBufferAndDescriptorSetCache(Context *context) { + Renderer *renderer = context->getRenderer(); if (renderer->hasResourceUseFinished(getResourceUse())) { mDescriptorSetCacheManager.destroyKeys(renderer); @@ -5707,7 +5720,7 @@ void BufferHelper::releaseBufferAndDescriptorSetCache(Renderer *renderer) mDescriptorSetCacheManager.releaseKeys(renderer); } - release(renderer); + release(context); } angle::Result BufferHelper::map(Context *context, uint8_t **ptrOut) @@ -5793,7 +5806,8 @@ bool BufferHelper::isReleasedToExternal() const return mIsReleasedToExternal; } -void BufferHelper::recordReadBarrier(VkAccessFlags readAccessType, +void BufferHelper::recordReadBarrier(Context *context, + VkAccessFlags readAccessType, VkPipelineStageFlags readStage, PipelineStage stageIndex, PipelineBarrierArray *barriers) @@ -5812,7 +5826,8 @@ void BufferHelper::recordReadBarrier(VkAccessFlags readAccessType, mCurrentReadStages |= readStage; } -void BufferHelper::recordWriteBarrier(VkAccessFlags writeAccessType, +void BufferHelper::recordWriteBarrier(Context *context, + VkAccessFlags writeAccessType, VkPipelineStageFlags writeStage, PipelineStage stageIndex, PipelineBarrierArray *barriers) @@ -8913,7 +8928,6 @@ angle::Result ImageHelper::reformatStagedBufferUpdates(ContextVk *contextVk, angle::FormatID srcFormatID, angle::FormatID dstFormatID) { - Renderer *renderer = contextVk->getRenderer(); const angle::Format &srcFormat = angle::Format::Get(srcFormatID); const angle::Format &dstFormat = angle::Format::Get(dstFormatID); const gl::InternalFormat &dstFormatInfo = @@ -8983,7 +8997,7 @@ angle::Result ImageHelper::reformatStagedBufferUpdates(ContextVk *contextVk, update.refCounted.buffer->releaseRef(); if (!update.refCounted.buffer->isReferenced()) { - update.refCounted.buffer->get().release(renderer); + update.refCounted.buffer->get().release(contextVk); SafeDelete(update.refCounted.buffer); } } diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.h b/src/libANGLE/renderer/vulkan/vk_helpers.h index 1bd42db382f..905a9e8cf4b 100644 --- a/src/libANGLE/renderer/vulkan/vk_helpers.h +++ b/src/libANGLE/renderer/vulkan/vk_helpers.h @@ -219,7 +219,7 @@ class DynamicBuffer : angle::NonCopyable bool *newBufferAllocatedOut); // This releases resources when they might currently be in use. - void release(Renderer *renderer); + void release(Context *context); // This adds in-flight buffers to the mResourceUseList in the share group and then releases // them. @@ -1024,7 +1024,8 @@ class BufferHelper : public ReadWriteResource void destroy(Renderer *renderer); void release(Renderer *renderer); - void releaseBufferAndDescriptorSetCache(Renderer *renderer); + void release(Context *context); + void releaseBufferAndDescriptorSetCache(Context *context); BufferSerial getBufferSerial() const { return mSerial; } BufferSerial getBlockSerial() const @@ -1080,12 +1081,14 @@ class BufferHelper : public ReadWriteResource // Returns true if the image is owned by an external API or instance. bool isReleasedToExternal() const; - void recordReadBarrier(VkAccessFlags readAccessType, + void recordReadBarrier(Context *context, + VkAccessFlags readAccessType, VkPipelineStageFlags readStage, PipelineStage stageIndex, PipelineBarrierArray *barriers); - void recordWriteBarrier(VkAccessFlags writeAccessType, + void recordWriteBarrier(Context *context, + VkAccessFlags writeAccessType, VkPipelineStageFlags writeStage, PipelineStage stageIndex, PipelineBarrierArray *barriers); @@ -1131,6 +1134,8 @@ class BufferHelper : public ReadWriteResource mSuballocation.setOffsetAndSize(offset, size); } + void releaseImpl(Renderer *renderer); + // Suballocation object. BufferSuballocation mSuballocation; // This normally is invalid. We always use the BufferBlock's buffer and offset combination. But @@ -1394,19 +1399,26 @@ constexpr uint32_t kInfiniteCmdCount = 0xFFFFFFFF; class CommandBufferHelperCommon : angle::NonCopyable { public: - void bufferWrite(VkAccessFlags writeAccessType, PipelineStage writeStage, BufferHelper *buffer); - - void bufferRead(VkAccessFlags readAccessType, PipelineStage readStage, BufferHelper *buffer) + void bufferWrite(Context *context, + VkAccessFlags writeAccessType, + PipelineStage writeStage, + BufferHelper *buffer); + + void bufferRead(Context *context, + VkAccessFlags readAccessType, + PipelineStage readStage, + BufferHelper *buffer) { - bufferReadImpl(readAccessType, readStage, buffer); + bufferReadImpl(context, readAccessType, readStage, buffer); setBufferReadQueueSerial(buffer); } - void bufferRead(VkAccessFlags readAccessType, + void bufferRead(Context *context, + VkAccessFlags readAccessType, const gl::ShaderBitSet &readShaderStages, BufferHelper *buffer) { - bufferReadImpl(readAccessType, readShaderStages, buffer); + bufferReadImpl(context, readAccessType, readShaderStages, buffer); setBufferReadQueueSerial(buffer); } @@ -1496,17 +1508,19 @@ class CommandBufferHelperCommon : angle::NonCopyable template void assertCanBeRecycledImpl(); - void bufferReadImpl(VkAccessFlags readAccessType, + void bufferReadImpl(Context *context, + VkAccessFlags readAccessType, PipelineStage readStage, BufferHelper *buffer); - void bufferReadImpl(VkAccessFlags readAccessType, + void bufferReadImpl(Context *context, + VkAccessFlags readAccessType, const gl::ShaderBitSet &readShaderStages, BufferHelper *buffer) { for (gl::ShaderType shaderType : readShaderStages) { const vk::PipelineStage readStage = vk::GetPipelineStage(shaderType); - bufferReadImpl(readAccessType, readStage, buffer); + bufferReadImpl(context, readAccessType, readStage, buffer); } } void imageReadImpl(Context *context,