vulkan: add support for VK_KHR_internally_synchronized_queues

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39489>
This commit is contained in:
Samuel Pitoiset 2026-01-27 14:48:26 +01:00 committed by Marge Bot
parent 8a4a369795
commit d8ef386f98
4 changed files with 70 additions and 10 deletions

View file

@ -433,13 +433,10 @@ vk_common_CmdInsertDebugUtilsLabelEXT(
command_buffer->region_begin = false; command_buffer->region_begin = false;
} }
VKAPI_ATTR void VKAPI_CALL void
vk_common_QueueBeginDebugUtilsLabelEXT( vk_queue_begin_debug_utils_label(struct vk_queue *queue,
VkQueue _queue, const VkDebugUtilsLabelEXT *pLabelInfo)
const VkDebugUtilsLabelEXT *pLabelInfo)
{ {
VK_FROM_HANDLE(vk_queue, queue, _queue);
/* If the latest label was submitted by QueueInsertDebugUtilsLabelEXT, we /* If the latest label was submitted by QueueInsertDebugUtilsLabelEXT, we
* should remove it first. * should remove it first.
*/ */
@ -453,10 +450,20 @@ vk_common_QueueBeginDebugUtilsLabelEXT(
} }
VKAPI_ATTR void VKAPI_CALL VKAPI_ATTR void VKAPI_CALL
vk_common_QueueEndDebugUtilsLabelEXT(VkQueue _queue) vk_common_QueueBeginDebugUtilsLabelEXT(
VkQueue _queue,
const VkDebugUtilsLabelEXT *pLabelInfo)
{ {
VK_FROM_HANDLE(vk_queue, queue, _queue); VK_FROM_HANDLE(vk_queue, queue, _queue);
vk_queue_lock(queue);
vk_queue_begin_debug_utils_label(queue, pLabelInfo);
vk_queue_unlock(queue);
}
void
vk_queue_end_debug_utils_label(struct vk_queue *queue)
{
/* If the latest label was submitted by QueueInsertDebugUtilsLabelEXT, we /* If the latest label was submitted by QueueInsertDebugUtilsLabelEXT, we
* should remove it first. * should remove it first.
*/ */
@ -468,12 +475,19 @@ vk_common_QueueEndDebugUtilsLabelEXT(VkQueue _queue)
} }
VKAPI_ATTR void VKAPI_CALL VKAPI_ATTR void VKAPI_CALL
vk_common_QueueInsertDebugUtilsLabelEXT( vk_common_QueueEndDebugUtilsLabelEXT(VkQueue _queue)
VkQueue _queue,
const VkDebugUtilsLabelEXT *pLabelInfo)
{ {
VK_FROM_HANDLE(vk_queue, queue, _queue); VK_FROM_HANDLE(vk_queue, queue, _queue);
vk_queue_lock(queue);
vk_queue_end_debug_utils_label(queue);
vk_queue_unlock(queue);
}
static void
vk_queue_insert_debug_utils_label(struct vk_queue *queue,
const VkDebugUtilsLabelEXT *pLabelInfo)
{
/* If the latest label was submitted by QueueInsertDebugUtilsLabelEXT, we /* If the latest label was submitted by QueueInsertDebugUtilsLabelEXT, we
* should remove it first. * should remove it first.
*/ */
@ -486,6 +500,18 @@ vk_common_QueueInsertDebugUtilsLabelEXT(
queue->region_begin = false; queue->region_begin = false;
} }
VKAPI_ATTR void VKAPI_CALL
vk_common_QueueInsertDebugUtilsLabelEXT(
VkQueue _queue,
const VkDebugUtilsLabelEXT *pLabelInfo)
{
VK_FROM_HANDLE(vk_queue, queue, _queue);
vk_queue_lock(queue);
vk_queue_insert_debug_utils_label(queue, pLabelInfo);
vk_queue_unlock(queue);
}
VkResult VkResult
vk_check_printf_status(struct vk_device *dev, struct u_printf_ctx *ctx) vk_check_printf_status(struct vk_device *dev, struct u_printf_ctx *ctx)
{ {

View file

@ -31,6 +31,8 @@
extern "C" { extern "C" {
#endif #endif
struct vk_queue;
struct vk_debug_utils_messenger { struct vk_debug_utils_messenger {
struct vk_object_base base; struct vk_object_base base;
VkAllocationCallbacks alloc; VkAllocationCallbacks alloc;
@ -77,6 +79,14 @@ vk_emit_device_memory_report(struct vk_device* device,
uint64_t obj_handle, uint64_t obj_handle,
uint32_t heap_index); uint32_t heap_index);
void
vk_queue_begin_debug_utils_label(struct vk_queue *queue,
const VkDebugUtilsLabelEXT *pLabelInfo);
void
vk_queue_end_debug_utils_label(struct vk_queue *queue);
struct u_printf_ctx; struct u_printf_ctx;
VkResult VkResult

View file

@ -56,6 +56,8 @@ vk_queue_init(struct vk_queue *queue, struct vk_device *device,
memset(queue, 0, sizeof(*queue)); memset(queue, 0, sizeof(*queue));
vk_object_base_init(device, &queue->base, VK_OBJECT_TYPE_QUEUE); vk_object_base_init(device, &queue->base, VK_OBJECT_TYPE_QUEUE);
simple_mtx_init(&queue->lock, mtx_plain);
list_addtail(&queue->link, &device->queues); list_addtail(&queue->link, &device->queues);
queue->flags = pCreateInfo->flags; queue->flags = pCreateInfo->flags;
@ -624,7 +626,10 @@ vk_queue_submit_final(struct vk_queue *queue,
result = vk_queue_set_lost(queue, "Failed to unwrap sync signal"); result = vk_queue_set_lost(queue, "Failed to unwrap sync signal");
} }
vk_queue_lock(queue);
result = queue->driver_submit(queue, submit); result = queue->driver_submit(queue, submit);
vk_queue_unlock(queue);
if (unlikely(result != VK_SUCCESS)) if (unlikely(result != VK_SUCCESS))
return result; return result;
@ -1224,6 +1229,8 @@ vk_queue_finish(struct vk_queue *queue)
vk_free(&queue->base.device->alloc, (void *)label->pLabelName); vk_free(&queue->base.device->alloc, (void *)label->pLabelName);
util_dynarray_fini(&queue->labels); util_dynarray_fini(&queue->labels);
list_del(&queue->link); list_del(&queue->link);
simple_mtx_destroy(&queue->lock);
vk_object_base_finish(&queue->base); vk_object_base_finish(&queue->base);
} }

View file

@ -163,6 +163,9 @@ struct vk_queue {
*/ */
VkSemaphore anb_semaphore; VkSemaphore anb_semaphore;
#endif #endif
/* VK_KHR_internally_synchronized_queues */
simple_mtx_t lock;
}; };
VK_DEFINE_HANDLE_CASTS(vk_queue, base, VkQueue, VK_OBJECT_TYPE_QUEUE) VK_DEFINE_HANDLE_CASTS(vk_queue, base, VkQueue, VK_OBJECT_TYPE_QUEUE)
@ -181,6 +184,20 @@ vk_queue_is_empty(struct vk_queue *queue)
return list_is_empty(&queue->submit.submits); return list_is_empty(&queue->submit.submits);
} }
static inline void
vk_queue_lock(struct vk_queue *queue)
{
if (queue->flags & VK_DEVICE_QUEUE_CREATE_INTERNALLY_SYNCHRONIZED_BIT_KHR)
simple_mtx_lock(&queue->lock);
}
static inline void
vk_queue_unlock(struct vk_queue *queue)
{
if (queue->flags & VK_DEVICE_QUEUE_CREATE_INTERNALLY_SYNCHRONIZED_BIT_KHR)
simple_mtx_unlock(&queue->lock);
}
/** Enables threaded submit on this queue /** Enables threaded submit on this queue
* *
* This should be called by the driver if it wants to be able to block inside * This should be called by the driver if it wants to be able to block inside