v3dv: free noop job if needed when finishing the queue

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c
index 5a3f305..7b8bd7a 100644
--- a/src/broadcom/vulkan/v3dv_device.c
+++ b/src/broadcom/vulkan/v3dv_device.c
@@ -1174,6 +1174,7 @@
    queue->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
    queue->device = device;
    queue->flags = 0;
+   queue->noop_job = NULL;
    list_inithead(&queue->submit_wait_list);
    pthread_mutex_init(&queue->mutex, NULL);
    return VK_SUCCESS;
@@ -1183,6 +1184,8 @@
 queue_finish(struct v3dv_queue *queue)
 {
    assert(list_is_empty(&queue->submit_wait_list));
+   if (queue->noop_job)
+      v3dv_job_destroy(queue->noop_job);
    pthread_mutex_destroy(&queue->mutex);
 }
 
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index 6ba94fc..e2eb7b2 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -232,6 +232,8 @@
 
    /* A mutex to prevent concurrent access to the list of wait threads */
    mtx_t mutex;
+
+   struct v3dv_job *noop_job;
 };
 
 #define V3DV_META_BLIT_CACHE_KEY_SIZE (4 * sizeof(uint32_t))
diff --git a/src/broadcom/vulkan/v3dv_queue.c b/src/broadcom/vulkan/v3dv_queue.c
index 895493f..14ae129 100644
--- a/src/broadcom/vulkan/v3dv_queue.c
+++ b/src/broadcom/vulkan/v3dv_queue.c
@@ -796,17 +796,17 @@
 }
 
 static VkResult
-queue_create_noop_job(struct v3dv_queue *queue, struct v3dv_job **job)
+queue_create_noop_job(struct v3dv_queue *queue)
 {
    struct v3dv_device *device = queue->device;
-   *job = vk_zalloc(&device->alloc, sizeof(struct v3dv_job), 8,
-                     VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
-   if (!*job)
+   queue->noop_job = vk_zalloc(&device->alloc, sizeof(struct v3dv_job), 8,
+                               VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+   if (!queue->noop_job)
       return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
-   v3dv_job_init(*job, V3DV_JOB_TYPE_GPU_CL, device, NULL, -1);
+   v3dv_job_init(queue->noop_job, V3DV_JOB_TYPE_GPU_CL, device, NULL, -1);
 
-   emit_noop_bin(*job);
-   emit_noop_render(*job);
+   emit_noop_bin(queue->noop_job);
+   emit_noop_render(queue->noop_job);
 
    return VK_SUCCESS;
 }
@@ -817,16 +817,14 @@
    /* VkQueue host access is externally synchronized so we don't need to lock
     * here for the static variable.
     */
-   static struct v3dv_job *noop_job = NULL;
-
-   if (!noop_job) {
-      VkResult result = queue_create_noop_job(queue, &noop_job);
+   if (!queue->noop_job) {
+      VkResult result = queue_create_noop_job(queue);
       if (result != VK_SUCCESS)
          return result;
    }
 
-   return queue_submit_job(queue, noop_job, pSubmit->waitSemaphoreCount > 0,
-                           NULL);
+   return queue_submit_job(queue, queue->noop_job,
+                           pSubmit->waitSemaphoreCount > 0, NULL);
 }
 
 static VkResult