From 4a99ef5723e8903c7cbab5000b1842258a8bdc68 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Tue, 16 Jan 2024 13:47:31 +0900 Subject: [PATCH] [vulkan] Add a function to explicitly wait on a packet It's not currently used, but it was very handy for finding where the cause of the 5s hang was ***not***. --- include/QF/Vulkan/staging.h | 1 + libs/video/renderer/vulkan/staging.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/include/QF/Vulkan/staging.h b/include/QF/Vulkan/staging.h index 819fcd59e..72f6a2be9 100644 --- a/include/QF/Vulkan/staging.h +++ b/include/QF/Vulkan/staging.h @@ -40,6 +40,7 @@ void QFV_FlushStagingBuffer (qfv_stagebuf_t *stage, size_t offset, size_t size); qfv_packet_t *QFV_PacketAcquire (qfv_stagebuf_t *stage); void *QFV_PacketExtend (qfv_packet_t *packet, size_t size); void QFV_PacketSubmit (qfv_packet_t *packet); +VkResult QFV_PacketWait (qfv_packet_t *packet); struct qfv_bufferbarrier_s; void QFV_PacketCopyBuffer (qfv_packet_t *packet, VkBuffer dstBuffer, VkDeviceSize offset, diff --git a/libs/video/renderer/vulkan/staging.c b/libs/video/renderer/vulkan/staging.c index 265915508..b9a432428 100644 --- a/libs/video/renderer/vulkan/staging.c +++ b/libs/video/renderer/vulkan/staging.c @@ -105,6 +105,17 @@ QFV_DestroyStagingBuffer (qfv_stagebuf_t *stage) for (int i = 0; i < count; i++) { fences->a[i] = stage->packets.buffer[i].fence; cmdBuf->a[i] = stage->packets.buffer[i].cmd; +#if 0 + auto stat = dfunc->vkGetFenceStatus (device->dev, fences->a[i]); + if (stat != VK_SUCCESS) { + dstring_t *str = dstring_newstr (); + auto packet = &stage->packets.buffer[i]; + BT_pcInfo (str, (intptr_t) packet->owner); + Sys_Printf ("QFV_DestroyStagingBuffer: %d live packet in %p:%s\n", + stat, stage, str->str); + dstring_delete (str); + } +#endif } dfunc->vkWaitForFences (device->dev, fences->size, fences->a, VK_TRUE, 5000000000ull); @@ -306,6 +317,20 @@ QFV_PacketSubmit (qfv_packet_t *packet) dfunc->vkQueueSubmit (device->queue.queue, 1, &submitInfo, packet->fence); } +VkResult +QFV_PacketWait (qfv_packet_t *packet) +{ + auto stage = packet->stage; + auto device = stage->device; + auto dfunc = device->funcs; + VkResult res = dfunc->vkWaitForFences (device->dev, 1, &packet->fence, + VK_TRUE, ~0ull); + if (res != VK_SUCCESS) { + printf ("QFV_PacketWait: %d\n", res); + } + return res; +} + void QFV_PacketCopyBuffer (qfv_packet_t *packet, VkBuffer dstBuffer, VkDeviceSize offset,