From eb9719cc8b9a308654ccd2c3bce8a7047b6e2a1a Mon Sep 17 00:00:00 2001 From: Nicolas James Date: Wed, 8 Apr 2026 00:56:40 +1000 Subject: Refactor storing submissions into FrameSpan class, reduce AntiLag thread contention --- src/layer.cc | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) (limited to 'src/layer.cc') diff --git a/src/layer.cc b/src/layer.cc index 6c275ba..5df896a 100644 --- a/src/layer.cc +++ b/src/layer.cc @@ -394,19 +394,14 @@ vkQueueSubmit(VkQueue queue, std::uint32_t submit_count, // pointers to our command buffer arrays - of which the position in memory // of can change on vector reallocation. So we use unique_ptrs here. auto next_cbs = std::vector>{}; - auto submissions = std::vector>{}; + auto handles = std::vector>{}; - const auto now = DeviceClock::now(); const auto submit_span = std::span{submit_infos, submit_count}; std::ranges::transform( submit_span, std::back_inserter(next_submits), [&](const auto& submit) { const auto handle = context->timestamp_pool->acquire(); - - submissions.push_back(std::make_unique(Submission{ - .handle = handle, - .time = now, - })); + handles.push_back(handle); next_cbs.emplace_back([&]() -> auto { auto cbs = std::make_unique(); @@ -431,10 +426,8 @@ vkQueueSubmit(VkQueue queue, std::uint32_t submit_count, // We have to notify after we submit - otherwise we have a race where we // wait for work that wasn't submitted. - for (auto&& [submit, submission] : - std::views::zip(submit_span, submissions)) { - - context->strategy->notify_submit(submit, std::move(submission)); + for (auto&& [submit, handle] : std::views::zip(submit_span, handles)) { + context->strategy->notify_submit(submit, std::move(handle)); } return result; @@ -455,19 +448,14 @@ vkQueueSubmit2(VkQueue queue, std::uint32_t submit_count, using cbs_t = std::vector; auto next_submits = std::vector{}; auto next_cbs = std::vector>{}; - auto submissions = std::vector>{}; + auto handles = std::vector>{}; - const auto now = DeviceClock::now(); const auto submit_span = std::span{submit_infos, submit_count}; std::ranges::transform( submit_span, std::back_inserter(next_submits), [&](const auto& submit) { const auto handle = context->timestamp_pool->acquire(); - - submissions.push_back(std::make_unique(Submission{ - .handle = handle, - .time = now, - })); + handles.push_back(handle); next_cbs.emplace_back([&]() -> auto { auto cbs = std::make_unique(); @@ -496,10 +484,8 @@ vkQueueSubmit2(VkQueue queue, std::uint32_t submit_count, queue, static_cast(std::size(next_submits)), std::data(next_submits), fence); - for (auto&& [submit, submission] : - std::views::zip(submit_span, submissions)) { - - context->strategy->notify_submit(submit, std::move(submission)); + for (auto&& [submit, handle] : std::views::zip(submit_span, handles)) { + context->strategy->notify_submit(submit, std::move(handle)); } return result; -- cgit v1.2.3