Commit 8a90905c by Charlie Lao Committed by Commit Bot

Revert "Vulkan: Try to merge barriers if possible"

This reverts commit 153c14cb. Reason for revert: The dependencyStrongerThan logic is incorrect and causing perf regression on ARM. Original change's description: > Vulkan: Try to merge barriers if possible > > This is try to reduce the number of vkCmdPipelineBarrier API calls into > driver. It should not affect the actual barriers. > > Bug: b/155341891 > Change-Id: I57b8b8cdad50d494c76a008006bd54961170c8bc > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2194841 > Commit-Queue: Charlie Lao <cclao@google.com> > Reviewed-by: Jamie Madill <jmadill@chromium.org> > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> TBR=courtneygo@google.com,timvp@google.com,syoussefi@chromium.org,jmadill@chromium.org,cclao@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Bug: b/155341891 Change-Id: I8ebe7481b299af446dfd488874e64e6e60b4f764 No-Presubmit: true No-Tree-Checks: true No-Try: true Change-Id: I8ebe7481b299af446dfd488874e64e6e60b4f764 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2205433 Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: 's avatarCharlie Lao <cclao@google.com>
parent d34ab323
...@@ -591,49 +591,17 @@ void CommandBufferHelper::imageWrite(vk::ResourceUseList *resourceUseList, ...@@ -591,49 +591,17 @@ void CommandBufferHelper::imageWrite(vk::ResourceUseList *resourceUseList,
void CommandBufferHelper::executeBarriers(vk::PrimaryCommandBuffer *primary) void CommandBufferHelper::executeBarriers(vk::PrimaryCommandBuffer *primary)
{ {
if (mPipelineBarrierMask.none()) if (!mPipelineBarrierMask.any())
{ {
return; return;
} }
constexpr PipelineStagesMask kHostTransferAndCompute( for (PipelineStage pipelineStage : mPipelineBarrierMask)
angle::Bit<uint16_t>(PipelineStage::Host) | angle::Bit<uint16_t>(PipelineStage::Transfer) |
angle::Bit<uint16_t>(PipelineStage::ComputeShader));
// Process Host/Transfer/Compute barriers individually
PipelineStagesMask mask = mPipelineBarrierMask & kHostTransferAndCompute;
for (PipelineStage pipelineStage : mask)
{
mPipelineBarriers[pipelineStage].execute(primary);
}
mPipelineBarrierMask &= ~mask;
// Graphics pipeline
if (mPipelineBarrierMask.none())
{ {
return; PipelineBarrier &barrier = mPipelineBarriers[pipelineStage];
} barrier.writeCommand(primary);
// Now we walk through all stages in graphics pipeline and see if we can merge them without
// introducing extra dependency. If the lower stage's dependency already covers the higher
// stage's dependency, then we just merge the higher stage into lower stage.
mask = mPipelineBarrierMask;
PipelineStagesMask::Iterator iter(mask);
PipelineBarrier *barrier = &mPipelineBarriers[*iter];
mask.reset(*iter);
for (PipelineStage pipelineStage : mask)
{
PipelineBarrier *newBarrier = &mPipelineBarriers[pipelineStage];
if (!barrier->mergeIfDependencyStrongerThan(newBarrier))
{
barrier->execute(primary);
barrier = newBarrier;
}
} }
mPipelineBarrierMask.reset(); mPipelineBarrierMask.reset();
ASSERT(barrier);
barrier->execute(primary);
} }
void CommandBufferHelper::beginRenderPass(const vk::Framebuffer &framebuffer, void CommandBufferHelper::beginRenderPass(const vk::Framebuffer &framebuffer,
......
...@@ -600,7 +600,7 @@ class PipelineBarrier : angle::NonCopyable ...@@ -600,7 +600,7 @@ class PipelineBarrier : angle::NonCopyable
bool isEmpty() const { return mImageMemoryBarriers.empty() && mMemoryBarrierSrcAccess == 0; } bool isEmpty() const { return mImageMemoryBarriers.empty() && mMemoryBarrierSrcAccess == 0; }
void execute(PrimaryCommandBuffer *primary) void writeCommand(PrimaryCommandBuffer *primary)
{ {
if (isEmpty()) if (isEmpty())
{ {
...@@ -624,22 +624,6 @@ class PipelineBarrier : angle::NonCopyable ...@@ -624,22 +624,6 @@ class PipelineBarrier : angle::NonCopyable
reset(); reset();
} }
// Merge the other barrier into this one if this barrier's dependency also covers dependency of
// the other barrier. Returns true if we actually merged.
bool mergeIfDependencyStrongerThan(PipelineBarrier *other)
{
// If mDstStageMask already has the other's mDstStageMask bits, then merge it
bool doMerge = (mDstStageMask == (mDstStageMask | other->mDstStageMask)) ||
// If my dependency is stronger then we can merge
(gl::ScanReverse(mSrcStageMask) >= gl::ScanReverse(other->mSrcStageMask));
if (doMerge)
{
merge(other);
}
return doMerge;
}
// merge two barriers into one // merge two barriers into one
void merge(PipelineBarrier *other) void merge(PipelineBarrier *other)
{ {
......
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