anv/cmd_buffer: Move state base address re-emit into ExecuteCommands
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 17 Oct 2016 16:14:48 +0000 (09:14 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 18 Oct 2016 00:41:35 +0000 (17:41 -0700)
This has two primary advantages.  First, it means that the batch_chain code
knows less about the actual command buffer contents which is good because
improves separation.  Second, it means that it only gets re-emitted once
after all of the secondaries instead of once after each secondary which is
just wasteful.  It also has the advantage of cleaning the code up a bit.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
src/intel/vulkan/anv_batch_chain.c
src/intel/vulkan/anv_cmd_buffer.c

index a98a0a9ba66c77a3d5e682a5e9cc12a1795df973..95854f42c2537da1f64e92bc4c35787397932d61 100644 (file)
@@ -777,7 +777,6 @@ anv_cmd_buffer_add_secondary(struct anv_cmd_buffer *primary,
    switch (secondary->exec_mode) {
    case ANV_CMD_BUFFER_EXEC_MODE_EMIT:
       anv_batch_emit_batch(&primary->batch, &secondary->batch);
-      anv_cmd_buffer_emit_state_base_address(primary);
       break;
    case ANV_CMD_BUFFER_EXEC_MODE_GROW_AND_EMIT: {
       struct anv_batch_bo *bbo = anv_cmd_buffer_current_batch_bo(primary);
@@ -785,7 +784,6 @@ anv_cmd_buffer_add_secondary(struct anv_cmd_buffer *primary,
       anv_batch_bo_grow(primary, bbo, &primary->batch, length,
                         GEN8_MI_BATCH_BUFFER_START_length * 4);
       anv_batch_emit_batch(&primary->batch, &secondary->batch);
-      anv_cmd_buffer_emit_state_base_address(primary);
       break;
    }
    case ANV_CMD_BUFFER_EXEC_MODE_CHAIN: {
@@ -826,8 +824,6 @@ anv_cmd_buffer_add_secondary(struct anv_cmd_buffer *primary,
             p += CACHELINE_SIZE;
          }
       }
-
-      anv_cmd_buffer_emit_state_base_address(primary);
       break;
    }
    case ANV_CMD_BUFFER_EXEC_MODE_COPY_AND_CHAIN: {
@@ -851,8 +847,6 @@ anv_cmd_buffer_add_secondary(struct anv_cmd_buffer *primary,
 
       anv_batch_bo_continue(last_bbo, &primary->batch,
                             GEN8_MI_BATCH_BUFFER_START_length * 4);
-
-      anv_cmd_buffer_emit_state_base_address(primary);
       break;
    }
    default:
index 5bcd5e0fb8aaf6077ee1c812514f0dd568c27c48..b55a07057d242ea7b14d3e0b6fc4c5d8ab1175b8 100644 (file)
@@ -1180,6 +1180,15 @@ void anv_CmdExecuteCommands(
 
       anv_cmd_buffer_add_secondary(primary, secondary);
    }
+
+   /* Each of the secondary command buffers will use its own state base
+    * address.  We need to re-emit state base address for the primary after
+    * all of the secondaries are done.
+    *
+    * TODO: Maybe we want to make this a dirty bit to avoid extra state base
+    * address calls?
+    */
+   anv_cmd_buffer_emit_state_base_address(primary);
 }
 
 VkResult anv_CreateCommandPool(