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

◆ prepare_gpu_inputs()

void MayaFlux::Yantra::GpuDispatchCore::prepare_gpu_inputs ( const std::vector< std::vector< double > > &  channels,
const DataStructureInfo structure_info 
)
protectedvirtual

Marshal channel data into GPU input buffers.

Handles FLOAT32, UINT32, INT32, PASSTHROUGH, IMAGE_STORAGE, and IMAGE_SAMPLED binding kinds. Called after flatten_channels_to_staging.

Definition at line 101 of file GpuDispatchCore.cpp.

104{
105 flatten_channels_to_staging(channels, structure_info);
106 const size_t float_byte_size = m_staging_floats.size() * sizeof(float);
107
108 const size_t fallback_bytes = float_byte_size > 0
109 ? float_byte_size
110 : Kakshya::ContainerDataStructure::get_total_elements(structure_info.dimensions) * sizeof(float);
111
112 for (size_t i = 0; i < m_bindings.size(); ++i) {
113 const auto& b = m_bindings[i];
114
115 if (i < m_binding_data.size() && !m_binding_data[i].empty()) {
117 m_resources.upload_raw(i, m_binding_data[i].data(), m_binding_data[i].size());
118 continue;
119 }
120
121 if (b.direction == GpuBufferBinding::Direction::OUTPUT) {
122 const auto et = b.element_type;
125 } else {
126 const size_t sz = (i < m_output_size_overrides.size() && m_output_size_overrides[i] > 0)
128 : fallback_bytes;
130 if (i < m_output_size_overrides.size() && m_output_size_overrides[i] > 0) {
131 std::vector<uint8_t> zeros(sz, 0);
132 m_resources.upload_raw(i, zeros.data(), sz);
133 }
134 continue;
135 }
136 }
137
138 switch (b.element_type) {
140 if (i < m_passthrough_bytes.size() && !m_passthrough_bytes[i].empty()) {
144 }
145 break;
146
148 if (i >= m_image_bindings.size() || !m_image_bindings[i].image)
149 continue;
150 auto& img = m_image_bindings[i].image;
151 if (img->get_current_layout() != vk::ImageLayout::eGeneral) {
152 m_resources.transition_image(img, img->get_current_layout(),
153 vk::ImageLayout::eGeneral);
154 }
156 } break;
157
159 if (i >= m_image_bindings.size() || !m_image_bindings[i].image)
160 continue;
161 auto& img = m_image_bindings[i].image;
162 auto sampler = m_image_bindings[i].sampler;
163 if (img->get_current_layout() != vk::ImageLayout::eShaderReadOnlyOptimal) {
164 m_resources.transition_image(img, img->get_current_layout(),
165 vk::ImageLayout::eShaderReadOnlyOptimal);
166 }
167 m_resources.bind_image_sampled(i, img, sampler, b);
168 } break;
169
172 if (!channels.empty()) {
173 const size_t raw_bytes = channels[0].size()
175 ? sizeof(uint32_t)
176 : sizeof(int32_t));
177 m_resources.ensure_buffer(i, raw_bytes);
179 reinterpret_cast<const uint8_t*>(channels[0].data()),
180 raw_bytes);
181 }
182 break;
183
185 default:
186 m_resources.ensure_buffer(i, float_byte_size);
187 m_resources.upload(i, m_staging_floats.data(), float_byte_size);
188 break;
189 }
190 }
191}
size_t b
Range size
std::vector< ImageBinding > m_image_bindings
std::vector< std::vector< uint8_t > > m_binding_data
std::vector< GpuBufferBinding > m_bindings
std::vector< size_t > m_output_size_overrides
std::vector< std::vector< uint8_t > > m_passthrough_bytes
void flatten_channels_to_staging(const std::vector< std::vector< double > > &channels, const DataStructureInfo &structure_info)
Flatten planar double channels into m_staging_floats.
void upload_raw(size_t index, const uint8_t *data, size_t byte_size)
void upload(size_t index, const float *data, size_t byte_size)
void bind_image_storage(size_t index, const std::shared_ptr< Core::VKImage > &image, const GpuBufferBinding &spec)
Bind a storage image descriptor at the given slot index.
void bind_image_sampled(size_t index, const std::shared_ptr< Core::VKImage > &image, vk::Sampler sampler, const GpuBufferBinding &spec)
Bind a combined image+sampler descriptor at the given slot index.
void transition_image(const std::shared_ptr< Core::VKImage > &image, vk::ImageLayout old_layout, vk::ImageLayout new_layout)
Transition a VKImage layout via an immediate command submission.
void ensure_buffer(size_t index, size_t required_bytes)

References b, MayaFlux::Yantra::GpuResourceManager::bind_image_sampled(), MayaFlux::Yantra::GpuResourceManager::bind_image_storage(), MayaFlux::Yantra::DataStructureInfo::dimensions, MayaFlux::Yantra::GpuResourceManager::ensure_buffer(), flatten_channels_to_staging(), MayaFlux::Yantra::GpuBufferBinding::FLOAT32, MayaFlux::Kakshya::ContainerDataStructure::get_total_elements(), MayaFlux::Yantra::GpuBufferBinding::IMAGE_SAMPLED, MayaFlux::Yantra::GpuBufferBinding::IMAGE_STORAGE, MayaFlux::Yantra::GpuBufferBinding::INT32, m_binding_data, m_bindings, m_image_bindings, m_output_size_overrides, m_passthrough_bytes, m_resources, m_staging_floats, MayaFlux::Yantra::GpuBufferBinding::OUTPUT, MayaFlux::Yantra::GpuBufferBinding::PASSTHROUGH, size, MayaFlux::Yantra::GpuResourceManager::transition_image(), MayaFlux::Yantra::GpuBufferBinding::UINT32, MayaFlux::Yantra::GpuResourceManager::upload(), and MayaFlux::Yantra::GpuResourceManager::upload_raw().

Referenced by dispatch_core(), and dispatch_core_chained().

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