From c29db0965cdeb366a744887b08164f6bcc35c968 Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Thu, 24 Jul 2025 16:06:19 +0200 Subject: [PATCH] vulkan/cmd_queue: Do not free if driver_free_cb is provided Avoids crashes when the custom implementation allocates differently. Acked-by: Mike Blumenkrantz Part-of: --- src/vulkan/runtime/vk_cmd_enqueue.c | 6 ++++++ src/vulkan/util/vk_cmd_queue_gen.py | 8 +++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/vulkan/runtime/vk_cmd_enqueue.c b/src/vulkan/runtime/vk_cmd_enqueue.c index f2ccab68844..b5b179f0a59 100644 --- a/src/vulkan/runtime/vk_cmd_enqueue.c +++ b/src/vulkan/runtime/vk_cmd_enqueue.c @@ -88,6 +88,9 @@ vk_cmd_push_descriptor_set_with_template2_free( vk_free(queue->alloc, (void *)pnext->pPushConstantRanges); vk_free(queue->alloc, pnext); } + + vk_free(queue->alloc, (void *)info->pData); + vk_free(queue->alloc, info); } VKAPI_ATTR void VKAPI_CALL @@ -756,6 +759,9 @@ vk_free_cmd_push_descriptor_set2(struct vk_cmd_queue *queue, struct vk_cmd_queue_entry *cmd) { ralloc_free(cmd->driver_data); + + vk_free(queue->alloc, (void *)cmd->u.push_descriptor_set2.push_descriptor_set_info->pDescriptorWrites); + vk_free(queue->alloc, cmd->u.push_descriptor_set2.push_descriptor_set_info); } VKAPI_ATTR void VKAPI_CALL vk_cmd_enqueue_CmdPushDescriptorSet2( diff --git a/src/vulkan/util/vk_cmd_queue_gen.py b/src/vulkan/util/vk_cmd_queue_gen.py index e80790b669b..d05663b26d7 100644 --- a/src/vulkan/util/vk_cmd_queue_gen.py +++ b/src/vulkan/util/vk_cmd_queue_gen.py @@ -329,10 +329,11 @@ vk_free_queue(struct vk_cmd_queue *queue) { struct vk_cmd_queue_entry *tmp, *cmd; LIST_FOR_EACH_ENTRY_SAFE(cmd, tmp, &queue->cmds, cmd_link) { - if (cmd->driver_free_cb) + if (cmd->driver_free_cb) { cmd->driver_free_cb(queue, cmd); - else - vk_free(queue->alloc, cmd->driver_data); + vk_free(queue->alloc, cmd); + continue; + } switch(cmd->type) { % for c in commands: % if c.guard is not None: @@ -348,6 +349,7 @@ vk_free_queue(struct vk_cmd_queue *queue) case VK_CMD_TYPE_COUNT: break; } + vk_free(queue->alloc, cmd->driver_data); vk_free(queue->alloc, cmd); } }