From b79dc96e68848a4e313d400691bf047aa29973f6 Mon Sep 17 00:00:00 2001 From: Nicolas James Date: Mon, 16 Feb 2026 16:06:50 +1100 Subject: dont oversleep via timeline sempahore waits --- src/layer.cc | 60 ++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 12 deletions(-) (limited to 'src/layer.cc') diff --git a/src/layer.cc b/src/layer.cc index f9917f6..98b5240 100644 --- a/src/layer.cc +++ b/src/layer.cc @@ -217,8 +217,7 @@ static VKAPI_ATTR VkResult VKAPI_CALL CreateDevice( } auto next_extensions = std::vector{}; - if (pCreateInfo->enabledExtensionCount && - pCreateInfo->ppEnabledExtensionNames) { + if (pCreateInfo->ppEnabledExtensionNames) { std::ranges::copy_n(pCreateInfo->ppEnabledExtensionNames, pCreateInfo->enabledExtensionCount, @@ -308,6 +307,7 @@ static VKAPI_ATTR VkResult VKAPI_CALL CreateDevice( DEVICE_VTABLE_LOAD(QueuePresentKHR), DEVICE_VTABLE_LOAD(AcquireNextImage2KHR), DEVICE_VTABLE_LOAD(GetSemaphoreCounterValueKHR), + DEVICE_VTABLE_LOAD(WaitSemaphoresKHR), DEVICE_VTABLE_LOAD(CmdWriteTimestamp2KHR), DEVICE_VTABLE_LOAD(QueueSubmit2KHR), DEVICE_VTABLE_LOAD(GetCalibratedTimestampsKHR), @@ -462,10 +462,11 @@ vkQueueSubmit(VkQueue queue, std::uint32_t submit_count, // so their position in memory is stable. using cb_vect = std::vector; - using tssi_ptr_t = std::unique_ptr; + using tssi_t = VkTimelineSemaphoreSubmitInfo; auto next_submits = std::vector{}; auto next_cbs = std::vector>{}; auto handles = std::vector>{}; + auto tssis = std::vector>{}; for (const auto& submit_info : std::span{submit_infos, submit_count}) { const auto head_handle = queue_context->timestamp_pool->acquire(); @@ -484,10 +485,26 @@ vkQueueSubmit(VkQueue queue, std::uint32_t submit_count, next_submits.push_back(submit_info); next_submits.back().pCommandBuffers = std::data(*next_cbs.back()); next_submits.back().commandBufferCount = std::size(*next_cbs.back()); - - queue_context->notify_submit(submit_info, head_handle, tail_handle); handles.push_back(head_handle); handles.push_back(tail_handle); + + // We submit an extra command which signals a timeline semaphore which + // signals that this command has completed. + const auto sequence = 1 + queue_context->semaphore_sequence++; + queue_context->notify_submit(submit_info, sequence, head_handle, + tail_handle); + + tssis.push_back(std::make_unique(tssi_t{ + .sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR, + .signalSemaphoreValueCount = 1, + .pSignalSemaphoreValues = &sequence, + })); + next_submits.push_back(VkSubmitInfo{ + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .pNext = tssis.back().get(), + .signalSemaphoreCount = 1, + .pSignalSemaphores = &queue_context->semaphore, + }); } return vtable.QueueSubmit(queue, std::size(next_submits), @@ -510,6 +527,7 @@ vkQueueSubmit2(VkQueue queue, std::uint32_t submit_count, auto next_submits = std::vector{}; auto next_cbs = std::vector>{}; auto handles = std::vector>{}; + auto next_ssis = std::vector>{}; for (const auto& submit_info : std::span{submit_infos, submit_count}) { const auto head_handle = queue_context->timestamp_pool->acquire(); @@ -536,11 +554,25 @@ vkQueueSubmit2(VkQueue queue, std::uint32_t submit_count, next_submits.back().pCommandBufferInfos = std::data(*next_cbs.back()); next_submits.back().commandBufferInfoCount = std::size(*next_cbs.back()); - - queue_context->notify_submit(submit_info, head_handle, tail_handle); - handles.push_back(head_handle); handles.push_back(tail_handle); + + const auto sequence = 1 + queue_context->semaphore_sequence++; + queue_context->notify_submit(submit_info, sequence, head_handle, + tail_handle); + + next_ssis.push_back( + std::make_unique(VkSemaphoreSubmitInfo{ + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, + .semaphore = queue_context->semaphore, + .value = sequence, + .stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, + })); + next_submits.push_back(VkSubmitInfo2{ + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2, + .signalSemaphoreInfoCount = 1, + .pSignalSemaphoreInfos = next_ssis.back().get(), + }); } return vtable.QueueSubmit2(queue, std::size(next_submits), @@ -570,11 +602,15 @@ vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* present_info) { queue_context->notify_present(*present_info); } - if (const auto sleep_until = queue_context->get_sleep_until(); - sleep_until.has_value()) { + const auto debug_log_time = [](const auto& diff) { + using namespace std::chrono; + const auto ms = duration_cast(diff); + const auto us = duration_cast(diff - ms); + const auto ns = duration_cast(diff - ms - us); + std::cerr << ms << " " << us << " " << ns << "\n"; + }; - std::this_thread::sleep_until(*sleep_until); - } + queue_context->sleep_in_present(); return VK_SUCCESS; } -- cgit v1.2.3