diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index 00b8ecd84a5..577fb18d6aa 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -104,8 +104,8 @@ anv_cmd_buffer_ensure_rcs_companion(struct anv_cmd_buffer *cmd_buffer) cmd_buffer->companion_rcs_cmd_buffer = container_of(tmp_cmd_buffer, struct anv_cmd_buffer, vk); - cmd_buffer->companion_rcs_cmd_buffer->vk.level = cmd_buffer->vk.level; - cmd_buffer->companion_rcs_cmd_buffer->is_companion_rcs_cmd_buffer = true; + anv_genX(cmd_buffer->device->info, cmd_buffer_begin_companion)( + cmd_buffer->companion_rcs_cmd_buffer, cmd_buffer->vk.level); unlock_and_return: pthread_mutex_unlock(&cmd_buffer->device->mutex); diff --git a/src/intel/vulkan/anv_genX.h b/src/intel/vulkan/anv_genX.h index 9802656c3e7..5310fea42da 100644 --- a/src/intel/vulkan/anv_genX.h +++ b/src/intel/vulkan/anv_genX.h @@ -302,6 +302,10 @@ genX(emit_breakpoint)(struct anv_batch *batch, genX(batch_emit_breakpoint)(batch, device, emit_before_draw); } +void +genX(cmd_buffer_begin_companion)(struct anv_cmd_buffer *buffer, + VkCommandBufferLevel level); + struct anv_state genX(cmd_buffer_begin_companion_rcs_syncpoint)(struct anv_cmd_buffer *cmd_buffer); diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 2f54d40cb30..071494a975b 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -2735,6 +2735,45 @@ genX(flush_descriptor_buffers)(struct anv_cmd_buffer *cmd_buffer, cmd_buffer->state.descriptor_buffers.dirty = false; } +void +genX(cmd_buffer_begin_companion)(struct anv_cmd_buffer *cmd_buffer, + VkCommandBufferLevel level) +{ + cmd_buffer->vk.level = level; + cmd_buffer->is_companion_rcs_cmd_buffer = true; + + trace_intel_begin_cmd_buffer(&cmd_buffer->trace); + +#if GFX_VER >= 12 + /* Reenable prefetching at the beginning of secondary command buffers. We + * do this so that the return instruction edition is not prefetched before + * completion. + */ + if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) { + anv_batch_emit(&cmd_buffer->batch, GENX(MI_ARB_CHECK), arb) { + arb.PreParserDisableMask = true; + arb.PreParserDisable = false; + } + } +#endif + + /* A companion command buffer is only used for blorp commands atm, so + * default to the legacy mode. + */ + cmd_buffer->state.current_db_mode = ANV_CMD_DESCRIPTOR_BUFFER_MODE_LEGACY; + genX(cmd_buffer_emit_bt_pool_base_address)(cmd_buffer); + + /* Re-emit the aux table register in every command buffer. This way we're + * ensured that we have the table even if this command buffer doesn't + * initialize any images. + */ + if (cmd_buffer->device->info->has_aux_map) { + anv_add_pending_pipe_bits(cmd_buffer, + ANV_PIPE_AUX_TABLE_INVALIDATE_BIT, + "new cmd buffer with aux-tt"); + } +} + VkResult genX(BeginCommandBuffer)( VkCommandBuffer commandBuffer,