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

◆ execute_shader()

void MayaFlux::Buffers::ComputeProcessor::execute_shader ( const std::shared_ptr< VKBuffer > &  buffer)
overrideprivatevirtual

Implements MayaFlux::Buffers::ShaderProcessor.

Definition at line 210 of file ComputeProcessor.cpp.

211{
214 "Cannot dispatch without pipeline and descriptors");
215 return;
216 }
217
218 if (m_descriptor_set_ids.empty()) {
220 "Descriptor sets not initialized");
221 return;
222 }
223
224 auto& foundry = Portal::Graphics::get_shader_foundry();
225 auto& compute_press = Portal::Graphics::get_compute_press();
226
227 auto cmd_id = foundry.begin_commands(Portal::Graphics::ShaderFoundry::CommandBufferType::COMPUTE);
228
229 m_last_command_buffer = cmd_id;
231
232 compute_press.bind_pipeline(cmd_id, m_pipeline_id);
233
234 auto& descriptor_bindings = buffer->get_pipeline_context().descriptor_buffer_bindings;
235 if (!descriptor_bindings.empty()) {
236 for (const auto& binding : descriptor_bindings) {
237 if (binding.set >= m_descriptor_set_ids.size()) {
239 "Descriptor set index {} out of range", binding.set);
240 continue;
241 }
242
243 foundry.update_descriptor_buffer(
244 m_descriptor_set_ids[binding.set],
245 binding.binding,
246 binding.type,
247 binding.buffer_info.buffer,
248 binding.buffer_info.offset,
249 binding.buffer_info.range);
250 }
251 }
252
253 if (!m_descriptor_set_ids.empty()) {
254 compute_press.bind_descriptor_sets(cmd_id, m_pipeline_id, m_descriptor_set_ids);
255 }
256
257 on_before_execute(cmd_id, buffer);
258
259 const uint32_t iterations = std::max(1U, m_dispatch_config.iteration_count);
260 const auto dispatch_size = calculate_dispatch_size(buffer);
261
262 for (uint32_t i = 0; i < iterations; ++i) {
263 if (!on_iteration(cmd_id, buffer, i)) {
264 continue;
265 }
266
267 const auto& pc_bindings = buffer->get_pipeline_context().push_constant_bindings;
268
269 if (!pc_bindings.empty()) {
270 size_t required = 0;
271 for (const auto& pc : pc_bindings) {
272 required = std::max(required, static_cast<size_t>(pc.offset) + pc.data.size());
273 }
274
275 m_push_constant_scratch.assign(required, 0);
276
277 for (const auto& pc : pc_bindings) {
278 std::memcpy(m_push_constant_scratch.data() + pc.offset, pc.data.data(), pc.data.size());
279 }
280
281 compute_press.push_constants(
282 cmd_id, m_pipeline_id,
285 } else if (!m_push_constant_data.empty()) {
286 compute_press.push_constants(
287 cmd_id, m_pipeline_id,
289 m_push_constant_data.size());
290 }
291
292 compute_press.dispatch(cmd_id, dispatch_size[0], dispatch_size[1], dispatch_size[2]);
293
294 if (i + 1 < iterations) {
295 on_iteration_barrier(cmd_id, buffer, i);
296 }
297 }
298
299 on_after_execute(cmd_id, buffer);
300
301 foundry.buffer_barrier(
302 cmd_id,
303 buffer->get_buffer(),
304 vk::AccessFlagBits::eShaderWrite,
305 vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferRead,
306 vk::PipelineStageFlagBits::eComputeShader,
307 vk::PipelineStageFlagBits::eComputeShader | vk::PipelineStageFlagBits::eTransfer);
308
309 submit_recorded(cmd_id, buffer);
310}
#define MF_ERROR(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
virtual void on_iteration_barrier(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer, uint32_t index)
Called after each iteration except the last.
std::vector< uint8_t > m_push_constant_scratch
Coalesced push constant bindings, reused across iterations.
Portal::Graphics::ComputePipelineID m_pipeline_id
virtual bool on_iteration(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer, uint32_t index)
Called before each iteration's push constants and dispatch.
virtual std::array< uint32_t, 3 > calculate_dispatch_size(const std::shared_ptr< VKBuffer > &buffer)
Calculate dispatch size from buffer.
Portal::Graphics::CommandBufferID m_last_command_buffer
std::vector< uint8_t > m_push_constant_data
virtual void on_after_execute(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer)
Called after each process callback.
virtual bool on_before_execute(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer)
Called before each process callback.
std::shared_ptr< VKBuffer > m_last_processed_buffer
void submit_recorded(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer)
Submit a recorded command buffer honoring the submission mode.
std::vector< Portal::Graphics::DescriptorSetID > m_descriptor_set_ids
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
MAYAFLUX_API ShaderFoundry & get_shader_foundry()
Get the global shader compiler instance.
constexpr ComputePipelineID INVALID_COMPUTE_PIPELINE
MAYAFLUX_API ComputePress & get_compute_press()
uint32_t iteration_count
Dispatches recorded per execute cycle.

References MayaFlux::Journal::BufferProcessing, MayaFlux::Journal::Buffers, calculate_dispatch_size(), MayaFlux::Portal::Graphics::ShaderFoundry::COMPUTE, MayaFlux::Portal::Graphics::get_compute_press(), MayaFlux::Portal::Graphics::get_shader_foundry(), MayaFlux::Portal::Graphics::INVALID_COMPUTE_PIPELINE, MayaFlux::Buffers::ShaderDispatchConfig::iteration_count, MayaFlux::Buffers::ShaderProcessor::m_descriptor_set_ids, m_dispatch_config, MayaFlux::Buffers::ShaderProcessor::m_last_command_buffer, MayaFlux::Buffers::ShaderProcessor::m_last_processed_buffer, m_pipeline_id, MayaFlux::Buffers::ShaderProcessor::m_push_constant_data, m_push_constant_scratch, MF_ERROR, MF_RT_ERROR, MayaFlux::Buffers::ShaderProcessor::on_after_execute(), MayaFlux::Buffers::ShaderProcessor::on_before_execute(), on_iteration(), on_iteration_barrier(), and MayaFlux::Buffers::ShaderProcessor::submit_recorded().

+ Here is the call graph for this function: