<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>