15 const std::shared_ptr<Buffer>& buffer,
21 .transfer_processor =
nullptr,
23 .reason =
"Null buffer provided"
27 if (
auto audio = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
31 if (
auto vk = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
37 .transfer_processor =
nullptr,
39 .reason =
"Unknown buffer type"
44 const std::shared_ptr<Buffer>& buffer,
46 const std::shared_ptr<Buffer>& transfer_target,
49 auto source_decision =
distribute(buffer, requested_token);
51 return source_decision;
54 return decide_transfer(buffer, requested_token, transfer_target, transfer_target_token);
104 const std::shared_ptr<AudioBuffer>& audio,
110 .transfer_processor =
nullptr,
112 .reason =
"AudioBuffer requires SAMPLE_RATE token with CPU or GPU device"
118 audio->force_internal_usage(
true);
121 .transfer_processor =
nullptr,
123 .reason =
"Audio buffer with GPU processing marked internal"
129 audio->force_internal_usage(
false);
132 .transfer_processor =
nullptr,
134 .reason =
"Audio buffer registered to root"
140 .transfer_processor =
nullptr,
142 .reason =
"AudioBuffer token combination not handled"
147 const std::shared_ptr<VKBuffer>& vk,
153 .transfer_processor =
nullptr,
155 .reason =
"VKBuffer requires GPU_PPOCESS token without CPU_PROCESS"
163 .transfer_processor =
nullptr,
165 .reason =
"GPU buffer registered to graphics root"
171 vk->force_internal_usage(
true);
174 .transfer_processor =
nullptr,
176 .reason =
"GPU buffer at audio rate marked internal (awaiting transfer)"
182 .transfer_processor =
nullptr,
184 .reason =
"VKBuffer token combination not handled"
193 const std::shared_ptr<Buffer>& source,
195 const std::shared_ptr<Buffer>& target,
198 if (source == target && src_token == tgt_token) {
202 auto audio_src = std::dynamic_pointer_cast<AudioBuffer>(source);
203 auto audio_tgt = std::dynamic_pointer_cast<AudioBuffer>(target);
204 auto vk_src = std::dynamic_pointer_cast<VKBuffer>(source);
205 auto vk_tgt = std::dynamic_pointer_cast<VKBuffer>(target);
208 if (audio_src && vk_tgt) {
217 if (vk_src && audio_tgt) {
226 if (audio_src && audio_tgt) {
235 if (vk_src && vk_tgt) {
245 const std::shared_ptr<Buffer>& source,
247 const std::shared_ptr<Buffer>& target,
250 auto audio_src = std::dynamic_pointer_cast<AudioBuffer>(source);
251 auto audio_tgt = std::dynamic_pointer_cast<AudioBuffer>(target);
252 auto vk_src = std::dynamic_pointer_cast<VKBuffer>(source);
253 auto vk_tgt = std::dynamic_pointer_cast<VKBuffer>(target);
262 if (!
can_transfer(source, src_token, target, tgt_token)) {
265 .transfer_processor =
nullptr,
267 .reason =
"Transfer not supported between these buffer types and tokens"
271 std::shared_ptr<TransferProcessor> processor;
274 if (audio_src && vk_tgt) {
276 processor = std::make_shared<TransferProcessor>(audio_src, vk_tgt, direction);
277 }
else if (vk_src && audio_tgt) {
279 processor = std::make_shared<TransferProcessor>(audio_tgt, vk_src, direction);
280 }
else if (audio_src && audio_tgt) {
282 processor = std::make_shared<TransferProcessor>();
283 processor->connect_audio_to_gpu(audio_src,
nullptr);
284 }
else if (vk_src && vk_tgt) {
286 processor = std::make_shared<TransferProcessor>();
292 .transfer_processor =
nullptr,
294 .reason =
"Failed to create transfer processor"
299 audio_tgt->force_internal_usage(
false);
304 .transfer_processor = processor,
305 .transfer_direction = tgt_token,
306 .reason =
"Transfer processor created"
static MayaFlux::Nodes::ProcessingToken token
static bool has_frame_rate(ProcessingToken token)
static bool can_transfer(const std::shared_ptr< Buffer > &source, ProcessingToken src_token, const std::shared_ptr< Buffer > &target, ProcessingToken tgt_token)
static bool is_valid_vk_token(ProcessingToken token)
static bool is_valid_audio_token(ProcessingToken token)
static DistributionDecision decide_transfer(const std::shared_ptr< Buffer > &source, ProcessingToken src_token, const std::shared_ptr< Buffer > &target, ProcessingToken tgt_token)
static DistributionDecision distribute(const std::shared_ptr< Buffer > &buffer, ProcessingToken requested_token)
Distribute a buffer based on its type and requested token.
static bool has_gpu(ProcessingToken token)
static DistributionDecision decide_vk_buffer(const std::shared_ptr< VKBuffer > &vk, ProcessingToken token)
static DistributionDecision distribute_with_transfer(const std::shared_ptr< Buffer > &buffer, ProcessingToken requested_token, const std::shared_ptr< Buffer > &transfer_target, ProcessingToken transfer_target_token)
Distribute with optional transfer target (for cross-domain routing)
static DistributionDecision decide_audio_buffer(const std::shared_ptr< AudioBuffer > &audio, ProcessingToken token)
static bool has_cpu(ProcessingToken token)
static bool has_sample_rate(ProcessingToken token)
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ CPU_PROCESS
Executes processing operations on CPU threads.
@ AUDIO_BACKEND
Standard audio processing backend configuration.
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
@ FRAME_RATE
Processes data at video frame rate.
@ GPU_PPOCESS
Executes processing operations on GPU hardware.
@ AUDIO_PARALLEL
High-performance audio processing with GPU acceleration.
TransferDirection
Specifies the direction of data transfer.
DistributionResult result
Routing decision for a buffer with a given token.