anv/cmd_buffer: Move state base address re-emit into ExecuteCommands

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>
This commit is contained in:
Jason Ekstrand
2016-10-17 09:14:48 -07:00
parent 1c05f92590
commit ac0ca066de
2 changed files with 9 additions and 6 deletions

View File

@@ -777,7 +777,6 @@ anv_cmd_buffer_add_secondary(struct anv_cmd_buffer *primary,
switch (secondary->exec_mode) { switch (secondary->exec_mode) {
case ANV_CMD_BUFFER_EXEC_MODE_EMIT: case ANV_CMD_BUFFER_EXEC_MODE_EMIT:
anv_batch_emit_batch(&primary->batch, &secondary->batch); anv_batch_emit_batch(&primary->batch, &secondary->batch);
anv_cmd_buffer_emit_state_base_address(primary);
break; break;
case ANV_CMD_BUFFER_EXEC_MODE_GROW_AND_EMIT: { case ANV_CMD_BUFFER_EXEC_MODE_GROW_AND_EMIT: {
struct anv_batch_bo *bbo = anv_cmd_buffer_current_batch_bo(primary); 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, anv_batch_bo_grow(primary, bbo, &primary->batch, length,
GEN8_MI_BATCH_BUFFER_START_length * 4); GEN8_MI_BATCH_BUFFER_START_length * 4);
anv_batch_emit_batch(&primary->batch, &secondary->batch); anv_batch_emit_batch(&primary->batch, &secondary->batch);
anv_cmd_buffer_emit_state_base_address(primary);
break; break;
} }
case ANV_CMD_BUFFER_EXEC_MODE_CHAIN: { case ANV_CMD_BUFFER_EXEC_MODE_CHAIN: {
@@ -826,8 +824,6 @@ anv_cmd_buffer_add_secondary(struct anv_cmd_buffer *primary,
p += CACHELINE_SIZE; p += CACHELINE_SIZE;
} }
} }
anv_cmd_buffer_emit_state_base_address(primary);
break; break;
} }
case ANV_CMD_BUFFER_EXEC_MODE_COPY_AND_CHAIN: { 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, anv_batch_bo_continue(last_bbo, &primary->batch,
GEN8_MI_BATCH_BUFFER_START_length * 4); GEN8_MI_BATCH_BUFFER_START_length * 4);
anv_cmd_buffer_emit_state_base_address(primary);
break; break;
} }
default: default:

View File

@@ -1180,6 +1180,15 @@ void anv_CmdExecuteCommands(
anv_cmd_buffer_add_secondary(primary, secondary); 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( VkResult anv_CreateCommandPool(