MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ initialize_pipeline()

void MayaFlux::Buffers::ComputeProcessor::initialize_pipeline ( const std::shared_ptr< VKBuffer > &  buffer)
overrideprotectedvirtual

Implements MayaFlux::Buffers::ShaderProcessor.

Definition at line 18 of file ComputeProcessor.cpp.

19{
22 "Cannot create pipeline without shader");
23 return;
24 }
25
26 auto& compute_press = Portal::Graphics::get_compute_press();
27
28 std::map<std::pair<uint32_t, uint32_t>, Portal::Graphics::DescriptorBindingInfo> unified_bindings;
29
30 const auto& descriptor_bindings = buffer->get_pipeline_context().descriptor_buffer_bindings;
31 for (const auto& binding : descriptor_bindings) {
32 unified_bindings[{ binding.set, binding.binding }] = binding;
33 }
34
35 for (const auto& [name, binding] : m_config.bindings) {
36 auto key = std::make_pair(binding.set, binding.binding);
37 if (unified_bindings.find(key) == unified_bindings.end()) {
38 unified_bindings[key] = Portal::Graphics::DescriptorBindingInfo {
39 .set = binding.set,
40 .binding = binding.binding,
41 .type = binding.type,
42 .buffer_info = {},
43 .name = name
44 };
45 }
46 }
47
48 std::map<uint32_t, std::vector<Portal::Graphics::DescriptorBindingInfo>> bindings_by_set;
49 for (const auto& [key, binding] : unified_bindings) {
50 bindings_by_set[binding.set].push_back(binding);
51 }
52
53 std::vector<std::vector<Portal::Graphics::DescriptorBindingInfo>> descriptor_sets;
54
55 descriptor_sets.reserve(bindings_by_set.size());
56 for (const auto& [set_index, set_bindings] : bindings_by_set) {
57 descriptor_sets.push_back(set_bindings);
58 }
59
60 const auto& staging = buffer->get_pipeline_context().push_constant_staging;
61 size_t push_constant_size = 0;
62
63 if (!staging.empty()) {
64 push_constant_size = staging.size();
65 } else {
66 push_constant_size = std::max(m_config.push_constant_size, m_push_constant_data.size());
67 }
68
69 m_pipeline_id = compute_press.create_pipeline(
71 descriptor_sets,
72 push_constant_size);
73
76 "Failed to create compute pipeline");
77 return;
78 }
79
81
83 "Compute pipeline created (ID: {}, {} descriptor sets, {} bytes push constants)",
84 m_pipeline_id, descriptor_sets.size(), m_config.push_constant_size);
85}
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
Portal::Graphics::ComputePipelineID m_pipeline_id
Portal::Graphics::ShaderID m_shader_id
std::vector< uint8_t > m_push_constant_data
virtual void on_pipeline_created(Portal::Graphics::ComputePipelineID pipeline_id)
Called after pipeline is created.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
constexpr ShaderID INVALID_SHADER
constexpr ComputePipelineID INVALID_COMPUTE_PIPELINE
MAYAFLUX_API ComputePress & get_compute_press()

References MayaFlux::Buffers::ShaderConfig::bindings, MayaFlux::Journal::BufferProcessing, MayaFlux::Journal::Buffers, MayaFlux::Portal::Graphics::get_compute_press(), MayaFlux::Portal::Graphics::INVALID_COMPUTE_PIPELINE, MayaFlux::Portal::Graphics::INVALID_SHADER, MayaFlux::Buffers::ShaderProcessor::m_config, m_pipeline_id, MayaFlux::Buffers::ShaderProcessor::m_push_constant_data, MayaFlux::Buffers::ShaderProcessor::m_shader_id, MF_ERROR, MF_INFO, MayaFlux::Buffers::ShaderProcessor::on_pipeline_created(), MayaFlux::Buffers::ShaderConfig::push_constant_size, and MayaFlux::Portal::Graphics::DescriptorBindingInfo::set.

+ Here is the call graph for this function: