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