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