Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 234ea5b

Browse files
cclaoCommit Bot
authored andcommitted
Vulkan: Wrap barrier data into PipelineBarrier class
This is preparation CL without introducing any functional change. This Cl wraps barrier data into its own class and put necessary data structures in place. It still uses one vkCmdPipelineBarrier call. Bug: b/155341891 Change-Id: If9c70d24873bd9b89e598acfba2eeee364f0b6c1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2185149 Commit-Queue: Charlie Lao <[email protected]> Reviewed-by: Jamie Madill <[email protected]>
1 parent dae210e commit 234ea5b

File tree

7 files changed

+203
-124
lines changed

7 files changed

+203
-124
lines changed

src/libANGLE/renderer/vulkan/ContextVk.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,7 +1059,7 @@ angle::Result ContextVk::setupIndirectDraw(const gl::Context *context,
10591059
GLsizei instanceCount = 1;
10601060

10611061
mRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
1062-
VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, indirectBuffer);
1062+
vk::PipelineStage::DrawIndirect, indirectBuffer);
10631063

10641064
ANGLE_TRY(setupDraw(context, mode, firstVertex, vertexCount, instanceCount,
10651065
gl::DrawElementsType::InvalidEnum, nullptr, dirtyBitMask,
@@ -1372,7 +1372,7 @@ angle::Result ContextVk::handleDirtyGraphicsVertexBuffers(const gl::Context *con
13721372
if (arrayBuffer)
13731373
{
13741374
mRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
1375-
VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, arrayBuffer);
1375+
vk::PipelineStage::VertexInput, arrayBuffer);
13761376
}
13771377
}
13781378

@@ -1390,7 +1390,7 @@ angle::Result ContextVk::handleDirtyGraphicsIndexBuffer(const gl::Context *conte
13901390
getVkIndexType(mCurrentDrawElementsType));
13911391

13921392
mRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_INDEX_READ_BIT,
1393-
VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, elementArrayBuffer);
1393+
vk::PipelineStage::VertexInput, elementArrayBuffer);
13941394

13951395
return angle::Result::Continue;
13961396
}
@@ -1450,7 +1450,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation(
14501450
vk::BufferHelper &bufferHelper = bufferVk->getBuffer();
14511451

14521452
mRenderPassCommands.bufferWrite(&mResourceUseList, VK_ACCESS_SHADER_WRITE_BIT,
1453-
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, &bufferHelper);
1453+
vk::PipelineStage::VertexShader, &bufferHelper);
14541454
}
14551455

14561456
// TODO(http://anglebug.com/3570): Need to update to handle Program Pipelines
@@ -1489,9 +1489,9 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension(
14891489
vk::BufferHelper &bufferHelper = bufferVk->getBuffer();
14901490
bufferHandles[bufferIndex] = bufferHelper.getBuffer().getHandle();
14911491

1492-
mRenderPassCommands.bufferWrite(
1493-
&mResourceUseList, VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,
1494-
VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, &bufferHelper);
1492+
mRenderPassCommands.bufferWrite(&mResourceUseList,
1493+
VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,
1494+
vk::PipelineStage::TransformFeedback, &bufferHelper);
14951495
}
14961496

14971497
const TransformFeedbackBufferRange &xfbBufferRangeExtension =
@@ -2158,7 +2158,7 @@ angle::Result ContextVk::drawArraysIndirect(const gl::Context *context,
21582158
if (mVertexArray->getStreamingVertexAttribsMask().any())
21592159
{
21602160
mRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
2161-
VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, currentIndirectBuf);
2161+
vk::PipelineStage::DrawIndirect, currentIndirectBuf);
21622162

21632163
// We have instanced vertex attributes that need to be emulated for Vulkan.
21642164
// invalidate any cache and map the buffer so that we can read the indirect data.
@@ -2212,7 +2212,7 @@ angle::Result ContextVk::drawElementsIndirect(const gl::Context *context,
22122212
if (mVertexArray->getStreamingVertexAttribsMask().any())
22132213
{
22142214
mRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
2215-
VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, currentIndirectBuf);
2215+
vk::PipelineStage::DrawIndirect, currentIndirectBuf);
22162216

22172217
// We have instanced vertex attributes that need to be emulated for Vulkan.
22182218
// invalidate any cache and map the buffer so that we can read the indirect data.
@@ -3249,7 +3249,7 @@ angle::Result ContextVk::dispatchComputeIndirect(const gl::Context *context, GLi
32493249
gl::Buffer *glBuffer = getState().getTargetBuffer(gl::BufferBinding::DispatchIndirect);
32503250
vk::BufferHelper &buffer = vk::GetImpl(glBuffer)->getBuffer();
32513251
mOutsideRenderPassCommands.bufferRead(&mResourceUseList, VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
3252-
VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, &buffer);
3252+
vk::PipelineStage::DrawIndirect, &buffer);
32533253

32543254
commandBuffer->dispatchIndirect(buffer.getBuffer(), indirect);
32553255

@@ -4039,7 +4039,7 @@ bool ContextVk::shouldUseOldRewriteStructSamplers() const
40394039
}
40404040

40414041
angle::Result ContextVk::onBufferRead(VkAccessFlags readAccessType,
4042-
VkPipelineStageFlags readStage,
4042+
vk::PipelineStage readStage,
40434043
vk::BufferHelper *buffer)
40444044
{
40454045
ANGLE_TRY(endRenderPass());
@@ -4055,7 +4055,7 @@ angle::Result ContextVk::onBufferRead(VkAccessFlags readAccessType,
40554055
}
40564056

40574057
angle::Result ContextVk::onBufferWrite(VkAccessFlags writeAccessType,
4058-
VkPipelineStageFlags writeStage,
4058+
vk::PipelineStage writeStage,
40594059
vk::BufferHelper *buffer)
40604060
{
40614061
ANGLE_TRY(endRenderPass());

src/libANGLE/renderer/vulkan/ContextVk.h

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -464,21 +464,19 @@ class ContextVk : public ContextImpl, public vk::Context
464464

465465
angle::Result onBufferTransferRead(vk::BufferHelper *buffer)
466466
{
467-
return onBufferRead(VK_ACCESS_TRANSFER_READ_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, buffer);
467+
return onBufferRead(VK_ACCESS_TRANSFER_READ_BIT, vk::PipelineStage::Transfer, buffer);
468468
}
469469
angle::Result onBufferTransferWrite(vk::BufferHelper *buffer)
470470
{
471-
return onBufferWrite(VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, buffer);
471+
return onBufferWrite(VK_ACCESS_TRANSFER_WRITE_BIT, vk::PipelineStage::Transfer, buffer);
472472
}
473473
angle::Result onBufferComputeShaderRead(vk::BufferHelper *buffer)
474474
{
475-
return onBufferRead(VK_ACCESS_SHADER_READ_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
476-
buffer);
475+
return onBufferRead(VK_ACCESS_SHADER_READ_BIT, vk::PipelineStage::ComputeShader, buffer);
477476
}
478477
angle::Result onBufferComputeShaderWrite(vk::BufferHelper *buffer)
479478
{
480-
return onBufferWrite(VK_ACCESS_SHADER_WRITE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
481-
buffer);
479+
return onBufferWrite(VK_ACCESS_SHADER_WRITE_BIT, vk::PipelineStage::ComputeShader, buffer);
482480
}
483481

484482
angle::Result onImageRead(VkImageAspectFlags aspectFlags,
@@ -799,10 +797,10 @@ class ContextVk : public ContextImpl, public vk::Context
799797
ANGLE_INLINE void onRenderPassFinished() { mRenderPassCommandBuffer = nullptr; }
800798

801799
angle::Result onBufferRead(VkAccessFlags readAccessType,
802-
VkPipelineStageFlags readStage,
800+
vk::PipelineStage readStage,
803801
vk::BufferHelper *buffer);
804802
angle::Result onBufferWrite(VkAccessFlags writeAccessType,
805-
VkPipelineStageFlags writeStage,
803+
vk::PipelineStage writeStage,
806804
vk::BufferHelper *buffer);
807805

808806
void initIndexTypeMap();

src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ namespace rx
2222
{
2323
namespace
2424
{
25+
constexpr gl::ShaderMap<vk::PipelineStage> kPipelineStageShaderMap = {
26+
{gl::ShaderType::Vertex, vk::PipelineStage::VertexShader},
27+
{gl::ShaderType::Fragment, vk::PipelineStage::FragmentShader},
28+
{gl::ShaderType::Geometry, vk::PipelineStage::GeometryShader},
29+
{gl::ShaderType::Compute, vk::PipelineStage::ComputeShader},
30+
};
31+
2532
VkDeviceSize GetShaderBufferBindingSize(const gl::OffsetBindingPointer<gl::Buffer> &bufferBinding)
2633
{
2734
if (bufferBinding.getSize() != 0)
@@ -942,14 +949,12 @@ void ProgramExecutableVk::updateBuffersDescriptorSet(ContextVk *contextVk,
942949
// We set the SHADER_READ_BIT to be conservative.
943950
VkAccessFlags accessFlags = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
944951
commandBufferHelper->bufferWrite(resourceUseList, accessFlags,
945-
gl_vk::kPipelineStageShaderMap[shaderType],
946-
&bufferHelper);
952+
kPipelineStageShaderMap[shaderType], &bufferHelper);
947953
}
948954
else
949955
{
950956
commandBufferHelper->bufferRead(resourceUseList, VK_ACCESS_UNIFORM_READ_BIT,
951-
gl_vk::kPipelineStageShaderMap[shaderType],
952-
&bufferHelper);
957+
kPipelineStageShaderMap[shaderType], &bufferHelper);
953958
}
954959

955960
++writeCount;
@@ -1022,7 +1027,7 @@ void ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
10221027
// We set SHADER_READ_BIT to be conservative.
10231028
commandBufferHelper->bufferWrite(resourceUseList,
10241029
VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
1025-
gl_vk::kPipelineStageShaderMap[shaderType], &bufferHelper);
1030+
kPipelineStageShaderMap[shaderType], &bufferHelper);
10261031

10271032
writtenBindings.set(binding);
10281033
}

src/libANGLE/renderer/vulkan/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,5 +79,5 @@ More implementation details can be found in the `doc` directory:
7979

8080
[VkDevice]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkDevice.html
8181
[VkQueue]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkQueue.html
82-
[CommandAPIs]: https://chromium.googlesource.com/angle/angle/+/aa09ca69e4173cb14261e39be3b7bdf56bbd3840/src/libANGLE/renderer/vulkan/ContextVk.h#579
82+
[CommandAPIs]: https://chromium.googlesource.com/angle/angle/+/df31624eaf3df986a0bdf3f58a87b79b0cc8db5c/src/libANGLE/renderer/vulkan/ContextVk.h#620
8383

src/libANGLE/renderer/vulkan/vk_helpers.cpp

Lines changed: 47 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,22 @@ constexpr int kLineLoopDynamicIndirectBufferInitialSize = sizeof(VkDrawIndirectC
4747
// This is an arbitrary max. We can change this later if necessary.
4848
constexpr uint32_t kDefaultDescriptorPoolMaxSets = 128;
4949

50+
constexpr angle::PackedEnumMap<PipelineStage, VkPipelineStageFlagBits> kPipelineStageFlagBitMap = {
51+
{PipelineStage::TopOfPipe, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT},
52+
{PipelineStage::DrawIndirect, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT},
53+
{PipelineStage::VertexInput, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT},
54+
{PipelineStage::VertexShader, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT},
55+
{PipelineStage::GeometryShader, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT},
56+
{PipelineStage::TransformFeedback, VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT},
57+
{PipelineStage::EarlyFragmentTest, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT},
58+
{PipelineStage::FragmentShader, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT},
59+
{PipelineStage::LateFragmentTest, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT},
60+
{PipelineStage::ColorAttachmentOutput, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT},
61+
{PipelineStage::ComputeShader, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT},
62+
{PipelineStage::Transfer, VK_PIPELINE_STAGE_TRANSFER_BIT},
63+
{PipelineStage::BottomOfPipe, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT},
64+
{PipelineStage::Host, VK_PIPELINE_STAGE_HOST_BIT}};
65+
5066
struct ImageMemoryBarrierData
5167
{
5268
// The Vk layout corresponding to the ImageLayout key.
@@ -455,12 +471,7 @@ VkImageLayout ConvertImageLayoutToVkImageLayout(ImageLayout imageLayout)
455471

456472
// CommandBufferHelper implementation.
457473
CommandBufferHelper::CommandBufferHelper(bool hasRenderPass)
458-
: mImageBarrierSrcStageMask(0),
459-
mImageBarrierDstStageMask(0),
460-
mGlobalMemoryBarrierSrcAccess(0),
461-
mGlobalMemoryBarrierDstAccess(0),
462-
mGlobalMemoryBarrierSrcStages(0),
463-
mGlobalMemoryBarrierDstStages(0),
474+
: mPipelineBarrier(),
464475
mCounter(0),
465476
mClearValues{},
466477
mRenderPassStarted(false),
@@ -482,34 +493,29 @@ void CommandBufferHelper::initialize(angle::PoolAllocator *poolAllocator)
482493

483494
void CommandBufferHelper::bufferRead(vk::ResourceUseList *resourceUseList,
484495
VkAccessFlags readAccessType,
485-
VkPipelineStageFlags readStage,
496+
vk::PipelineStage readStage,
486497
vk::BufferHelper *buffer)
487498
{
488499
buffer->retain(resourceUseList);
489-
buffer->updateReadBarrier(readAccessType, &mGlobalMemoryBarrierSrcAccess,
490-
&mGlobalMemoryBarrierDstAccess, readStage,
491-
&mGlobalMemoryBarrierSrcStages, &mGlobalMemoryBarrierDstStages);
500+
VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[readStage];
501+
buffer->updateReadBarrier(readAccessType, stageBits, &mPipelineBarrier);
492502
}
493503

494504
void CommandBufferHelper::bufferWrite(vk::ResourceUseList *resourceUseList,
495505
VkAccessFlags writeAccessType,
496-
VkPipelineStageFlags writeStage,
506+
vk::PipelineStage writeStage,
497507
vk::BufferHelper *buffer)
498508
{
499509
buffer->retain(resourceUseList);
500-
buffer->updateWriteBarrier(writeAccessType, &mGlobalMemoryBarrierSrcAccess,
501-
&mGlobalMemoryBarrierDstAccess, writeStage,
502-
&mGlobalMemoryBarrierSrcStages, &mGlobalMemoryBarrierDstStages);
510+
VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[writeStage];
511+
buffer->updateWriteBarrier(writeAccessType, stageBits, &mPipelineBarrier);
503512
}
504513

505514
void CommandBufferHelper::imageBarrier(VkPipelineStageFlags srcStageMask,
506515
VkPipelineStageFlags dstStageMask,
507516
const VkImageMemoryBarrier &imageMemoryBarrier)
508517
{
509-
ASSERT(imageMemoryBarrier.pNext == nullptr);
510-
mImageBarrierSrcStageMask |= srcStageMask;
511-
mImageBarrierDstStageMask |= dstStageMask;
512-
mImageMemoryBarriers.push_back(imageMemoryBarrier);
518+
mPipelineBarrier.mergeImageBarrier(srcStageMask, dstStageMask, imageMemoryBarrier);
513519
}
514520

515521
void CommandBufferHelper::imageRead(vk::ResourceUseList *resourceUseList,
@@ -535,41 +541,7 @@ void CommandBufferHelper::imageWrite(vk::ResourceUseList *resourceUseList,
535541

536542
void CommandBufferHelper::executeBarriers(vk::PrimaryCommandBuffer *primary)
537543
{
538-
if (mImageMemoryBarriers.empty() && mGlobalMemoryBarrierSrcAccess == 0)
539-
{
540-
return;
541-
}
542-
543-
VkPipelineStageFlags srcStages = 0;
544-
VkPipelineStageFlags dstStages = 0;
545-
546-
VkMemoryBarrier memoryBarrier = {};
547-
uint32_t memoryBarrierCount = 0;
548-
549-
if (mGlobalMemoryBarrierSrcAccess != 0)
550-
{
551-
memoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
552-
memoryBarrier.srcAccessMask = mGlobalMemoryBarrierSrcAccess;
553-
memoryBarrier.dstAccessMask = mGlobalMemoryBarrierDstAccess;
554-
555-
memoryBarrierCount++;
556-
srcStages |= mGlobalMemoryBarrierSrcStages;
557-
dstStages |= mGlobalMemoryBarrierDstStages;
558-
559-
mGlobalMemoryBarrierSrcAccess = 0;
560-
mGlobalMemoryBarrierDstAccess = 0;
561-
mGlobalMemoryBarrierSrcStages = 0;
562-
mGlobalMemoryBarrierDstStages = 0;
563-
}
564-
565-
srcStages |= mImageBarrierSrcStageMask;
566-
dstStages |= mImageBarrierDstStageMask;
567-
primary->pipelineBarrier(srcStages, dstStages, 0, memoryBarrierCount, &memoryBarrier, 0,
568-
nullptr, static_cast<uint32_t>(mImageMemoryBarriers.size()),
569-
mImageMemoryBarriers.data());
570-
mImageMemoryBarriers.clear();
571-
mImageBarrierSrcStageMask = 0;
572-
mImageBarrierDstStageMask = 0;
544+
mPipelineBarrier.writeCommand(primary);
573545
}
574546

575547
void CommandBufferHelper::beginRenderPass(const vk::Framebuffer &framebuffer,
@@ -705,11 +677,11 @@ char GetStoreOpShorthand(uint32_t storeOp)
705677
void CommandBufferHelper::addCommandDiagnostics(ContextVk *contextVk)
706678
{
707679
std::ostringstream out;
708-
if (mGlobalMemoryBarrierSrcAccess != 0 || mGlobalMemoryBarrierDstAccess != 0)
709-
{
710-
out << "Memory Barrier Src: 0x" << std::hex << mGlobalMemoryBarrierSrcAccess
711-
<< " &rarr; Dst: 0x" << std::hex << mGlobalMemoryBarrierDstAccess << "\\l";
712-
}
680+
681+
out << "Memory Barrier: ";
682+
mPipelineBarrier.addDiagnosticsString(out);
683+
out << "\\l";
684+
713685
if (mIsRenderPassCommandBuffer)
714686
{
715687
size_t attachmentCount = mRenderPassDesc.attachmentCount();
@@ -2029,6 +2001,17 @@ void LineLoopHelper::Draw(uint32_t count, uint32_t baseVertex, CommandBuffer *co
20292001
commandBuffer->drawIndexedBaseVertex(count, baseVertex);
20302002
}
20312003

2004+
// PipelineBarrier implementation.
2005+
void PipelineBarrier::addDiagnosticsString(std::ostringstream &out) const
2006+
{
2007+
if (mMemoryBarrierSrcAccess != 0 || mMemoryBarrierDstAccess != 0)
2008+
{
2009+
out << "{"
2010+
<< "Src: 0x" << std::hex << mMemoryBarrierSrcAccess << " -> Dst: 0x" << std::hex
2011+
<< mMemoryBarrierDstAccess << "}";
2012+
}
2013+
}
2014+
20322015
// BufferHelper implementation.
20332016
BufferHelper::BufferHelper()
20342017
: mMemoryPropertyFlags{},
@@ -2289,21 +2272,16 @@ bool BufferHelper::canAccumulateWrite(ContextVk *contextVk, VkAccessFlags writeA
22892272
}
22902273

22912274
void BufferHelper::updateReadBarrier(VkAccessFlags readAccessType,
2292-
VkAccessFlags *barrierSrcOut,
2293-
VkAccessFlags *barrierDstOut,
22942275
VkPipelineStageFlags readStage,
2295-
VkPipelineStageFlags *barrierSrcStageOut,
2296-
VkPipelineStageFlags *barrierDstStageOut)
2276+
PipelineBarrier *barrier)
22972277
{
22982278
// If there was a prior write and we are making a read that is either a new access type or from
22992279
// a new stage, we need a barrier
23002280
if (mCurrentWriteAccess != 0 && (((mCurrentReadAccess & readAccessType) != readAccessType) ||
23012281
((mCurrentReadStages & readStage) != readStage)))
23022282
{
2303-
*barrierSrcOut |= mCurrentWriteAccess;
2304-
*barrierDstOut |= readAccessType;
2305-
*barrierSrcStageOut |= mCurrentWriteStages;
2306-
*barrierDstStageOut |= readStage;
2283+
barrier->mergeMemoryBarrier(mCurrentWriteStages, readStage, mCurrentWriteAccess,
2284+
readAccessType);
23072285
}
23082286

23092287
// Accumulate new read usage.
@@ -2312,22 +2290,17 @@ void BufferHelper::updateReadBarrier(VkAccessFlags readAccessType,
23122290
}
23132291

23142292
void BufferHelper::updateWriteBarrier(VkAccessFlags writeAccessType,
2315-
VkAccessFlags *barrierSrcOut,
2316-
VkAccessFlags *barrierDstOut,
23172293
VkPipelineStageFlags writeStage,
2318-
VkPipelineStageFlags *barrierSrcStageOut,
2319-
VkPipelineStageFlags *barrierDstStageOut)
2294+
PipelineBarrier *barrier)
23202295
{
23212296
// We don't need to check mCurrentReadStages here since if it is not zero, mCurrentReadAccess
23222297
// must not be zero as well. stage is finer grain than accessType.
23232298
ASSERT((!mCurrentReadStages && !mCurrentReadAccess) ||
23242299
(mCurrentReadStages && mCurrentReadAccess));
23252300
if (mCurrentReadAccess != 0 || mCurrentWriteAccess != 0)
23262301
{
2327-
*barrierSrcOut |= mCurrentWriteAccess;
2328-
*barrierDstOut |= writeAccessType;
2329-
*barrierSrcStageOut |= mCurrentWriteStages | mCurrentReadStages;
2330-
*barrierDstStageOut |= writeStage;
2302+
barrier->mergeMemoryBarrier(mCurrentWriteStages | mCurrentReadStages, writeStage,
2303+
mCurrentWriteAccess, writeAccessType);
23312304
}
23322305

23332306
// Reset usages on the new write.

0 commit comments

Comments
 (0)