MayaFlux 1.0.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 109 of file GpuDispatchCore.cpp.

112{
113 const auto& key = dispatch_key();
114
115 flatten_channels_to_staging(channels, structure_info);
116 const size_t float_byte_size = m_staging_floats.size() * sizeof(float);
117
118 const size_t fallback_bytes = float_byte_size > 0
119 ? float_byte_size
120 : Kakshya::ContainerDataStructure::get_total_elements(structure_info.dimensions) * sizeof(float);
121
122 std::vector<GpuResourceManager::ImageBind> image_binds;
123
124 for (auto b : m_bindings) {
125 const size_t idx = b.binding;
126
127 if (idx < m_binding_data.size() && !m_binding_data[idx].empty()) {
129 m_resources.upload_raw(key, idx, m_binding_data[idx].data(), m_binding_data[idx].size());
130 continue;
131 }
132
133 if (b.direction == GpuBufferBinding::Direction::OUTPUT) {
134 const auto et = b.element_type;
137 } else {
138 const size_t sz = (idx < m_output_size_overrides.size() && m_output_size_overrides[idx] > 0)
140 : fallback_bytes;
141 m_resources.ensure_buffer(key, idx, sz);
142 if (idx < m_output_size_overrides.size() && m_output_size_overrides[idx] > 0) {
143 std::vector<uint8_t> zeros(sz, 0);
144 m_resources.upload_raw(key, idx, zeros.data(), sz);
145 }
146 continue;
147 }
148 }
149
150 switch (b.element_type) {
152 if (idx < m_passthrough_bytes.size() && !m_passthrough_bytes[idx].empty()) {
154 m_resources.upload_raw(key, idx, m_passthrough_bytes[idx].data(),
156 }
157 break;
158
160 if (idx >= m_image_bindings.size() || !m_image_bindings[idx].image)
161 continue;
162 auto& img = m_image_bindings[idx].image;
163 if (img->get_current_layout() != vk::ImageLayout::eGeneral) {
164 m_resources.transition_image(img, img->get_current_layout(),
165 vk::ImageLayout::eGeneral);
166 }
167 image_binds.push_back({ .index = idx, .image = img, .sampler = nullptr, .spec = b });
168 } break;
169
171 if (idx >= m_image_bindings.size() || !m_image_bindings[idx].image)
172 continue;
173 auto& img = m_image_bindings[idx].image;
174 auto sampler = m_image_bindings[idx].sampler;
175 if (img->get_current_layout() != vk::ImageLayout::eShaderReadOnlyOptimal) {
176 m_resources.transition_image(img, img->get_current_layout(),
177 vk::ImageLayout::eShaderReadOnlyOptimal);
178 }
179 image_binds.push_back({ .index = idx, .image = img, .sampler = sampler, .spec = b });
180 } break;
181
184 if (!channels.empty()) {
185 const size_t raw_bytes = channels[0].size()
187 ? sizeof(uint32_t)
188 : sizeof(int32_t));
189 m_resources.ensure_buffer(key, idx, raw_bytes);
190 m_resources.upload_raw(key, idx,
191 reinterpret_cast<const uint8_t*>(channels[0].data()),
192 raw_bytes);
193 }
194 break;
195
197 default:
198 if (!m_native_staging_bytes.empty()) {
201 } else {
202 m_resources.ensure_buffer(key, idx, float_byte_size);
203 m_resources.upload(key, idx, m_staging_floats.data(), float_byte_size);
204 }
205 break;
206 }
207 }
208
209 if (!image_binds.empty())
210 m_resources.bind_images_batch(key, image_binds);
211}
bool size
size_t b
uint32_t channels
std::vector< ImageBinding > m_image_bindings
std::vector< uint8_t > m_native_staging_bytes
Native-typed staging buffer.
const std::string & dispatch_key() const
The key used for this context's GpuResourceManager unit.
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 bind_images_batch(const std::string &key, const std::vector< ImageBind > &images)
Bind every image in one Vulkan call.
void upload(const std::string &key, size_t index, const float *data, size_t byte_size)
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(const std::string &key, size_t index, size_t required_bytes, Portal::Graphics::BufferUsageHint usage_hint=Portal::Graphics::BufferUsageHint::COMPUTE_STORAGE)
void upload_raw(const std::string &key, size_t index, const uint8_t *data, size_t byte_size)
enum MayaFlux::Portal::Graphics::GpuBufferBinding::ElementType FLOAT32

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

Referenced by dispatch_core(), dispatch_core_async(), dispatch_core_chained(), dispatch_core_chained_indirect(), and prepare_dependency().

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