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

◆ download_image_data()

void MayaFlux::Core::BackendResourceManager::download_image_data ( std::shared_ptr< VKImage image,
void *  data,
size_t  size 
)

Download data from an image (creates staging buffer internally)

Parameters
imageSource VKImage
dataDestination buffer pointer
sizeBuffer size in bytes

Definition at line 603 of file BackendResoureManager.cpp.

607{
608 if (!image || !data) {
610 "Invalid parameters for download_image_data");
611 return;
612 }
613
614 auto staging = std::make_shared<Buffers::VKBuffer>(
615 size,
618
619 initialize_buffer(staging);
620
621 execute_immediate_commands([&](vk::CommandBuffer cmd) {
622 vk::ImageMemoryBarrier barrier {};
623 barrier.oldLayout = image->get_current_layout();
624 barrier.newLayout = vk::ImageLayout::eTransferSrcOptimal;
625 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
626 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
627 barrier.image = image->get_image();
628 barrier.subresourceRange.aspectMask = image->get_aspect_flags();
629 barrier.subresourceRange.baseMipLevel = 0;
630 barrier.subresourceRange.levelCount = image->get_mip_levels();
631 barrier.subresourceRange.baseArrayLayer = 0;
632 barrier.subresourceRange.layerCount = image->get_array_layers();
633 barrier.srcAccessMask = vk::AccessFlagBits::eShaderRead;
634 barrier.dstAccessMask = vk::AccessFlagBits::eTransferRead;
635
636 cmd.pipelineBarrier(
637 vk::PipelineStageFlagBits::eFragmentShader,
638 vk::PipelineStageFlagBits::eTransfer,
639 vk::DependencyFlags {},
640 0, nullptr, 0, nullptr, 1, &barrier);
641
642 vk::BufferImageCopy region {};
643 region.bufferOffset = 0;
644 region.bufferRowLength = 0;
645 region.bufferImageHeight = 0;
646 region.imageSubresource.aspectMask = image->get_aspect_flags();
647 region.imageSubresource.mipLevel = 0;
648 region.imageSubresource.baseArrayLayer = 0;
649 region.imageSubresource.layerCount = image->get_array_layers();
650 region.imageOffset = vk::Offset3D { 0, 0, 0 };
651 region.imageExtent = vk::Extent3D {
652 image->get_width(),
653 image->get_height(),
654 image->get_depth()
655 };
656
657 cmd.copyImageToBuffer(
658 image->get_image(),
659 vk::ImageLayout::eTransferSrcOptimal,
660 staging->get_buffer(),
661 1, &region);
662
663 barrier.oldLayout = vk::ImageLayout::eTransferSrcOptimal;
664 barrier.newLayout = image->get_current_layout();
665 barrier.srcAccessMask = vk::AccessFlagBits::eTransferRead;
666 barrier.dstAccessMask = vk::AccessFlagBits::eShaderRead;
667
668 cmd.pipelineBarrier(
669 vk::PipelineStageFlagBits::eTransfer,
670 vk::PipelineStageFlagBits::eFragmentShader,
671 vk::DependencyFlags {},
672 0, nullptr, 0, nullptr, 1, &barrier);
673 });
674
675 staging->mark_invalid_range(0, size);
676 auto& resources = staging->get_buffer_resources();
677 vk::MappedMemoryRange range { resources.memory, 0, VK_WHOLE_SIZE };
678
679 if (auto result = m_context.get_device().invalidateMappedMemoryRanges(1, &range); result != vk::Result::eSuccess) {
681 "Failed to invalidate mapped memory range: {}", vk::to_string(result));
682 }
683
684 void* mapped = staging->get_mapped_ptr();
685 if (mapped) {
686 std::memcpy(data, mapped, size);
687 }
688
689 cleanup_buffer(staging);
690
692 "Downloaded {} bytes from image {}x{}",
693 size, image->get_width(), image->get_height());
694}
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
@ STAGING
Host-visible staging buffer (CPU-writable)
void cleanup_buffer(const std::shared_ptr< Buffers::VKBuffer > &buffer)
Cleanup a buffer and release associated resources.
void execute_immediate_commands(const std::function< void(vk::CommandBuffer)> &recorder)
Execute immediate command recording for buffer operations.
void initialize_buffer(const std::shared_ptr< Buffers::VKBuffer > &buffer)
Initialize a buffer for use with the graphics backend.
vk::Device get_device() const
Get logical device.
Definition VKContext.hpp:49
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.
@ IMAGE_COLOR
2D RGB/RGBA image

References cleanup_buffer(), MayaFlux::Journal::Core, execute_immediate_commands(), MayaFlux::Core::VKContext::get_device(), MayaFlux::Journal::GraphicsBackend, MayaFlux::Kakshya::IMAGE_COLOR, initialize_buffer(), m_context, MF_DEBUG, MF_ERROR, and MayaFlux::Buffers::VKBuffer::STAGING.

Referenced by MayaFlux::Portal::Graphics::TextureLoom::download_data().

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