aboutsummaryrefslogtreecommitdiff
path: root/src/layer.cc
diff options
context:
space:
mode:
authorNicolas James <nj3ahxac@gmail.com>2026-02-16 16:06:50 +1100
committerNicolas James <nj3ahxac@gmail.com>2026-02-16 16:06:50 +1100
commitb79dc96e68848a4e313d400691bf047aa29973f6 (patch)
tree9416ccaf805ec453692b169a5a8c1b35d615d046 /src/layer.cc
parente0f7daf292db65d8aa492b6bc29ad245a9f83a2d (diff)
dont oversleep via timeline sempahore waits
Diffstat (limited to 'src/layer.cc')
-rw-r--r--src/layer.cc60
1 files changed, 48 insertions, 12 deletions
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<const char*>{};
- 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<VkCommandBuffer>;
- using tssi_ptr_t = std::unique_ptr<VkTimelineSemaphoreSubmitInfo>;
+ using tssi_t = VkTimelineSemaphoreSubmitInfo;
auto next_submits = std::vector<VkSubmitInfo>{};
auto next_cbs = std::vector<std::unique_ptr<cb_vect>>{};
auto handles = std::vector<std::shared_ptr<TimestampPool::Handle>>{};
+ auto tssis = std::vector<std::unique_ptr<tssi_t>>{};
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>(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<VkSubmitInfo2>{};
auto next_cbs = std::vector<std::unique_ptr<cb_vect_t>>{};
auto handles = std::vector<std::shared_ptr<TimestampPool::Handle>>{};
+ auto next_ssis = std::vector<std::unique_ptr<VkSemaphoreSubmitInfo>>{};
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>(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<milliseconds>(diff);
+ const auto us = duration_cast<microseconds>(diff - ms);
+ const auto ns = duration_cast<nanoseconds>(diff - ms - us);
+ std::cerr << ms << " " << us << " " << ns << "\n";
+ };
- std::this_thread::sleep_until(*sleep_until);
- }
+ queue_context->sleep_in_present();
return VK_SUCCESS;
}