From 17dfbb6ce782bf9cc110d6e7de7fa1d096ae4639 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 21 Sep 2023 13:50:10 -0400 Subject: [PATCH] zink: fix semaphore signal ordering the timeline semaphore must always be on the last submit in order to mimic fence behavior Part-of: --- src/gallium/drivers/zink/zink_batch.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 7d528d60cf6..af087fb8e5a 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -613,27 +613,28 @@ submit_queue(void *data, void *gdata, int thread_index) bs->cmdbuf, }; si[ZINK_SUBMIT_CMDBUF].pCommandBuffers = bs->has_barriers ? cmdbufs : &cmdbufs[1]; + /* assorted signal submit from wsi/externals */ + si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount = util_dynarray_num_elements(&bs->signal_semaphores, VkSemaphore); + si[ZINK_SUBMIT_CMDBUF].pSignalSemaphores = bs->signal_semaphores.data; + /* then the signal submit with the timeline (fence) semaphore */ VkSemaphore signals[3]; - si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount = !!bs->signal_semaphore; + si[ZINK_SUBMIT_SIGNAL].signalSemaphoreCount = !!bs->signal_semaphore; signals[0] = bs->signal_semaphore; - si[ZINK_SUBMIT_CMDBUF].pSignalSemaphores = signals; + si[ZINK_SUBMIT_SIGNAL].pSignalSemaphores = signals; VkTimelineSemaphoreSubmitInfo tsi = {0}; uint64_t signal_values[2] = {0}; tsi.sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO; - si[ZINK_SUBMIT_CMDBUF].pNext = &tsi; + si[ZINK_SUBMIT_SIGNAL].pNext = &tsi; tsi.pSignalSemaphoreValues = signal_values; - signal_values[si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount] = batch_id; - signals[si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount++] = screen->sem; - tsi.signalSemaphoreValueCount = si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount; + signal_values[si[ZINK_SUBMIT_SIGNAL].signalSemaphoreCount] = batch_id; + signals[si[ZINK_SUBMIT_SIGNAL].signalSemaphoreCount++] = screen->sem; + tsi.signalSemaphoreValueCount = si[ZINK_SUBMIT_SIGNAL].signalSemaphoreCount; if (bs->present) - signals[si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount++] = bs->present; - tsi.signalSemaphoreValueCount = si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount; + signals[si[ZINK_SUBMIT_SIGNAL].signalSemaphoreCount++] = bs->present; + tsi.signalSemaphoreValueCount = si[ZINK_SUBMIT_SIGNAL].signalSemaphoreCount; - /* then the optional signal submit */ - si[ZINK_SUBMIT_SIGNAL].signalSemaphoreCount = util_dynarray_num_elements(&bs->signal_semaphores, VkSemaphore); - si[ZINK_SUBMIT_SIGNAL].pSignalSemaphores = bs->signal_semaphores.data; VkResult result = VKSCR(EndCommandBuffer)(bs->cmdbuf); if (result != VK_SUCCESS) {