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

◆ begin_rendering()

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

Begin dynamic rendering to a window.

Parameters
cmd_idCommand buffer ID
windowTarget window
swapchain_imageSwapchain image to render to
clear_colorClear color (RGBA)

Uses vkCmdBeginRendering - no render pass objects needed.

Definition at line 486 of file RenderFlow.cpp.

491{
492 auto cmd = m_shader_foundry->get_command_buffer(cmd_id);
493 if (!cmd) {
495 "Invalid command buffer ID: {}", cmd_id);
496 return;
497 }
498
499 if (!window) {
501 "Cannot begin rendering for null window");
502 return;
503 }
504
505 if (!swapchain_image) {
507 "Cannot begin rendering with null swapchain image");
508 return;
509 }
510
511 auto it = m_window_associations.find(window);
512 if (it == m_window_associations.end()) {
514 "Window '{}' not registered for rendering. "
515 "Call register_window_for_rendering() first.",
516 window->get_create_info().title);
517 m_window_associations.emplace(window, WindowRenderAssociation { .window = window, .swapchain_image = swapchain_image });
518 } else {
519 it->second.swapchain_image = swapchain_image;
520 }
521
522 uint32_t width = 0, height = 0;
523 m_display_service->get_swapchain_extent(window, width, height);
524
525 if (width == 0 || height == 0) {
527 "Invalid swapchain extent for window '{}': {}x{}",
528 window->get_create_info().title, width, height);
529 return;
530 }
531
532 vk::ImageView image_view = get_current_image_view(window);
533 if (!image_view) {
535 "Failed to get image view for window '{}'",
536 window->get_create_info().title);
537 return;
538 }
539
540 vk::ImageMemoryBarrier pre_barrier {};
541 pre_barrier.oldLayout = vk::ImageLayout::eUndefined;
542 pre_barrier.newLayout = vk::ImageLayout::eColorAttachmentOptimal;
543 pre_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
544 pre_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
545 pre_barrier.image = swapchain_image;
546 pre_barrier.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
547 pre_barrier.subresourceRange.baseMipLevel = 0;
548 pre_barrier.subresourceRange.levelCount = 1;
549 pre_barrier.subresourceRange.baseArrayLayer = 0;
550 pre_barrier.subresourceRange.layerCount = 1;
551 pre_barrier.srcAccessMask = vk::AccessFlagBits::eNone;
552 pre_barrier.dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite;
553
554 cmd.pipelineBarrier(
555 vk::PipelineStageFlagBits::eTopOfPipe,
556 vk::PipelineStageFlagBits::eColorAttachmentOutput,
557 vk::DependencyFlags {},
558 0, nullptr,
559 0, nullptr,
560 1, &pre_barrier);
561
562 vk::RenderingAttachmentInfo color_attachment {};
563 color_attachment.sType = vk::StructureType::eRenderingAttachmentInfo;
564 color_attachment.pNext = nullptr;
565 color_attachment.imageView = image_view;
566 color_attachment.imageLayout = vk::ImageLayout::eColorAttachmentOptimal;
567 color_attachment.resolveMode = vk::ResolveModeFlagBits::eNone;
568 color_attachment.resolveImageView = nullptr;
569 color_attachment.resolveImageLayout = vk::ImageLayout::eUndefined;
570 color_attachment.loadOp = vk::AttachmentLoadOp::eClear;
571 color_attachment.storeOp = vk::AttachmentStoreOp::eStore;
572 color_attachment.clearValue.color = vk::ClearColorValue(clear_color);
573
574 vk::RenderingInfo rendering_info {};
575 rendering_info.sType = vk::StructureType::eRenderingInfo;
576 rendering_info.pNext = nullptr;
577 rendering_info.flags = vk::RenderingFlagBits::eContentsSecondaryCommandBuffers;
578 rendering_info.renderArea.offset = vk::Offset2D { 0, 0 };
579 rendering_info.renderArea.extent = vk::Extent2D { width, height };
580 rendering_info.layerCount = 1;
581 rendering_info.colorAttachmentCount = 1;
582 rendering_info.pColorAttachments = &color_attachment;
583 rendering_info.pDepthAttachment = nullptr;
584 rendering_info.pStencilAttachment = nullptr;
585
586 cmd.beginRendering(rendering_info);
587
589 "Began dynamic rendering for window '{}' ({}x{})",
590 window->get_create_info().title, width, height);
591}
#define MF_RT_ERROR(comp, ctx,...)
#define MF_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
std::unordered_map< std::shared_ptr< Core::Window >, WindowRenderAssociation > m_window_associations
vk::ImageView get_current_image_view(const std::shared_ptr< Core::Window > &window)
Get current image view for window.
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 > &, uint32_t &, uint32_t &)> get_swapchain_extent
Get swapchain extent for a window.

References MayaFlux::Portal::Graphics::ShaderFoundry::get_command_buffer(), get_current_image_view(), MayaFlux::Registry::Service::DisplayService::get_swapchain_extent, m_display_service, m_shader_foundry, m_window_associations, MF_RT_ERROR, MF_TRACE, MF_WARN, MayaFlux::Journal::Portal, MayaFlux::Journal::Rendering, and MayaFlux::Portal::Graphics::RenderFlow::WindowRenderAssociation::window.

+ Here is the call graph for this function: