Module: Mesa Branch: main Commit: dae68cf4aa7a9147916ba90509cb8c5ee4225ca9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dae68cf4aa7a9147916ba90509cb8c5ee4225ca9
Author: Matt Coster <[email protected]> Date: Tue May 16 09:29:36 2023 +0100 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 <[email protected]> Reported-by: James Glanville <[email protected]> Reviewed-by: Karmjit Mahil <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23125> --- 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 {
