Blocks the graphics cycle for the transfer, reusing one staging buffer.
224{
226 using Portal::Graphics::TextureLoom;
227
228 std::shared_ptr<Core::VKImage>
image;
229 if (const auto texture = std::dynamic_pointer_cast<TextureBuffer>(vk)) {
231 } else if (const auto node_texture = std::dynamic_pointer_cast<NodeTextureBuffer>(vk)) {
233 }
234
235 auto& loom = TextureLoom::instance();
236 if (!loom.is_initialized()) {
238 "DataReadProcessor texture pixel reads require an initialized TextureLoom");
239 return false;
240 }
241
242 const auto format = TextureLoom::readable_format(
image);
245 "DataReadProcessor texture pixel reads require an initialized TextureBuffer or NodeTextureBuffer "
246 "image that is a single-layer 2D image with a mapped format and transfer-source usage");
247 return false;
248 }
249
250 const auto original_layout =
image->get_current_layout();
251 if (original_layout != vk::ImageLayout::eShaderReadOnlyOptimal
252 && original_layout != vk::ImageLayout::eGeneral) {
254 "DataReadProcessor texture image has no readable pixel data");
255 return false;
256 }
257
258 const size_t byte_count = TextureLoom::calculate_image_size(
260 if (!self.m_texture_staging || self.m_texture_staging->get_size_bytes() < byte_count) {
262 }
263
264 vk::PipelineStageFlags restore_stage = vk::PipelineStageFlagBits::eFragmentShader;
265 if (original_layout == vk::ImageLayout::eGeneral) {
266 restore_stage |= vk::PipelineStageFlagBits::eComputeShader;
267 }
268
269 pending.image = loom.download_image(
image, self.m_texture_staging, original_layout, restore_stage);
270 return pending.image.has_value();
271 });
272}
#define MF_RT_ERROR(comp, ctx,...)
std::shared_ptr< VKBuffer > create_image_staging_buffer(size_t size)
Allocate a persistent host-visible staging buffer sized for repeated streaming uploads to an image of...
std::shared_ptr< Core::VKImage > resolve_gpu_image(const T &buffer)
Resolve the GPU-resident image from any GpuImageSource buffer.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.