MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
ComputePress.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "ShaderFoundry.hpp"
4
6
7using ComputePipelineID = uint64_t;
8
10
11/**
12 * @class ComputePress
13 * @brief Compute-specific pipeline and dispatch orchestration
14 *
15 * Responsibilities:
16 * - Create compute pipelines
17 * - Bind compute pipelines
18 * - Dispatch compute workgroups (direct + indirect)
19 * - Compute-specific optimizations
20 *
21 * Uses ShaderFoundry for:
22 * - Shaders, descriptors, commands, sync, barriers
23 */
24class MAYAFLUX_API ComputePress {
25public:
27 {
28 static ComputePress press;
29 return press;
30 }
31
32 ComputePress(const ComputePress&) = delete;
34 ComputePress(ComputePress&&) noexcept = delete;
35 ComputePress& operator=(ComputePress&&) noexcept = delete;
36
37 bool initialize();
38 void stop();
39 void shutdown();
40
41 //==========================================================================
42 // Pipeline Creation (COMPUTE-SPECIFIC)
43 //==========================================================================
44
45 /**
46 * @brief Create compute pipeline
47 */
48 ComputePipelineID create_pipeline(
49 ShaderID shader_id,
50 const std::vector<std::vector<DescriptorBindingInfo>>& descriptor_sets = {},
51 size_t push_constant_size = 0);
52
53 /**
54 * @brief Create pipeline with auto-reflection
55 */
56 ComputePipelineID create_pipeline_auto(
57 ShaderID shader_id,
58 size_t push_constant_size = 0);
59
60 void destroy_pipeline(ComputePipelineID pipeline_id);
61
62 //==========================================================================
63 // Pipeline Binding (COMPUTE-SPECIFIC)
64 //==========================================================================
65
66 /**
67 * @brief Bind pipeline to active command buffer
68 */
69 void bind_pipeline(CommandBufferID cmd_id, ComputePipelineID pipeline_id);
70
71 /**
72 * @brief Bind descriptor sets to active command buffer
73 */
74 void bind_descriptor_sets(
75 CommandBufferID cmd_id,
76 ComputePipelineID pipeline_id,
77 const std::vector<DescriptorSetID>& descriptor_set_ids);
78
79 /**
80 * @brief Push constants to active command buffer
81 */
82 void push_constants(
83 CommandBufferID cmd_id,
84 ComputePipelineID pipeline_id,
85 const void* data,
86 size_t size);
87
88 //==========================================================================
89 // Dispatch (COMPUTE-SPECIFIC)
90 //==========================================================================
91
92 /**
93 * @brief Dispatch compute workgroups
94 */
95 void dispatch(CommandBufferID cmd_id, uint32_t x, uint32_t y, uint32_t z);
96
97 /**
98 * @brief Dispatch compute workgroups indirectly
99 */
100 void dispatch_indirect(
101 CommandBufferID cmd_id,
102 vk::Buffer indirect_buffer,
103 vk::DeviceSize offset = 0);
104
105 //==========================================================================
106 // Convenience Wrappers
107 //==========================================================================
108
109 /**
110 * @brief All-in-one: allocate descriptors for pipeline
111 */
112 std::vector<DescriptorSetID> allocate_pipeline_descriptors(ComputePipelineID pipeline_id);
113
114 /**
115 * @brief All-in-one: bind pipeline + descriptors + push constants
116 */
117 void bind_all(
118 CommandBufferID cmd_id,
119 ComputePipelineID pipeline_id,
120 const std::vector<DescriptorSetID>& descriptor_set_ids,
121 const void* push_constants_data = nullptr,
122 size_t push_constant_size = 0);
123
124private:
125 ComputePress() = default;
127 void cleanup_pipelines();
128
131 std::shared_ptr<Core::VKComputePipeline> pipeline;
132 std::vector<vk::DescriptorSetLayout> layouts;
133 vk::PipelineLayout layout;
134 };
135
136 std::shared_ptr<Core::VKDescriptorManager> m_descriptor_manager;
137 std::unordered_map<ComputePipelineID, PipelineState> m_pipelines;
138 std::atomic<uint64_t> m_next_pipeline_id { 1 };
139 ShaderFoundry* m_shader_foundry = nullptr;
140
141 static bool s_initialized;
142};
143
144inline MAYAFLUX_API ComputePress& get_compute_press()
145{
146 return ComputePress::instance();
147}
148
149} // namespace MayaFlux::Portal::Graphics
ComputePress & operator=(const ComputePress &)=delete
ComputePress(ComputePress &&) noexcept=delete
std::unordered_map< ComputePipelineID, PipelineState > m_pipelines
ComputePress(const ComputePress &)=delete
std::shared_ptr< Core::VKDescriptorManager > m_descriptor_manager
Compute-specific pipeline and dispatch orchestration.
Portal-level shader compilation and caching.
void initialize()
Definition main.cpp:11
void shutdown()
Shutdown Portal::Graphics subsystem.
Definition Graphics.cpp:87
constexpr ComputePipelineID INVALID_COMPUTE_PIPELINE
MAYAFLUX_API ComputePress & get_compute_press()
std::vector< vk::DescriptorSetLayout > layouts
std::shared_ptr< Core::VKComputePipeline > pipeline