From dae68cf4aa7a9147916ba90509cb8c5ee4225ca9 Mon Sep 17 00:00:00 2001 From: Matt Coster Date: Tue, 16 May 2023 09:29:36 +0100 Subject: [PATCH] pvr: Do not free deferred pvr_transfer_cmd instances Deferred pvr_transfer_cmd instances are allocated from a dyn_array on the owning pvr_cmd_buffer and must not be freed directly. Signed-off-by: Matt Coster Reported-by: James Glanville Reviewed-by: Karmjit Mahil Part-of: --- src/imagination/vulkan/pvr_blit.c | 1 + src/imagination/vulkan/pvr_cmd_buffer.c | 3 ++- src/imagination/vulkan/pvr_private.h | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/imagination/vulkan/pvr_blit.c b/src/imagination/vulkan/pvr_blit.c index 8db27c4ab2d..6d1ba76b85f 100644 --- a/src/imagination/vulkan/pvr_blit.c +++ b/src/imagination/vulkan/pvr_blit.c @@ -1734,6 +1734,7 @@ static VkResult pvr_add_deferred_rta_clear(struct pvr_cmd_buffer *cmd_buffer, *transfer_cmd = (struct pvr_transfer_cmd){ .flags = PVR_TRANSFER_CMD_FLAGS_FILL, .cmd_buffer = cmd_buffer, + .is_deferred_clear = true, }; if (attachment->aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) { diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c b/src/imagination/vulkan/pvr_cmd_buffer.c index f8ea9d70cbf..4801de4fefe 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_cmd_buffer.c @@ -112,7 +112,8 @@ static void pvr_cmd_buffer_free_sub_cmd(struct pvr_cmd_buffer *cmd_buffer, &sub_cmd->transfer.transfer_cmds, link) { list_del(&transfer_cmd->link); - vk_free(&cmd_buffer->vk.pool->alloc, transfer_cmd); + if (!transfer_cmd->is_deferred_clear) + vk_free(&cmd_buffer->vk.pool->alloc, transfer_cmd); } break; diff --git a/src/imagination/vulkan/pvr_private.h b/src/imagination/vulkan/pvr_private.h index dbc0bdd2af5..c6ce81c78e4 100644 --- a/src/imagination/vulkan/pvr_private.h +++ b/src/imagination/vulkan/pvr_private.h @@ -433,6 +433,11 @@ struct pvr_transfer_cmd { * cmd_buffer::bo_list head. */ struct pvr_cmd_buffer *cmd_buffer; + + /* Deferred RTA clears are allocated from pvr_cmd_buffer->deferred_clears and + * cannot be freed directly. + */ + bool is_deferred_clear; }; struct pvr_sub_cmd_gfx {