SDEngine
Game Engine
Loading...
Searching...
No Matches
PipelineFactory.hpp
Go to the documentation of this file.
1// TODO(docs): Add file-level Doxygen header
2// - @file PipelineFactory.hpp
3// - @brief Graphics pipeline creation and caching
4// - Integration with ShaderLibrary for hot reload
5#pragma once
6
7#include <string>
8#include <vector>
9
10#include "SD/core/base.hpp"
11#include "ShaderLibrary.hpp"
12
13namespace sd {
14
15// TODO(docs): Document PipelineFactory class
16// - Purpose: Creates and caches Vulkan graphics pipelines
17// - PipelineDesc structure and how to use it
18// - Pipeline layout creation with push constants
19// - Hot reload support (RecreateAllPipelines)
20// - Pipeline cache usage
21// - Example: Creating a basic pipeline
24public:
27 struct Handle {
28 uint32_t index = 0; // Slot index in the factory (0 = null/invalid)
29 uint32_t generation = 0; // Generation counter for the slot
30
31 explicit operator bool() const { return index != 0; }
32 bool operator==(const Handle& other) const {
33 return index == other.index && generation == other.generation;
34 }
35 bool operator!=(const Handle& other) const { return !(*this == other); }
36 };
37
38 static constexpr Handle null_handle{0, 0};
39
42
43 struct PipelineDesc {
44 std::string vert_path, frag_path;
46 u32 subpass = 0;
48
49 ~PipelineDesc() = default;
50 auto operator<=>(const PipelineDesc&) const = default;
51 };
52
55 Handle create_graphics_pipeline(const PipelineDesc& desc, VkPipelineLayout layout);
56
59 VkPipeline get_pipeline(Handle handle) const;
60
62 bool is_valid(Handle handle) const;
63
66 void destroy_pipeline(Handle handle);
67
68 VkPipelineLayout create_push_constant_layout(VkShaderStageFlags stages, u32 size);
69
75 std::vector<std::pair<std::string, std::string>> recreate_all_pipelines();
76
79
80private:
81 VkResult create_pipeline_instance(const PipelineDesc& desc, vk::PipelineLayout layout,
82 vk::UniquePipeline* pipeline);
83
85 vk::UniquePipeline pipeline;
87 vk::PipelineLayout layout;
88 uint32_t generation = 1; // Generation for this slot (starts at 1)
89 bool active = false; // Whether this slot currently holds a pipeline
90 };
91
92 vk::Device m_device;
94 vk::UniquePipelineCache m_pipeline_cache;
95
96 std::vector<PipelineEntry> m_tracked_pipelines;
97 std::vector<uint32_t> m_free_slots; // Indices of inactive slots for reuse
98 std::vector<vk::UniquePipelineLayout> m_created_layouts;
99};
100
101} // namespace sd
Creates and owns graphics pipelines. Handles cleanup on destruction.
Definition PipelineFactory.hpp:23
PipelineFactory & operator=(const PipelineFactory &)=delete
vk::UniquePipelineCache m_pipeline_cache
Definition PipelineFactory.hpp:94
std::vector< uint32_t > m_free_slots
Definition PipelineFactory.hpp:97
std::vector< PipelineEntry > m_tracked_pipelines
Definition PipelineFactory.hpp:96
std::vector< vk::UniquePipelineLayout > m_created_layouts
Definition PipelineFactory.hpp:98
vk::Device m_device
Definition PipelineFactory.hpp:92
PipelineFactory(const PipelineFactory &)=delete
ShaderLibrary & m_shaders
Definition PipelineFactory.hpp:93
Compiles HLSL → SPIR-V and caches VkShaderModules.
Definition ShaderLibrary.hpp:24
Definition Application.hpp:28
Definition PipelineFactory.hpp:27
bool operator!=(const Handle &other) const
Definition PipelineFactory.hpp:35
bool operator==(const Handle &other) const
Definition PipelineFactory.hpp:32
Definition PipelineFactory.hpp:43
auto operator<=>(const PipelineDesc &) const =default
std::string frag_path
Definition PipelineFactory.hpp:44
Definition PipelineFactory.hpp:84
vk::UniquePipeline pipeline
Definition PipelineFactory.hpp:85
PipelineDesc desc
Definition PipelineFactory.hpp:86
vk::PipelineLayout layout
Definition PipelineFactory.hpp:87
std::uint32_t u32
Definition types.hpp:15
constexpr T g_type_max
Definition types.hpp:21