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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
This commit is contained in:
Iago Toral Quiroga
2020-05-22 14:27:38 +02:00
committed by Marge Bot
parent 27d360c702
commit a5cede6111
+8 -4
View File
@@ -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);
}