anv/gen10: Emit CS stall and mark push constants dirty.
authorRafael Antognolli <rafael.antognolli@intel.com>
Fri, 26 Jan 2018 19:15:47 +0000 (11:15 -0800)
committerRafael Antognolli <rafael.antognolli@intel.com>
Fri, 26 Jan 2018 19:59:17 +0000 (11:59 -0800)
I got reviews and fixed the patches locally, but ended up merging the
ones that I sent originally to the list. This patch fixes those
mistakes.

Fixes: 78c125af3904c539ea69bec2dd9fdf7a5162854f
Signed-off-by: Rafael Antognolli <rafael.antognolli@intel.com>
Cc: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/intel/vulkan/anv_private.h
src/intel/vulkan/genX_cmd_buffer.c

index 9d452de..3cf37dd 100644 (file)
@@ -1477,7 +1477,6 @@ enum anv_pipe_bits {
    ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT    = (1 << 3),
    ANV_PIPE_VF_CACHE_INVALIDATE_BIT          = (1 << 4),
    ANV_PIPE_DATA_CACHE_FLUSH_BIT             = (1 << 5),
-   ANV_PIPE_ISP_DISABLE_BIT                  = (1 << 9),
    ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT     = (1 << 10),
    ANV_PIPE_INSTRUCTION_CACHE_INVALIDATE_BIT = (1 << 11),
    ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT    = (1 << 12),
index e8d44d0..3691b4b 100644 (file)
@@ -969,6 +969,15 @@ genX(BeginCommandBuffer)(
    if (cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY)
       cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_VF_CACHE_INVALIDATE_BIT;
 
+   /* We send an "Indirect State Pointers Disable" packet at
+    * EndCommandBuffer, so all push contant packets are ignored during a
+    * context restore. Documentation says after that command, we need to
+    * emit push constants again before any rendering operation. So we
+    * flag them dirty here to make sure they get emitted.
+    */
+   if (GEN_GEN == 10)
+      cmd_buffer->state.push_constants_dirty |= VK_SHADER_STAGE_ALL_GRAPHICS;
+
    VkResult result = VK_SUCCESS;
    if (cmd_buffer->usage_flags &
        VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
@@ -1008,8 +1017,7 @@ genX(BeginCommandBuffer)(
    return result;
 }
 
-/**
- * From the PRM, Volume 2a:
+/* From the PRM, Volume 2a:
  *
  *    "Indirect State Pointers Disable
  *
@@ -1039,16 +1047,14 @@ genX(BeginCommandBuffer)(
  * hardware to ignore previous 3DSTATE_CONSTANT_* packets during a
  * context restore, so the mentioned hang doesn't happen. However,
  * software must program push constant commands for all stages prior to
- * rendering anything, so we flag them as dirty.
+ * rendering anything. So we flag them dirty in BeginCommandBuffer.
  */
 static void
 emit_isp_disable(struct anv_cmd_buffer *cmd_buffer)
 {
    anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
          pc.IndirectStatePointersDisable = true;
-         pc.PostSyncOperation = WriteImmediateData;
-         pc.Address           =
-            (struct anv_address) { &cmd_buffer->device->workaround_bo, 0 };
+         pc.CommandStreamerStallEnable = true;
    }
 }