<div dir="auto">Reviewed-by: Bas Nieuwenhuizen <<a href="mailto:bas@basnieuwenhuizen.nl">bas@basnieuwenhuizen.nl</a>></div><br><div class="gmail_quote"><div dir="ltr">On Wed, 27 Jun 2018, 14:14 Samuel Pitoiset, <<a href="mailto:samuel.pitoiset@gmail.com">samuel.pitoiset@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This introduces radv_barrier() (same as the draw/dispatch codepath).<br>
This helper is used for merging the code from CmdWaitEvents() and<br>
CmdPipelineBarrier because it's quite similar.<br>
<br>
We do ignore the source stage mask for CmdWaitEvents because<br>
it's irrelevant when event objects are used.<br>
<br>
Signed-off-by: Samuel Pitoiset <<a href="mailto:samuel.pitoiset@gmail.com" target="_blank" rel="noreferrer">samuel.pitoiset@gmail.com</a>><br>
---<br>
 src/amd/vulkan/radv_cmd_buffer.c | 103 ++++++++++++++++++-------------<br>
 1 file changed, 60 insertions(+), 43 deletions(-)<br>
<br>
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c<br>
index e020153c29..074e9c4c7f 100644<br>
--- a/src/amd/vulkan/radv_cmd_buffer.c<br>
+++ b/src/amd/vulkan/radv_cmd_buffer.c<br>
@@ -4170,22 +4170,38 @@ static void radv_handle_image_transition(struct radv_cmd_buffer *cmd_buffer,<br>
    }<br>
 }<br>
<br>
-void radv_CmdPipelineBarrier(<br>
-    VkCommandBuffer               commandBuffer,<br>
-    VkPipelineStageFlags            srcStageMask,<br>
-    VkPipelineStageFlags            destStageMask,<br>
-Â Â Â Â VkBool32Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â byRegion,<br>
-    uint32_t                  memoryBarrierCount,<br>
-Â Â Â Â const VkMemoryBarrier*Â Â Â Â Â Â Â Â Â Â Â pMemoryBarriers,<br>
-    uint32_t                  bufferMemoryBarrierCount,<br>
-Â Â Â Â const VkBufferMemoryBarrier*Â Â Â Â Â Â Â Â pBufferMemoryBarriers,<br>
-    uint32_t                  imageMemoryBarrierCount,<br>
-Â Â Â Â const VkImageMemoryBarrier*Â Â Â Â Â Â Â Â Â pImageMemoryBarriers)<br>
+struct radv_barrier_info {<br>
+Â Â Â Â uint32_t eventCount;<br>
+Â Â Â Â const VkEvent *pEvents;<br>
+Â Â Â Â VkPipelineStageFlags srcStageMask;<br>
+};<br>
+<br>
+static void<br>
+radv_barrier(struct radv_cmd_buffer *cmd_buffer,<br>
+Â Â Â Â Â Â uint32_t memoryBarrierCount,<br>
+Â Â Â Â Â Â const VkMemoryBarrier *pMemoryBarriers,<br>
+Â Â Â Â Â Â uint32_t bufferMemoryBarrierCount,<br>
+Â Â Â Â Â Â const VkBufferMemoryBarrier *pBufferMemoryBarriers,<br>
+Â Â Â Â Â Â uint32_t imageMemoryBarrierCount,<br>
+Â Â Â Â Â Â const VkImageMemoryBarrier *pImageMemoryBarriers,<br>
+Â Â Â Â Â Â const struct radv_barrier_info *info)<br>
 {<br>
-Â Â Â Â RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);<br>
+Â Â Â Â struct radeon_cmdbuf *cs = cmd_buffer->cs;<br>
    enum radv_cmd_flush_bits src_flush_bits = 0;<br>
    enum radv_cmd_flush_bits dst_flush_bits = 0;<br>
<br>
+Â Â Â Â for (unsigned i = 0; i < info->eventCount; ++i) {<br>
+Â Â Â Â Â Â Â Â RADV_FROM_HANDLE(radv_event, event, info->pEvents[i]);<br>
+Â Â Â Â Â Â Â Â uint64_t va = radv_buffer_get_va(event->bo);<br>
+<br>
+Â Â Â Â Â Â Â Â radv_cs_add_buffer(cmd_buffer->device->ws, cs, event->bo, 8);<br>
+<br>
+Â Â Â Â Â Â Â Â MAYBE_UNUSED unsigned cdw_max = radeon_check_space(cmd_buffer->device->ws, cs, 7);<br>
+<br>
+Â Â Â Â Â Â Â Â si_emit_wait_fence(cs, va, 1, 0xffffffff);<br>
+Â Â Â Â Â Â Â Â assert(cmd_buffer->cs->cdw <= cdw_max);<br>
+Â Â Â Â }<br>
+<br>
    for (uint32_t i = 0; i < memoryBarrierCount; i++) {<br>
        src_flush_bits |= radv_src_access_flush(cmd_buffer, pMemoryBarriers[i].srcAccessMask);<br>
        dst_flush_bits |= radv_dst_access_flush(cmd_buffer, pMemoryBarriers[i].dstAccessMask,<br>
@@ -4205,7 +4221,7 @@ void radv_CmdPipelineBarrier(<br>
                            image);<br>
    }<br>
<br>
-Â Â Â Â radv_stage_flush(cmd_buffer, srcStageMask);<br>
+Â Â Â Â radv_stage_flush(cmd_buffer, info->srcStageMask);<br>
    cmd_buffer->state.flush_bits |= src_flush_bits;<br>
<br>
    for (uint32_t i = 0; i < imageMemoryBarrierCount; i++) {<br>
@@ -4222,6 +4238,30 @@ void radv_CmdPipelineBarrier(<br>
    cmd_buffer->state.flush_bits |= dst_flush_bits;<br>
 }<br>
<br>
+void radv_CmdPipelineBarrier(<br>
+    VkCommandBuffer               commandBuffer,<br>
+    VkPipelineStageFlags            srcStageMask,<br>
+    VkPipelineStageFlags            destStageMask,<br>
+Â Â Â Â VkBool32Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â byRegion,<br>
+    uint32_t                  memoryBarrierCount,<br>
+Â Â Â Â const VkMemoryBarrier*Â Â Â Â Â Â Â Â Â Â Â pMemoryBarriers,<br>
+    uint32_t                  bufferMemoryBarrierCount,<br>
+Â Â Â Â const VkBufferMemoryBarrier*Â Â Â Â Â Â Â Â pBufferMemoryBarriers,<br>
+    uint32_t                  imageMemoryBarrierCount,<br>
+Â Â Â Â const VkImageMemoryBarrier*Â Â Â Â Â Â Â Â Â pImageMemoryBarriers)<br>
+{<br>
+Â Â Â Â RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);<br>
+Â Â Â Â struct radv_barrier_info info;<br>
+<br>
+Â Â Â Â info.eventCount = 0;<br>
+Â Â Â Â info.pEvents = NULL;<br>
+Â Â Â Â info.srcStageMask = srcStageMask;<br>
+<br>
+Â Â Â Â radv_barrier(cmd_buffer, memoryBarrierCount, pMemoryBarriers,<br>
+Â Â Â Â Â Â Â Â Â Â bufferMemoryBarrierCount, pBufferMemoryBarriers,<br>
+Â Â Â Â Â Â Â Â Â Â imageMemoryBarrierCount, pImageMemoryBarriers, &info);<br>
+}<br>
+<br>
<br>
 static void write_event(struct radv_cmd_buffer *cmd_buffer,<br>
            struct radv_event *event,<br>
@@ -4280,38 +4320,15 @@ void radv_CmdWaitEvents(VkCommandBuffer commandBuffer,<br>
            const VkImageMemoryBarrier* pImageMemoryBarriers)<br>
 {<br>
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);<br>
-Â Â Â Â struct radeon_cmdbuf *cs = cmd_buffer->cs;<br>
-<br>
-Â Â Â Â for (unsigned i = 0; i < eventCount; ++i) {<br>
-Â Â Â Â Â Â Â Â RADV_FROM_HANDLE(radv_event, event, pEvents[i]);<br>
-Â Â Â Â Â Â Â Â uint64_t va = radv_buffer_get_va(event->bo);<br>
-<br>
-Â Â Â Â Â Â Â Â radv_cs_add_buffer(cmd_buffer->device->ws, cs, event->bo, 8);<br>
-<br>
-Â Â Â Â Â Â Â Â MAYBE_UNUSED unsigned cdw_max = radeon_check_space(cmd_buffer->device->ws, cs, 7);<br>
+Â Â Â Â struct radv_barrier_info info;<br>
<br>
-Â Â Â Â Â Â Â Â si_emit_wait_fence(cs, va, 1, 0xffffffff);<br>
-Â Â Â Â Â Â Â Â assert(cmd_buffer->cs->cdw <= cdw_max);<br>
-Â Â Â Â }<br>
-<br>
-<br>
-Â Â Â Â for (uint32_t i = 0; i < imageMemoryBarrierCount; i++) {<br>
-Â Â Â Â Â Â Â Â RADV_FROM_HANDLE(radv_image, image, pImageMemoryBarriers[i].image);<br>
-<br>
-Â Â Â Â Â Â Â Â radv_handle_image_transition(cmd_buffer, image,<br>
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pImageMemoryBarriers[i].oldLayout,<br>
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pImageMemoryBarriers[i].newLayout,<br>
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pImageMemoryBarriers[i].srcQueueFamilyIndex,<br>
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pImageMemoryBarriers[i].dstQueueFamilyIndex,<br>
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â &pImageMemoryBarriers[i].subresourceRange,<br>
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â 0);<br>
-Â Â Â Â }<br>
+Â Â Â Â info.eventCount = eventCount;<br>
+Â Â Â Â info.pEvents = pEvents;<br>
+Â Â Â Â info.srcStageMask = 0;<br>
<br>
-Â Â Â Â /* TODO: figure out how to do memory barriers without waiting */<br>
-Â Â Â Â cmd_buffer->state.flush_bits |= RADV_CMD_FLUSH_AND_INV_FRAMEBUFFER |<br>
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â RADV_CMD_FLAG_INV_GLOBAL_L2 |<br>
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â RADV_CMD_FLAG_INV_VMEM_L1 |<br>
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â RADV_CMD_FLAG_INV_SMEM_L1;<br>
+Â Â Â Â radv_barrier(cmd_buffer, memoryBarrierCount, pMemoryBarriers,<br>
+Â Â Â Â Â Â Â Â Â Â bufferMemoryBarrierCount, pBufferMemoryBarriers,<br>
+Â Â Â Â Â Â Â Â Â Â imageMemoryBarrierCount, pImageMemoryBarriers, &info);<br>
 }<br>
<br>
<br>
-- <br>
2.18.0<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank" rel="noreferrer">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>