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

◆ from_image_array() [2/2]

void MayaFlux::Kakshya::TextureContainer::from_image_array ( const std::shared_ptr< Core::VKImage > &  image,
const std::shared_ptr< Buffers::VKBuffer > &  staging 
)

Download all array layers from a VKImage, reusing a caller-supplied persistent staging buffer.

Identical to from_image_array() but passes staging through to TextureLoom::download_data. The staging buffer must be at least byte_size() * get_layer_count() bytes. Use Buffers::create_image_staging_buffer(byte_size() * get_layer_count()) to allocate it once before the render loop.

Parameters
imageSource VKImage with array_layers >= get_layer_count().
stagingHost-visible staging VKBuffer sized to at least byte_size() * get_layer_count().

Definition at line 313 of file TextureContainer.cpp.

316{
317 if (!image || !image->is_initialized()) {
319 "TextureContainer::from_image_array(staging) called with uninitialised image");
320 return;
321 }
322
323 const auto n = static_cast<uint32_t>(m_data.size());
324 if (image->get_array_layers() < n) {
326 "TextureContainer::from_image_array(staging) image has {} layers, container expects {}",
327 image->get_array_layers(), n);
328 return;
329 }
330
331 const size_t layer_bytes = byte_size();
332 std::vector<uint8_t> combined(layer_bytes * n);
333 TextureLoom::instance().download_data(image, combined.data(), combined.size(), staging);
334
335 const size_t element_count = static_cast<size_t>(m_width) * m_height * m_channels;
336 for (uint32_t i = 0; i < n; ++i) {
337 Memory::SeqlockWriteGuard g(m_slot_locks[i]);
338 m_data[i] = make_empty_storage(m_format, element_count);
339 auto [ptr, bytes] = variant_bytes_mutable(m_data[i]);
340 if (ptr && bytes == layer_bytes)
341 std::memcpy(ptr, combined.data() + i * layer_bytes, layer_bytes);
342 m_cpu_stale[i].store(false, std::memory_order_release);
343
344 m_normalised_dirty[i].store(true, std::memory_order_release);
345 }
346
348}
#define MF_ERROR(comp, ctx,...)
IO::ImageData image
Definition Decoder.cpp:47
const uint8_t * ptr
std::vector< std::atomic< bool > > m_normalised_dirty
std::vector< std::atomic< bool > > m_cpu_stale
Per layer: the GPU image in m_layer_image_cache holds the content, m_data does not.
void update_processing_state(ProcessingState state) override
Update the processing state of the container.
size_t byte_size() const
Total byte count of the pixel buffer.
void download_data(const std::shared_ptr< Core::VKImage > &image, void *data, size_t size, const std::shared_ptr< Buffers::VKBuffer > &staging, bool deferred=false, vk::ImageLayout restore_layout=vk::ImageLayout::eShaderReadOnlyOptimal, vk::PipelineStageFlags restore_stage=vk::PipelineStageFlagBits::eFragmentShader)
Download pixel data from a VKImage, reusing a caller-supplied persistent staging buffer.
@ ContainerProcessing
Container operations (Kakshya - file/stream/region processing)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
@ READY
Container has data loaded and is ready for processing.
DataVariant make_empty_storage(ImageFormat format, size_t element_count)
Allocate a zeroed DataVariant of the alternative backing a format.
std::pair< uint8_t *, size_t > variant_bytes_mutable(DataVariant &v)
Get a mutable pointer to the raw bytes of a DataVariant and its size.

References byte_size(), MayaFlux::Journal::ContainerProcessing, MayaFlux::Portal::Graphics::TextureLoom::download_data(), image, MayaFlux::Portal::Graphics::TextureLoom::instance(), MayaFlux::Journal::Kakshya, m_channels, m_cpu_stale, m_data, m_format, m_height, m_normalised_dirty, m_slot_locks, m_width, MayaFlux::Kakshya::make_empty_storage(), MF_ERROR, ptr, MayaFlux::Kakshya::READY, update_processing_state(), and MayaFlux::Kakshya::variant_bytes_mutable().

+ Here is the call graph for this function: