anv: Handle companion RCS in end/destory/reset code path

If we have valid companion RCS command buffer, we should
end/destroy/reset in the same fashion as of main command buffer.

v2:
- Add lock around anv_cmd_buffer_destroy (Sagar)

Signed-off-by: Sagar Ghuge <sagar.ghuge@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23661>
This commit is contained in:
Sagar Ghuge
2023-07-14 12:10:40 -07:00
committed by Marge Bot
parent 801523f03d
commit 13b3d7f741
3 changed files with 41 additions and 1 deletions

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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