<div dir="ltr">Feel free to call it a bugfix and CC stable if you'd like.<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jun 11, 2019 at 10:54 AM Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 10, 2019 at 6:21 AM Ville Syrjala <<a href="mailto:ville.syrjala@linux.intel.com" target="_blank">ville.syrjala@linux.intel.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Ville Syrjälä <<a href="mailto:ville.syrjala@linux.intel.com" target="_blank">ville.syrjala@linux.intel.com</a>><br>
<br>
Modern DXVK requires event support [1], but looks like it only<br>
uses vkCmdSetEvent() + vkGetEventStatus(). So we can just<br>
borrow the relevant code from gen8, leaving CmdWaitEvents still<br>
unimplemented.<br>
<br>
[1] <a href="https://github.com/doitsujin/dxvk/commit/8c3900c533d83d12c970b905183d17a1d3e8df1f" rel="noreferrer" target="_blank">https://github.com/doitsujin/dxvk/commit/8c3900c533d83d12c970b905183d17a1d3e8df1f</a><br>
<br>
v2: Also move CmdWaitEvents into genX_cmd_buffer.c (Jason)<br>
<br>
Signed-off-by: Ville Syrjälä <<a href="mailto:ville.syrjala@linux.intel.com" target="_blank">ville.syrjala@linux.intel.com</a>><br>
---<br>
 src/intel/vulkan/gen7_cmd_buffer.c |  38 ----------<br>
 src/intel/vulkan/gen8_cmd_buffer.c | 102 ---------------------------<br>
 src/intel/vulkan/genX_cmd_buffer.c | 107 +++++++++++++++++++++++++++++<br>
 3 files changed, 107 insertions(+), 140 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/gen7_cmd_buffer.c b/src/intel/vulkan/gen7_cmd_buffer.c<br>
index 380283bdd563..115d12b35362 100644<br>
--- a/src/intel/vulkan/gen7_cmd_buffer.c<br>
+++ b/src/intel/vulkan/gen7_cmd_buffer.c<br>
@@ -286,41 +286,3 @@ genX(cmd_buffer_enable_pma_fix)(struct anv_cmd_buffer *cmd_buffer,<br>
 {<br>
    /* The NP PMA fix doesn't exist on gen7 */<br>
 }<br>
-<br>
-void genX(CmdSetEvent)(<br>
-    VkCommandBuffer                             commandBuffer,<br>
-    VkEvent                                     event,<br>
-    VkPipelineStageFlags                        stageMask)<br>
-{<br>
-   anv_finishme("Implement events on gen7");<br>
-}<br>
-<br>
-void genX(CmdResetEvent)(<br>
-    VkCommandBuffer                             commandBuffer,<br>
-    VkEvent                                     event,<br>
-    VkPipelineStageFlags                        stageMask)<br>
-{<br>
-   anv_finishme("Implement events on gen7");<br>
-}<br>
-<br>
-void genX(CmdWaitEvents)(<br>
-    VkCommandBuffer                             commandBuffer,<br>
-    uint32_t                                    eventCount,<br>
-    const VkEvent*                              pEvents,<br>
-    VkPipelineStageFlags                        srcStageMask,<br>
-    VkPipelineStageFlags                        destStageMask,<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>
-   anv_finishme("Implement events on gen7");<br>
-<br>
-   genX(CmdPipelineBarrier)(commandBuffer, srcStageMask, destStageMask,<br>
-                            false, /* byRegion */<br>
-                            memoryBarrierCount, pMemoryBarriers,<br>
-                            bufferMemoryBarrierCount, pBufferMemoryBarriers,<br>
-                            imageMemoryBarrierCount, pImageMemoryBarriers);<br>
-}<br>
diff --git a/src/intel/vulkan/gen8_cmd_buffer.c b/src/intel/vulkan/gen8_cmd_buffer.c<br>
index 6568d2c75113..2e6d9de9f4a8 100644<br>
--- a/src/intel/vulkan/gen8_cmd_buffer.c<br>
+++ b/src/intel/vulkan/gen8_cmd_buffer.c<br>
@@ -565,105 +565,3 @@ void genX(CmdBindIndexBuffer)(<br>
<br>
    cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_INDEX_BUFFER;<br>
 }<br>
-<br>
-/* Set of stage bits for which are pipelined, i.e. they get queued by the<br>
- * command streamer for later execution.<br>
- */<br>
-#define ANV_PIPELINE_STAGE_PIPELINED_BITS \<br>
-   (VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | \<br>
-    VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | \<br>
-    VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT | \<br>
-    VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | \<br>
-    VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | \<br>
-    VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | \<br>
-    VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | \<br>
-    VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | \<br>
-    VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | \<br>
-    VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | \<br>
-    VK_PIPELINE_STAGE_TRANSFER_BIT | \<br>
-    VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | \<br>
-    VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | \<br>
-    VK_PIPELINE_STAGE_ALL_COMMANDS_BIT)<br>
-<br>
-void genX(CmdSetEvent)(<br>
-    VkCommandBuffer                             commandBuffer,<br>
-    VkEvent                                     _event,<br>
-    VkPipelineStageFlags                        stageMask)<br>
-{<br>
-   ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);<br>
-   ANV_FROM_HANDLE(anv_event, event, _event);<br>
-<br>
-   anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {<br>
-      if (stageMask & ANV_PIPELINE_STAGE_PIPELINED_BITS) {<br>
-         pc.StallAtPixelScoreboard = true;<br>
-         pc.CommandStreamerStallEnable = true;<br>
-      }<br>
-<br>
-      pc.DestinationAddressType  = DAT_PPGTT,<br>
-      pc.PostSyncOperation       = WriteImmediateData,<br>
-      pc.Address = (struct anv_address) {<br>
-         cmd_buffer->device-><a href="http://dynamic_state_pool.block_pool.bo" rel="noreferrer" target="_blank">dynamic_state_pool.block_pool.bo</a>,<br>
-         event->state.offset<br>
-      };<br>
-      pc.ImmediateData           = VK_EVENT_SET;<br>
-   }<br>
-}<br>
-<br>
-void genX(CmdResetEvent)(<br>
-    VkCommandBuffer                             commandBuffer,<br>
-    VkEvent                                     _event,<br>
-    VkPipelineStageFlags                        stageMask)<br>
-{<br>
-   ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);<br>
-   ANV_FROM_HANDLE(anv_event, event, _event);<br>
-<br>
-   anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {<br>
-      if (stageMask & ANV_PIPELINE_STAGE_PIPELINED_BITS) {<br>
-         pc.StallAtPixelScoreboard = true;<br>
-         pc.CommandStreamerStallEnable = true;<br>
-      }<br>
-<br>
-      pc.DestinationAddressType  = DAT_PPGTT;<br>
-      pc.PostSyncOperation       = WriteImmediateData;<br>
-      pc.Address = (struct anv_address) {<br>
-         cmd_buffer->device-><a href="http://dynamic_state_pool.block_pool.bo" rel="noreferrer" target="_blank">dynamic_state_pool.block_pool.bo</a>,<br>
-         event->state.offset<br>
-      };<br>
-      pc.ImmediateData           = VK_EVENT_RESET;<br>
-   }<br>
-}<br>
-<br>
-void genX(CmdWaitEvents)(<br>
-    VkCommandBuffer                             commandBuffer,<br>
-    uint32_t                                    eventCount,<br>
-    const VkEvent*                              pEvents,<br>
-    VkPipelineStageFlags                        srcStageMask,<br>
-    VkPipelineStageFlags                        destStageMask,<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>
-   ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);<br>
-   for (uint32_t i = 0; i < eventCount; i++) {<br>
-      ANV_FROM_HANDLE(anv_event, event, pEvents[i]);<br>
-<br>
-      anv_batch_emit(&cmd_buffer->batch, GENX(MI_SEMAPHORE_WAIT), sem) {<br>
-         sem.WaitMode            = PollingMode,<br>
-         sem.CompareOperation    = COMPARE_SAD_EQUAL_SDD,<br>
-         sem.SemaphoreDataDword  = VK_EVENT_SET,<br>
-         sem.SemaphoreAddress = (struct anv_address) {<br>
-            cmd_buffer->device-><a href="http://dynamic_state_pool.block_pool.bo" rel="noreferrer" target="_blank">dynamic_state_pool.block_pool.bo</a>,<br>
-            event->state.offset<br>
-         };<br>
-      }<br>
-   }<br>
-<br>
-   genX(CmdPipelineBarrier)(commandBuffer, srcStageMask, destStageMask,<br>
-                            false, /* byRegion */<br>
-                            memoryBarrierCount, pMemoryBarriers,<br>
-                            bufferMemoryBarrierCount, pBufferMemoryBarriers,<br>
-                            imageMemoryBarrierCount, pImageMemoryBarriers);<br>
-}<br>
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c<br>
index f171d02dab72..c57c02a08da7 100644<br>
--- a/src/intel/vulkan/genX_cmd_buffer.c<br>
+++ b/src/intel/vulkan/genX_cmd_buffer.c<br>
@@ -4729,3 +4729,110 @@ void genX(CmdEndConditionalRenderingEXT)(<br>
    cmd_state->conditional_render_enabled = false;<br>
 }<br>
 #endif<br>
+<br>
+/* Set of stage bits for which are pipelined, i.e. they get queued by the<br>
+ * command streamer for later execution.<br>
+ */<br>
+#define ANV_PIPELINE_STAGE_PIPELINED_BITS \<br>
+   (VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | \<br>
+    VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | \<br>
+    VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT | \<br>
+    VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | \<br>
+    VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | \<br>
+    VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | \<br>
+    VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | \<br>
+    VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | \<br>
+    VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | \<br>
+    VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | \<br>
+    VK_PIPELINE_STAGE_TRANSFER_BIT | \<br>
+    VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | \<br>
+    VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | \<br>
+    VK_PIPELINE_STAGE_ALL_COMMANDS_BIT)<br>
+<br>
+void genX(CmdSetEvent)(<br>
+    VkCommandBuffer                             commandBuffer,<br>
+    VkEvent                                     _event,<br>
+    VkPipelineStageFlags                        stageMask)<br>
+{<br>
+   ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);<br>
+   ANV_FROM_HANDLE(anv_event, event, _event);<br>
+<br>
+   anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {<br>
+      if (stageMask & ANV_PIPELINE_STAGE_PIPELINED_BITS) {<br>
+         pc.StallAtPixelScoreboard = true;<br>
+         pc.CommandStreamerStallEnable = true;<br>
+      }<br>
+<br>
+      pc.DestinationAddressType  = DAT_PPGTT,<br>
+      pc.PostSyncOperation       = WriteImmediateData,<br>
+      pc.Address = (struct anv_address) {<br>
+         cmd_buffer->device-><a href="http://dynamic_state_pool.block_pool.bo" rel="noreferrer" target="_blank">dynamic_state_pool.block_pool.bo</a>,<br>
+         event->state.offset<br>
+      };<br>
+      pc.ImmediateData           = VK_EVENT_SET;<br>
+   }<br>
+}<br>
+<br>
+void genX(CmdResetEvent)(<br>
+    VkCommandBuffer                             commandBuffer,<br>
+    VkEvent                                     _event,<br>
+    VkPipelineStageFlags                        stageMask)<br>
+{<br>
+   ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);<br>
+   ANV_FROM_HANDLE(anv_event, event, _event);<br>
+<br>
+   anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {<br>
+      if (stageMask & ANV_PIPELINE_STAGE_PIPELINED_BITS) {<br>
+         pc.StallAtPixelScoreboard = true;<br>
+         pc.CommandStreamerStallEnable = true;<br>
+      }<br>
+<br>
+      pc.DestinationAddressType  = DAT_PPGTT;<br>
+      pc.PostSyncOperation       = WriteImmediateData;<br>
+      pc.Address = (struct anv_address) {<br>
+         cmd_buffer->device-><a href="http://dynamic_state_pool.block_pool.bo" rel="noreferrer" target="_blank">dynamic_state_pool.block_pool.bo</a>,<br>
+         event->state.offset<br>
+      };<br>
+      pc.ImmediateData           = VK_EVENT_RESET;<br>
+   }<br>
+}<br>
+<br>
+void genX(CmdWaitEvents)(<br>
+    VkCommandBuffer                             commandBuffer,<br>
+    uint32_t                                    eventCount,<br>
+    const VkEvent*                              pEvents,<br>
+    VkPipelineStageFlags                        srcStageMask,<br>
+    VkPipelineStageFlags                        destStageMask,<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>
+#if GEN_GEN >= 8<br>
+   ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);<br>
+<br>
+   for (uint32_t i = 0; i < eventCount; i++) {<br>
+      ANV_FROM_HANDLE(anv_event, event, pEvents[i]);<br>
+<br>
+      anv_batch_emit(&cmd_buffer->batch, GENX(MI_SEMAPHORE_WAIT), sem) {<br>
+         sem.WaitMode            = PollingMode,<br>
+         sem.CompareOperation    = COMPARE_SAD_EQUAL_SDD,<br>
+         sem.SemaphoreDataDword  = VK_EVENT_SET,<br>
+         sem.SemaphoreAddress = (struct anv_address) {<br>
+            cmd_buffer->device-><a href="http://dynamic_state_pool.block_pool.bo" rel="noreferrer" target="_blank">dynamic_state_pool.block_pool.bo</a>,<br>
+            event->state.offset<br>
+         };<br>
+      }<br>
+   }<br>
+#else<br>
+   anv_finishme("Implement events on gen7");<br></blockquote></div><div class="gmail_quote"><br></div><div class="gmail_quote">Maybe change this to "implement event GPU waits on host signals on gen7" to be more specific.  Assuming you did your copy+paste correctly,</div><div class="gmail_quote"><br></div><div class="gmail_quote">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net" target="_blank">jason@jlekstrand.net</a>><br></div><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+#endif<br>
+<br>
+   genX(CmdPipelineBarrier)(commandBuffer, srcStageMask, destStageMask,<br>
+                            false, /* byRegion */<br>
+                            memoryBarrierCount, pMemoryBarriers,<br>
+                            bufferMemoryBarrierCount, pBufferMemoryBarriers,<br>
+                            imageMemoryBarrierCount, pImageMemoryBarriers);<br>
+}<br>
-- <br>
2.21.0<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a></blockquote></div></div>
</blockquote></div>