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 {

Reply via email to