diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index 2c07ebe4e92..01f0d6e4c4a 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -231,7 +231,14 @@ anv_cmd_buffer_destroy(struct vk_command_buffer *vk_cmd_buffer) struct anv_cmd_buffer *cmd_buffer = container_of(vk_cmd_buffer, struct anv_cmd_buffer, vk); + pthread_mutex_lock(&cmd_buffer->device->mutex); + if (cmd_buffer->companion_rcs_cmd_buffer) { + destroy_cmd_buffer(cmd_buffer->companion_rcs_cmd_buffer); + cmd_buffer->companion_rcs_cmd_buffer = NULL; + } + destroy_cmd_buffer(cmd_buffer); + pthread_mutex_unlock(&cmd_buffer->device->mutex); } static void @@ -286,6 +293,12 @@ anv_cmd_buffer_reset(struct vk_command_buffer *vk_cmd_buffer, struct anv_cmd_buffer *cmd_buffer = container_of(vk_cmd_buffer, struct anv_cmd_buffer, vk); + if (cmd_buffer->companion_rcs_cmd_buffer) { + reset_cmd_buffer(cmd_buffer->companion_rcs_cmd_buffer, flags); + destroy_cmd_buffer(cmd_buffer->companion_rcs_cmd_buffer); + cmd_buffer->companion_rcs_cmd_buffer = NULL; + } + reset_cmd_buffer(cmd_buffer, flags); } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 346ecab0a94..ede24a649c0 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -3517,6 +3517,20 @@ anv_cmd_buffer_is_video_queue(const struct anv_cmd_buffer *cmd_buffer) return (queue_family->queueFlags & VK_QUEUE_VIDEO_DECODE_BIT_KHR) != 0; } +static inline bool +anv_cmd_buffer_is_compute_queue(const struct anv_cmd_buffer *cmd_buffer) +{ + struct anv_queue_family *queue_family = cmd_buffer->queue_family; + return queue_family->engine_class == INTEL_ENGINE_CLASS_COMPUTE; +} + +static inline bool +anv_cmd_buffer_is_blitter_queue(const struct anv_cmd_buffer *cmd_buffer) +{ + struct anv_queue_family *queue_family = cmd_buffer->queue_family; + return queue_family->engine_class == INTEL_ENGINE_CLASS_COPY; +} + VkResult anv_cmd_buffer_init_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer); void anv_cmd_buffer_fini_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer); void anv_cmd_buffer_reset_batch_bo_chain(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 017b36f663f..407b08db714 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -3568,7 +3568,20 @@ genX(EndCommandBuffer)( { ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); - return end_command_buffer(cmd_buffer); + VkResult status = end_command_buffer(cmd_buffer); + if (status != VK_SUCCESS) + return status; + + /* If there is MSAA access over the compute/transfer queue, we can use the + * companion RCS command buffer and end it properly. + */ + if (cmd_buffer->companion_rcs_cmd_buffer) { + assert(anv_cmd_buffer_is_compute_queue(cmd_buffer) || + anv_cmd_buffer_is_blitter_queue(cmd_buffer)); + status = end_command_buffer(cmd_buffer->companion_rcs_cmd_buffer); + } + + return status; } static void