From a5cede6111a1e979dd98dfb7969f714f47942d47 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Fri, 22 May 2020 14:27:38 +0200 Subject: [PATCH] v3dv: fix vkResetCommandPool During a command buffer reset we call cmd_buffer_init(), which will add the command buffer to the pool, so make sure we remove it first and that we use a safe iterator when resetting a pool. Fixes: dEQP-VK.api.command_buffers.pool_reset_reuse Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 17311e329bd..8b93d4f385a 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -253,8 +253,6 @@ cmd_buffer_destroy_private_obj(struct v3dv_cmd_buffer *cmd_buffer, static void cmd_buffer_free_resources(struct v3dv_cmd_buffer *cmd_buffer) { - list_del(&cmd_buffer->pool_link); - list_for_each_entry_safe(struct v3dv_job, job, &cmd_buffer->submit_jobs, list_link) { v3dv_job_destroy(job); @@ -289,6 +287,7 @@ cmd_buffer_free_resources(struct v3dv_cmd_buffer *cmd_buffer) static void cmd_buffer_destroy(struct v3dv_cmd_buffer *cmd_buffer) { + list_del(&cmd_buffer->pool_link); cmd_buffer_free_resources(cmd_buffer); vk_free(&cmd_buffer->pool->alloc, cmd_buffer); } @@ -731,6 +730,11 @@ cmd_buffer_reset(struct v3dv_cmd_buffer *cmd_buffer, struct v3dv_cmd_pool *pool = cmd_buffer->pool; VkCommandBufferLevel level = cmd_buffer->level; + /* cmd_buffer_init below will re-add the command buffer to the pool + * so remove it here so we don't end up adding it again. + */ + list_del(&cmd_buffer->pool_link); + /* FIXME: For now we always free all resources as if * VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT was set. */ @@ -851,8 +855,8 @@ v3dv_ResetCommandPool(VkDevice device, VkCommandBufferResetFlags reset_flags = 0; if (flags & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) reset_flags = VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT; - list_for_each_entry(struct v3dv_cmd_buffer, cmd_buffer, - &pool->cmd_buffers, pool_link) { + list_for_each_entry_safe(struct v3dv_cmd_buffer, cmd_buffer, + &pool->cmd_buffers, pool_link) { cmd_buffer_reset(cmd_buffer, reset_flags); }