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

◆ transition_image_layout()

void MayaFlux::Core::BackendResourceManager::transition_image_layout ( vk::Image  image,
vk::ImageLayout  old_layout,
vk::ImageLayout  new_layout,
uint32_t  mip_levels = 1,
uint32_t  array_layers = 1,
vk::ImageAspectFlags  aspect_flags = vk::ImageAspectFlagBits::eColor 
)

Transition image layout using a pipeline barrier.

Parameters
imageVkImage handle
old_layoutCurrent layout
new_layoutTarget layout
mip_levelsNumber of mip levels to transition
array_layersNumber of array layers to transition

Executes immediately on graphics queue. Use for initial setup and one-off transitions. For rendering, prefer manual barriers.

Definition at line 550 of file BackendResoureManager.cpp.

557{
558 execute_immediate_commands([&](vk::CommandBuffer cmd) {
559 vk::ImageMemoryBarrier barrier {};
560 barrier.oldLayout = old_layout;
561 barrier.newLayout = new_layout;
562 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
563 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
564 barrier.image = image;
565 barrier.subresourceRange.aspectMask = aspect_flags;
566 barrier.subresourceRange.baseMipLevel = 0;
567 barrier.subresourceRange.levelCount = mip_levels;
568 barrier.subresourceRange.baseArrayLayer = 0;
569 barrier.subresourceRange.layerCount = array_layers;
570
571 vk::PipelineStageFlags src_stage;
572 vk::PipelineStageFlags dst_stage;
573
574 if (old_layout == vk::ImageLayout::eUndefined && new_layout == vk::ImageLayout::eTransferDstOptimal) {
575 barrier.srcAccessMask = vk::AccessFlags {};
576 barrier.dstAccessMask = vk::AccessFlagBits::eTransferWrite;
577 src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
578 dst_stage = vk::PipelineStageFlagBits::eTransfer;
579 } else if (old_layout == vk::ImageLayout::eTransferDstOptimal && new_layout == vk::ImageLayout::eShaderReadOnlyOptimal) {
580 barrier.srcAccessMask = vk::AccessFlagBits::eTransferWrite;
581 barrier.dstAccessMask = vk::AccessFlagBits::eShaderRead;
582 src_stage = vk::PipelineStageFlagBits::eTransfer;
583 dst_stage = vk::PipelineStageFlagBits::eFragmentShader;
584 } else if (old_layout == vk::ImageLayout::eUndefined && new_layout == vk::ImageLayout::eShaderReadOnlyOptimal) {
585 barrier.srcAccessMask = vk::AccessFlags {};
586 barrier.dstAccessMask = vk::AccessFlagBits::eShaderRead;
587 src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
588 dst_stage = vk::PipelineStageFlagBits::eFragmentShader;
589 } else if (old_layout == vk::ImageLayout::eUndefined && new_layout == vk::ImageLayout::eColorAttachmentOptimal) {
590 barrier.srcAccessMask = vk::AccessFlags {};
591 barrier.dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite;
592 src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
593 dst_stage = vk::PipelineStageFlagBits::eColorAttachmentOutput;
594 } else if (old_layout == vk::ImageLayout::eUndefined && new_layout == vk::ImageLayout::eDepthStencilAttachmentOptimal) {
595 barrier.srcAccessMask = vk::AccessFlags {};
596 barrier.dstAccessMask = vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite;
597 src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
598 dst_stage = vk::PipelineStageFlagBits::eEarlyFragmentTests;
599 } else if (old_layout == vk::ImageLayout::eUndefined && new_layout == vk::ImageLayout::eGeneral) {
600 barrier.srcAccessMask = vk::AccessFlags {};
601 barrier.dstAccessMask = vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eShaderWrite;
602 src_stage = vk::PipelineStageFlagBits::eTopOfPipe;
603 dst_stage = vk::PipelineStageFlagBits::eComputeShader;
604 } else {
605 barrier.srcAccessMask = vk::AccessFlagBits::eMemoryRead | vk::AccessFlagBits::eMemoryWrite;
606 barrier.dstAccessMask = vk::AccessFlagBits::eMemoryRead | vk::AccessFlagBits::eMemoryWrite;
607 src_stage = vk::PipelineStageFlagBits::eAllCommands;
608 dst_stage = vk::PipelineStageFlagBits::eAllCommands;
609
611 "Using generic image layout transition");
612 }
613
614 cmd.pipelineBarrier(
615 src_stage, dst_stage,
616 vk::DependencyFlags {},
617 0, nullptr, // Memory barriers
618 0, nullptr, // Buffer barriers
619 1, &barrier // Image barriers
620 );
621 });
622
624 "Image layout transitioned: {} -> {}",
625 vk::to_string(old_layout), vk::to_string(new_layout));
626}
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
vk::CommandBuffer cmd
IO::ImageData image
Definition Decoder.cpp:57
void execute_immediate_commands(const std::function< void(vk::CommandBuffer)> &recorder)
Execute immediate command recording for buffer operations.
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.

References cmd, MayaFlux::Journal::Core, execute_immediate_commands(), MayaFlux::Journal::GraphicsBackend, image, MF_DEBUG, and MF_WARN.

Referenced by MayaFlux::Portal::Graphics::TextureLoom::create_2d(), MayaFlux::Portal::Graphics::TextureLoom::create_3d(), MayaFlux::Portal::Graphics::TextureLoom::create_cubemap(), MayaFlux::Portal::Graphics::TextureLoom::create_depth_buffer(), MayaFlux::Portal::Graphics::TextureLoom::create_render_target(), MayaFlux::Portal::Graphics::TextureLoom::create_storage_image(), and MayaFlux::Portal::Graphics::TextureLoom::transition_layout().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: