From 5c32cb217395c01dae81014c877b02f8184a9dee Mon Sep 17 00:00:00 2001 From: PancakeTAS Date: Sat, 25 Apr 2026 20:17:34 +0200 Subject: [PATCH] feat(bindless): Build stages for pipelines --- lsfg-vk-backend/src/modules/pipeline.cpp | 39 ++++++++++++++++++++++++ lsfg-vk-backend/src/modules/pipeline.hpp | 21 +++++++++++++ 2 files changed, 60 insertions(+) diff --git a/lsfg-vk-backend/src/modules/pipeline.cpp b/lsfg-vk-backend/src/modules/pipeline.cpp index af738b1..2ce0aaf 100644 --- a/lsfg-vk-backend/src/modules/pipeline.cpp +++ b/lsfg-vk-backend/src/modules/pipeline.cpp @@ -5,6 +5,7 @@ #include "modules/pipeline/signature.hpp" #include "modules/pipeline/signature/helpers.hpp" #include "modules/pipeline/signature/image.hpp" +#include "modules/pipeline/signature/pass.hpp" #include "utility/logger.hpp" #include "utility/vkhelper.hpp" @@ -17,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -532,5 +534,42 @@ Pipeline::Pipeline( LOG_DEBUG(" Created " << this->m_pipelines.size() << " pipelines") + // Build pipeline stages + std::unordered_map indices; + for (const auto& stageSignature : signature.stages) { + auto& stage{this->m_stages.emplace_back()}; + stage.substages.emplace_back(); + + for (const auto& passIdx : stageSignature.passes) { // (Sorted by shader) + const auto& pass{signature.passes.at(passIdx)}; + + for (const auto& resource : pass.inputs) { + if (!resource.idx()) + continue; + stage.sampledImages.push_back(*resource.idx()); + } + for (const auto& resource : pass.outputs) { + if (!resource.idx()) + continue; + stage.storageImages.push_back(*resource.idx()); + } + + auto& lastPipeline{stage.substages.back().pipeline}; + if (!lastPipeline.empty() && lastPipeline != pass.shader) { + stage.substages.emplace_back(); + } + + auto& substage{stage.substages.back()}; + substage.pipeline = pass.shader; + substage.subiterations.push_back({ + .iterationIndex = indices[substage.pipeline]++, + .dispatch = apply(extent, flowExtent, pass.dispatchOp), + .isSpecial = pass.flags & PassFlag::Special + }); + } + } + + LOG_DEBUG(" Built " << this->m_stages.size() << " pipeline stages") + LOG_DEBUG("Finished building pipeline") } diff --git a/lsfg-vk-backend/src/modules/pipeline.hpp b/lsfg-vk-backend/src/modules/pipeline.hpp index 1df221e..1884407 100644 --- a/lsfg-vk-backend/src/modules/pipeline.hpp +++ b/lsfg-vk-backend/src/modules/pipeline.hpp @@ -170,6 +170,27 @@ namespace lsfgvk::pipeline { vk::UniquePipelineCache m_cache; std::unordered_map m_pipelines; + + /// Single iteration of a sub-stage + struct SubIteration { + uint32_t iterationIndex{}; + vk::Extent2D dispatch; + bool isSpecial{}; + }; + + /// Sub-stage of an execution stage + struct SubStage { + std::string_view pipeline; + std::vector subiterations; + }; + + /// Execution stage + struct Stage { + std::vector substages; + std::vector sampledImages; + std::vector storageImages; + }; + std::vector m_stages; }; }