MayaFlux 0.1.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 shutdown();
39
40 //==========================================================================
41 // Pipeline Creation (COMPUTE-SPECIFIC)
42 //==========================================================================
43
44 /**
45 * @brief Create compute pipeline
46 */
47 ComputePipelineID create_pipeline(
48 ShaderID shader_id,
49 const std::vector<std::vector<DescriptorBindingConfig>>& descriptor_sets = {},
50 size_t push_constant_size = 0);
51
52 /**
53 * @brief Create pipeline with auto-reflection
54 */
55 ComputePipelineID create_pipeline_auto(
56 ShaderID shader_id,
57 size_t push_constant_size = 0);
58
59 void destroy_pipeline(ComputePipelineID pipeline_id);
60
61 //==========================================================================
62 // Pipeline Binding (COMPUTE-SPECIFIC)
63 //==========================================================================
64
65 /**
66 * @brief Bind pipeline to active command buffer
67 */
68 void bind_pipeline(CommandBufferID cmd_id, ComputePipelineID pipeline_id);
69
70 /**
71 * @brief Bind descriptor sets to active command buffer
72 */
73 void bind_descriptor_sets(
74 CommandBufferID cmd_id,
75 ComputePipelineID pipeline_id,
76 const std::vector<DescriptorSetID>& descriptor_set_ids);
77
78 /**
79 * @brief Push constants to active command buffer
80 */
81 void push_constants(
82 CommandBufferID cmd_id,
83 ComputePipelineID pipeline_id,
84 const void* data,
85 size_t size);
86
87 //==========================================================================
88 // Dispatch (COMPUTE-SPECIFIC)
89 //==========================================================================
90
91 /**
92 * @brief Dispatch compute workgroups
93 */
94 void dispatch(CommandBufferID cmd_id, uint32_t x, uint32_t y, uint32_t z);
95
96 /**
97 * @brief Dispatch compute workgroups indirectly
98 */
99 void dispatch_indirect(
100 CommandBufferID cmd_id,
101 vk::Buffer indirect_buffer,
102 vk::DeviceSize offset = 0);
103
104 //==========================================================================
105 // Convenience Wrappers
106 //==========================================================================
107
108 /**
109 * @brief All-in-one: allocate descriptors for pipeline
110 */
111 std::vector<DescriptorSetID> allocate_pipeline_descriptors(ComputePipelineID pipeline_id);
112
113 /**
114 * @brief All-in-one: bind pipeline + descriptors + push constants
115 */
116 void bind_all(
117 CommandBufferID cmd_id,
118 ComputePipelineID pipeline_id,
119 const std::vector<DescriptorSetID>& descriptor_set_ids,
120 const void* push_constants_data = nullptr,
121 size_t push_constant_size = 0);
122
123private:
124 ComputePress() = default;
126
129 std::shared_ptr<Core::VKComputePipeline> pipeline;
130 std::vector<vk::DescriptorSetLayout> layouts;
131 vk::PipelineLayout layout;
132 };
133
134 std::shared_ptr<Core::VKDescriptorManager> m_descriptor_manager;
135 std::unordered_map<ComputePipelineID, PipelineState> m_pipelines;
136 std::atomic<uint64_t> m_next_pipeline_id { 1 };
137 ShaderFoundry* m_shader_foundry = nullptr;
138
139 static bool s_initialized;
140};
141
142inline MAYAFLUX_API ComputePress& get_compute_press()
143{
144 return ComputePress::instance();
145}
146
147} // 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:69
constexpr ComputePipelineID INVALID_COMPUTE_PIPELINE
MAYAFLUX_API ComputePress & get_compute_press()
std::vector< vk::DescriptorSetLayout > layouts
std::shared_ptr< Core::VKComputePipeline > pipeline
Portal-level descriptor binding configuration.