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

◆ upload_image_data() [1/2]

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

Upload data to an image (creates staging buffer internally)

Parameters
imageTarget VKImage
dataPixel data pointer
sizeData size in bytes

Definition at line 673 of file BackendResoureManager.cpp.

677{
678 if (!image || !data) {
680 "Invalid parameters for upload_image_data");
681 return;
682 }
683
684 auto staging = std::make_shared<Buffers::VKBuffer>(
685 size,
686 Buffers::VKBuffer::Usage::STAGING,
688
689 initialize_buffer(staging);
690
691 void* mapped = staging->get_mapped_ptr();
692 if (!mapped) {
694 "Failed to map staging buffer for image upload");
695 cleanup_buffer(staging);
696 return;
697 }
698
699 std::memcpy(mapped, data, size);
700 staging->mark_dirty_range(0, size);
701
702 auto& resources = staging->get_buffer_resources();
703 vk::MappedMemoryRange range { resources.memory, 0, VK_WHOLE_SIZE };
704
705 if (auto result = m_context.get_device().flushMappedMemoryRanges(1, &range); result != vk::Result::eSuccess) {
707 "Failed to flush mapped memory range: {}", vk::to_string(result));
708 }
709
710 execute_immediate_commands([&](vk::CommandBuffer cmd) {
711 vk::ImageMemoryBarrier barrier {};
712 barrier.oldLayout = image->get_current_layout();
713 barrier.newLayout = vk::ImageLayout::eTransferDstOptimal;
714 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
715 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
716 barrier.image = image->get_image();
717 barrier.subresourceRange.aspectMask = image->get_aspect_flags();
718 barrier.subresourceRange.baseMipLevel = 0;
719 barrier.subresourceRange.levelCount = image->get_mip_levels();
720 barrier.subresourceRange.baseArrayLayer = 0;
721 barrier.subresourceRange.layerCount = image->get_array_layers();
722 barrier.srcAccessMask = vk::AccessFlagBits::eShaderRead;
723 barrier.dstAccessMask = vk::AccessFlagBits::eTransferWrite;
724
725 cmd.pipelineBarrier(
726 vk::PipelineStageFlagBits::eFragmentShader,
727 vk::PipelineStageFlagBits::eTransfer,
728 vk::DependencyFlags {},
729 0, nullptr, 0, nullptr, 1, &barrier);
730
731 vk::BufferImageCopy region {};
732 region.bufferOffset = 0;
733 region.bufferRowLength = 0;
734 region.bufferImageHeight = 0;
735 region.imageSubresource.aspectMask = image->get_aspect_flags();
736 region.imageSubresource.mipLevel = 0;
737 region.imageSubresource.baseArrayLayer = 0;
738 region.imageSubresource.layerCount = image->get_array_layers();
739 region.imageOffset = vk::Offset3D { 0, 0, 0 };
740 region.imageExtent = vk::Extent3D {
741 image->get_width(),
742 image->get_height(),
743 image->get_depth()
744 };
745
746 cmd.copyBufferToImage(
747 staging->get_buffer(),
748 image->get_image(),
749 vk::ImageLayout::eTransferDstOptimal,
750 1, &region);
751
752 barrier.oldLayout = vk::ImageLayout::eTransferDstOptimal;
753 barrier.newLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
754 barrier.srcAccessMask = vk::AccessFlagBits::eTransferWrite;
755 barrier.dstAccessMask = vk::AccessFlagBits::eShaderRead;
756
757 cmd.pipelineBarrier(
758 vk::PipelineStageFlagBits::eTransfer,
759 vk::PipelineStageFlagBits::eFragmentShader,
760 vk::DependencyFlags {},
761 0, nullptr, 0, nullptr, 1, &barrier);
762 });
763
764 image->set_current_layout(vk::ImageLayout::eShaderReadOnlyOptimal);
765
767 "Uploaded {} bytes to image {}x{}",
768 size, image->get_width(), image->get_height());
769}
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
vk::CommandBuffer cmd
IO::ImageData image
Definition Decoder.cpp:47
bool size
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
std::vector< double > range(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Value range (max - min) per window.
Definition Analysis.cpp:452

References cleanup_buffer(), cmd, MayaFlux::Journal::Core, execute_immediate_commands(), MayaFlux::Core::VKContext::get_device(), MayaFlux::Journal::GraphicsBackend, image, MayaFlux::Kakshya::IMAGE_COLOR, initialize_buffer(), m_context, MF_DEBUG, MF_ERROR, and size.

Referenced by MayaFlux::Portal::Graphics::TextureLoom::upload_data(), and MayaFlux::Portal::Graphics::TextureLoom::upload_data().

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