Module: Mesa Branch: main Commit: 40c6e54ce7382007ba3ffa28c9d3d7362799274b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=40c6e54ce7382007ba3ffa28c9d3d7362799274b
Author: Rohan Garg <rohan.g...@intel.com> Date: Tue Dec 12 11:54:28 2023 +0100 anv: rename anv_create_companion_rcs_command_buffer to anv_cmd_buffer_ensure_rcs_companion We can now drop any checks for companion_rcs_cmd_buffer before calling anv_create_companion_rcs_command_buffer. Ensure that anv_cmd_buffer_ensure_rcs_companion callee's have the proper error handling. Signed-off-by: Rohan Garg <rohan.g...@intel.com> Reviewed-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> Reviewed-by: Sagar Ghuge <sagar.gh...@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26648> --- src/intel/vulkan/anv_blorp.c | 27 +++++++++++++++------------ src/intel/vulkan/anv_cmd_buffer.c | 35 ++++++++++++++++++----------------- src/intel/vulkan/anv_private.h | 2 +- src/intel/vulkan/genX_cmd_buffer.c | 11 +++++------ 4 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index f907586522d..24593dba6fc 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -377,21 +377,24 @@ record_main_rcs_cmd_buffer_done(struct anv_cmd_buffer *cmd_buffer) { const struct intel_device_info *info = cmd_buffer->device->info; - if (cmd_buffer->companion_rcs_cmd_buffer == NULL) { - anv_create_companion_rcs_command_buffer(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) { - assert(cmd_buffer->companion_rcs_cmd_buffer != NULL); - anv_add_pending_pipe_bits(cmd_buffer->companion_rcs_cmd_buffer, - ANV_PIPE_AUX_TABLE_INVALIDATE_BIT, - "new cmd buffer with aux-tt"); - } + const VkResult result = anv_cmd_buffer_ensure_rcs_companion(cmd_buffer); + if (result != VK_SUCCESS) { + anv_batch_set_error(&cmd_buffer->batch, result); + return ANV_STATE_NULL; } assert(cmd_buffer->companion_rcs_cmd_buffer != NULL); + + /* 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->companion_rcs_cmd_buffer, + ANV_PIPE_AUX_TABLE_INVALIDATE_BIT, + "new cmd buffer with aux-tt"); + } + return anv_genX(info, cmd_buffer_begin_companion_rcs_syncpoint)(cmd_buffer); } diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index 300de3dc906..0718fa31206 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -85,29 +85,30 @@ anv_cmd_state_reset(struct anv_cmd_buffer *cmd_buffer) } VkResult -anv_create_companion_rcs_command_buffer(struct anv_cmd_buffer *cmd_buffer) +anv_cmd_buffer_ensure_rcs_companion(struct anv_cmd_buffer *cmd_buffer) { + if (cmd_buffer->companion_rcs_cmd_buffer) + return VK_SUCCESS; + VkResult result = VK_SUCCESS; pthread_mutex_lock(&cmd_buffer->device->mutex); - if (cmd_buffer->companion_rcs_cmd_buffer == NULL) { - VK_FROM_HANDLE(vk_command_pool, pool, - cmd_buffer->device->companion_rcs_cmd_pool); - assert(pool != NULL); + VK_FROM_HANDLE(vk_command_pool, pool, + cmd_buffer->device->companion_rcs_cmd_pool); + assert(pool != NULL); - struct vk_command_buffer *tmp_cmd_buffer = NULL; - result = pool->command_buffer_ops->create(pool, &tmp_cmd_buffer); - if (result != VK_SUCCESS) { - pthread_mutex_unlock(&cmd_buffer->device->mutex); - return result; - } + struct vk_command_buffer *tmp_cmd_buffer = NULL; + result = pool->command_buffer_ops->create(pool, &tmp_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; - } - pthread_mutex_unlock(&cmd_buffer->device->mutex); + if (result != VK_SUCCESS) + goto unlock_and_return; + 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; + +unlock_and_return: + pthread_mutex_unlock(&cmd_buffer->device->mutex); return result; } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index a3551b8b191..c75fa733713 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -5334,7 +5334,7 @@ anv_cmd_buffer_fill_area(struct anv_cmd_buffer *cmd_buffer, uint32_t data); VkResult -anv_create_companion_rcs_command_buffer(struct anv_cmd_buffer *cmd_buffer); +anv_cmd_buffer_ensure_rcs_companion(struct anv_cmd_buffer *cmd_buffer); bool anv_can_hiz_clear_ds_view(struct anv_device *device, diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 7154ab68670..2e7b0e5e37a 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -3714,13 +3714,12 @@ genX(CmdExecuteCommands)( * command buffer for execution if secondary RCS is valid. */ if (secondary->companion_rcs_cmd_buffer != NULL) { - if (container->companion_rcs_cmd_buffer == NULL) { - VkResult result = anv_create_companion_rcs_command_buffer(container); - if (result != VK_SUCCESS) { - anv_batch_set_error(&container->batch, result); - return; - } + VkResult result = anv_cmd_buffer_ensure_rcs_companion(container); + if (result != VK_SUCCESS) { + anv_batch_set_error(&container->batch, result); + return; } + anv_cmd_buffer_add_secondary(container->companion_rcs_cmd_buffer, secondary->companion_rcs_cmd_buffer); }