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

◆ begin_render_pass()

void MayaFlux::Portal::Graphics::RenderFlow::begin_render_pass ( CommandBufferID  cmd_id,
const std::shared_ptr< Core::Window > &  window,
const std::array< float, 4 > &  clear_color = { 0.0F, 0.0F, 0.0F, 1.0F } 
)

Begin render pass.

Parameters
cmd_idCommand buffer ID
windowTarget window for rendering
clear_colorClear color (if load op is clear)

Definition at line 608 of file RenderFlow.cpp.

612{
613 auto cmd = m_shader_foundry->get_command_buffer(cmd_id);
614 if (!cmd) {
616 "Invalid command buffer ID: {}", cmd_id);
617 return;
618 }
619
620 if (!window) {
622 "Cannot begin render pass for null window");
623 return;
624 }
625
626 auto assoc_it = m_window_associations.find(window);
627 if (assoc_it == m_window_associations.end()) {
629 "Window '{}' not registered for rendering. "
630 "Call register_window_for_rendering() first.",
631 window->get_create_info().title);
632 return;
633 }
634
635 auto rp_it = m_render_passes.find(assoc_it->second.render_pass_id);
636 if (rp_it == m_render_passes.end()) {
638 "Invalid render pass ID: {}", assoc_it->second.render_pass_id);
639 return;
640 }
641
642 Core::VKFramebuffer* fb_handle = static_cast<Core::VKFramebuffer*>(m_display_service->get_current_framebuffer(window));
643 if (!fb_handle) {
645 "No framebuffer available for window '{}'. "
646 "Ensure window is registered with GraphicsSubsystem.",
647 window->get_create_info().title);
648 return;
649 }
650
651 uint32_t width = 0, height = 0;
652 m_display_service->get_swapchain_extent(window, width, height);
653
654 if (width == 0 || height == 0) {
656 "Invalid swapchain extent for window '{}': {}x{}",
657 window->get_create_info().title, width, height);
658 return;
659 }
660
661 vk::RenderPassBeginInfo begin_info;
662 begin_info.renderPass = rp_it->second.render_pass->get();
663 begin_info.framebuffer = fb_handle->get();
664 begin_info.renderArea.offset = vk::Offset2D { 0, 0 };
665 begin_info.renderArea.extent = vk::Extent2D { width, height };
666
667 std::vector<vk::ClearValue> clear_values(rp_it->second.attachments.size());
668 for (auto& clear_value : clear_values) {
669 clear_value.color = vk::ClearColorValue(clear_color);
670 // clear_value.color = vk::ClearColorValue(std::array<float, 4> { 0.2f, 0.2f, 0.2f, 1.0f }); // Gray
671 }
672
673 begin_info.clearValueCount = static_cast<uint32_t>(clear_values.size());
674 begin_info.pClearValues = clear_values.data();
675
676 cmd.beginRenderPass(begin_info, vk::SubpassContents::eInline);
677
679 "Began render pass for window '{}' ({}x{})",
680 window->get_create_info().title, width, height);
681}
#define MF_ERROR(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_TRACE(comp, ctx,...)
std::unordered_map< RenderPassID, RenderPassState > m_render_passes
std::unordered_map< std::shared_ptr< Core::Window >, WindowRenderAssociation > m_window_associations
Registry::Service::DisplayService * m_display_service
vk::CommandBuffer get_command_buffer(CommandBufferID cmd_id)
Get Vulkan command buffer handle from CommandBufferID.
@ Rendering
GPU rendering operations (graphics pipeline, frame rendering)
@ Portal
High-level user-facing API layer.
std::function< void *(const std::shared_ptr< void > &)> get_current_framebuffer
Get current framebuffer for a window.
std::function< void(const std::shared_ptr< void > &, uint32_t &, uint32_t &)> get_swapchain_extent
Get swapchain extent for a window.

References MayaFlux::Core::VKFramebuffer::get(), MayaFlux::Portal::Graphics::ShaderFoundry::get_command_buffer(), MayaFlux::Registry::Service::DisplayService::get_current_framebuffer, MayaFlux::Registry::Service::DisplayService::get_swapchain_extent, m_display_service, m_render_passes, m_shader_foundry, m_window_associations, MF_ERROR, MF_RT_ERROR, MF_TRACE, MayaFlux::Journal::Portal, and MayaFlux::Journal::Rendering.

+ Here is the call graph for this function: