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