MayaFlux 0.5.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 for (auto b : m_bindings) {
123 const size_t idx = b.binding;
124
125 if (idx < m_binding_data.size() && !m_binding_data[idx].empty()) {
126 m_resources.ensure_buffer(key, idx, m_binding_data[idx].size());
127 m_resources.upload_raw(key, idx, m_binding_data[idx].data(), m_binding_data[idx].size());
128 continue;
129 }
130
131 if (b.direction == GpuBufferBinding::Direction::OUTPUT) {
132 const auto et = b.element_type;
135 } else {
136 const size_t sz = (idx < m_output_size_overrides.size() && m_output_size_overrides[idx] > 0)
138 : fallback_bytes;
139 m_resources.ensure_buffer(key, idx, sz);
140 if (idx < m_output_size_overrides.size() && m_output_size_overrides[idx] > 0) {
141 std::vector<uint8_t> zeros(sz, 0);
142 m_resources.upload_raw(key, idx, zeros.data(), sz);
143 }
144 continue;
145 }
146 }
147
148 switch (b.element_type) {
150 if (idx < m_passthrough_bytes.size() && !m_passthrough_bytes[idx].empty()) {
151 m_resources.ensure_buffer(key, idx, m_passthrough_bytes[idx].size());
152 m_resources.upload_raw(key, idx, m_passthrough_bytes[idx].data(),
153 m_passthrough_bytes[idx].size());
154 }
155 break;
156
158 if (idx >= m_image_bindings.size() || !m_image_bindings[idx].image)
159 continue;
160 auto& img = m_image_bindings[idx].image;
161 if (img->get_current_layout() != vk::ImageLayout::eGeneral) {
162 m_resources.transition_image(img, img->get_current_layout(),
163 vk::ImageLayout::eGeneral);
164 }
165 m_resources.bind_image_storage(key, idx, img, b);
166 } break;
167
169 if (idx >= m_image_bindings.size() || !m_image_bindings[idx].image)
170 continue;
171 auto& img = m_image_bindings[idx].image;
172 auto sampler = m_image_bindings[idx].sampler;
173 if (img->get_current_layout() != vk::ImageLayout::eShaderReadOnlyOptimal) {
174 m_resources.transition_image(img, img->get_current_layout(),
175 vk::ImageLayout::eShaderReadOnlyOptimal);
176 }
177 m_resources.bind_image_sampled(key, idx, img, sampler, b);
178 } break;
179
182 if (!channels.empty()) {
183 const size_t raw_bytes = channels[0].size()
185 ? sizeof(uint32_t)
186 : sizeof(int32_t));
187 m_resources.ensure_buffer(key, idx, raw_bytes);
188 m_resources.upload_raw(key, idx,
189 reinterpret_cast<const uint8_t*>(channels[0].data()),
190 raw_bytes);
191 }
192 break;
193
195 default:
196 if (!m_native_staging_bytes.empty()) {
199 } else {
200 m_resources.ensure_buffer(key, idx, float_byte_size);
201 m_resources.upload(key, idx, m_staging_floats.data(), float_byte_size);
202 }
203 break;
204 }
205 }
206}
size_t b
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_image_sampled(const std::string &key, 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 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)
void bind_image_storage(const std::string &key, size_t index, const std::shared_ptr< Core::VKImage > &image, const GpuBufferBinding &spec)
Bind a storage image descriptor at the given slot index.
enum MayaFlux::Portal::Graphics::GpuBufferBinding::ElementType FLOAT32

References b, MayaFlux::Yantra::GpuResourceManager::bind_image_sampled(), MayaFlux::Yantra::GpuResourceManager::bind_image_storage(), 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, 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 dispatch_core_dependency().

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