Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
gpu_audio_program.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <type_traits>
5
7
8namespace pulp::gpu_audio {
9
15enum class GpuAudioProgramKind : std::uint8_t {
19 Neural = 3,
20 Custom = 255,
21};
22
41static_assert(static_cast<std::uint32_t>(GpuAudioTerminalDisposition::kCount) ==
43 "GpuAudioStatus::terminal_counts must cover every terminal disposition");
44static_assert(static_cast<std::uint32_t>(GpuAudioTerminalDisposition::GpuDelivered) == 1 &&
45 static_cast<std::uint32_t>(GpuAudioTerminalDisposition::CpuFallback) == 2,
46 "validate_gpu_audio_status indexes terminal_counts by these values");
47
51enum class GpuAudioProgramError : std::uint8_t {
52 None = 0,
67 // The descriptor is valid in isolation, but the prepared transport did
68 // not authenticate the same path/provider contract. These values are
69 // appended so the existing wire/debug values remain stable.
77 // A descriptor enum outside its declared domain, and a capability report
78 // that agrees with the descriptor but is not self-consistent (see
79 // validate_gpu_audio_capability). Appended like the values above.
82 // A staged or shared-memory descriptor naming the CPU provider, which
83 // validate_gpu_audio_capability() rejects as CpuProviderOnGpuPath, so
84 // such a program could never bind. Appended.
86};
87
111
119
121constexpr GpuAudioProgramValidation
123 const auto kind = program.kind;
127 static_cast<std::uint8_t>(program.path) >
128 static_cast<std::uint8_t>(GpuAudioExecutionPath::Cpu) ||
129 static_cast<std::uint8_t>(program.provider) >
130 static_cast<std::uint8_t>(GpuAudioProvider::Cpu) ||
131 static_cast<int>(program.miss_policy) < 0 ||
132 static_cast<int>(program.miss_policy) > static_cast<int>(MissPolicy::CpuFallback))
134 if (program.kind == GpuAudioProgramKind::Unknown)
136 if (program.channels == 0 || program.block_size == 0 || program.sample_rate == 0)
138 if (program.miss_policy == MissPolicy::CpuFallback && !program.cpu_fallback_prepared)
140
141 if (program.path == GpuAudioExecutionPath::Unavailable)
143
144 if (program.path == GpuAudioExecutionPath::Staged ||
145 program.path == GpuAudioExecutionPath::SharedMemory) {
146 if (program.algorithmic_lead_blocks == 0)
148 if (program.pipeline_depth == 0)
150 if (program.pipeline_depth <= program.algorithmic_lead_blocks)
152 if (program.provider_slots == 0)
154 }
155
156 if ((program.path == GpuAudioExecutionPath::Staged ||
157 program.path == GpuAudioExecutionPath::SharedMemory) &&
158 program.provider == GpuAudioProvider::Cpu)
160
161 if (program.path == GpuAudioExecutionPath::SharedMemory) {
162 if (program.provider == GpuAudioProvider::Unknown)
164 if (!program.provider_owned_resources)
166 } else if (program.path == GpuAudioExecutionPath::Staged) {
167 if (program.provider_owned_resources)
169 } else {
170 if (program.provider != GpuAudioProvider::Unknown)
172 if (program.provider_owned_resources)
174 if (program.algorithmic_lead_blocks != 0 || program.pipeline_depth != 0 ||
175 program.provider_slots != 0)
177 }
178
179 return {};
180}
181
188constexpr GpuAudioProgramValidation
190 const GpuAudioCapabilityReport& capability) noexcept {
191 const auto descriptor = validate_gpu_audio_program(program);
192 if (!descriptor.accepted())
193 return descriptor;
194 if (!capability.prepared)
196 if (capability.eligibility != GpuAudioEligibility::Eligible)
198 if (capability.path != program.path)
200 if (capability.fallback_policy != program.miss_policy)
202 if (program.algorithmic_lead_blocks != capability.prepared_lead_blocks)
204 if (program.path == GpuAudioExecutionPath::SharedMemory &&
205 capability.provider != program.provider)
207 // A known descriptor provider must still be witnessed by the prepared
208 // capability for staged paths. Unknown is the honest generic staged
209 // value and remains valid when both sides leave identity unspecified.
210 if (program.path == GpuAudioExecutionPath::Staged &&
211 program.provider != GpuAudioProvider::Unknown && capability.provider != program.provider)
213 if (program.miss_policy == MissPolicy::CpuFallback && !capability.fallback_available)
215 // The checks above compare the two sides. A report can agree with the
216 // descriptor on every compared field and still contradict itself, for
217 // example an out-of-domain enum in a field the descriptor leaves Unknown.
218 if (!validate_gpu_audio_capability(capability).accepted())
220 return {};
221}
222
223static_assert(std::is_trivially_copyable_v<GpuAudioProgramDescriptor>);
224static_assert(std::is_trivially_copyable_v<GpuAudioProgramValidation>);
225
226} // namespace pulp::gpu_audio
Definition flow_pans.hpp:19
GpuAudioTerminalDisposition
One terminal audio disposition for an admitted block.
Definition gpu_audio_program.hpp:27
@ LateRejected
Definition gpu_audio_program.hpp:33
@ kCount
Not a disposition: the number of values above.
Definition gpu_audio_program.hpp:39
@ CpuFallback
Definition gpu_audio_program.hpp:30
@ Cancelled
Definition gpu_audio_program.hpp:35
@ StaleRejected
Definition gpu_audio_program.hpp:32
@ GpuDelivered
Definition gpu_audio_program.hpp:29
@ DeviceLost
Definition gpu_audio_program.hpp:34
constexpr GpuAudioCapabilityValidation validate_gpu_audio_capability(const GpuAudioCapabilityReport &capability) noexcept
Validate a capability snapshot.
Definition gpu_audio_capability.hpp:121
GpuAudioExecutionPath
The transport path selected for a prepared audio node.
Definition gpu_audio_capability.hpp:10
@ Staged
Definition gpu_audio_capability.hpp:12
@ Unavailable
Definition gpu_audio_capability.hpp:11
@ Cpu
A prepared CPU implementation with no GPU provider resources.
Definition gpu_audio_capability.hpp:16
@ SharedMemory
Definition gpu_audio_capability.hpp:13
@ Eligible
Definition gpu_audio_capability.hpp:34
MissPolicy
What the transport does for a block when the GPU result is not ready in time (the worker fell behind,...
Definition gpu_audio_node.hpp:12
@ CpuFallback
Run the node's CPU fallback for the missed block.
Definition gpu_audio_node.hpp:38
@ Silence
Output silence for the missed block (+ telemetry).
Definition gpu_audio_node.hpp:15
@ InvalidEnumValue
Definition gpu_audio_capability.hpp:76
@ None
Definition gpu_audio_capability.hpp:75
@ CpuProviderOnGpuPath
Definition gpu_audio_capability.hpp:81
GpuAudioProvider
Provider identity when the selected path can establish it without exposing backend handles.
Definition gpu_audio_capability.hpp:21
@ Cpu
A CPU implementation with no GPU provider.
Definition gpu_audio_capability.hpp:27
@ Unknown
Definition gpu_audio_capability.hpp:22
GpuAudioProgramKind
The typed workload family selected during host-side preparation.
Definition gpu_audio_program.hpp:15
@ Unknown
Definition gpu_audio_program.hpp:16
@ Custom
Definition gpu_audio_program.hpp:20
@ Neural
Definition gpu_audio_program.hpp:19
@ Spectral
Definition gpu_audio_program.hpp:18
@ Convolution
Definition gpu_audio_program.hpp:17
GpuAudioProgramError
Why a prepared program descriptor was rejected.
Definition gpu_audio_program.hpp:51
@ InvalidEnumValue
Definition gpu_audio_program.hpp:80
@ CapabilityLeadMismatch
Definition gpu_audio_program.hpp:74
@ CapabilityPathMismatch
Definition gpu_audio_program.hpp:72
@ ProviderOnCpu
Definition gpu_audio_program.hpp:64
@ MissingPipelineDepth
Definition gpu_audio_program.hpp:57
@ CpuFallbackNotPrepared
Definition gpu_audio_program.hpp:66
@ ProviderResourcesOnCpu
Definition gpu_audio_program.hpp:62
@ CapabilityFallbackUnavailable
Definition gpu_audio_program.hpp:76
@ InsufficientPipelineDepth
Definition gpu_audio_program.hpp:58
@ CapabilityProviderMismatch
Definition gpu_audio_program.hpp:73
@ InvalidShape
Definition gpu_audio_program.hpp:54
@ CapabilityIneligible
Definition gpu_audio_program.hpp:71
@ CpuPipelineOnCpu
Definition gpu_audio_program.hpp:65
@ None
Definition gpu_audio_program.hpp:52
@ MissingProviderSlots
Definition gpu_audio_program.hpp:59
@ CapabilityFallbackPolicyMismatch
Definition gpu_audio_program.hpp:75
@ MissingProviderIdentity
Definition gpu_audio_program.hpp:60
@ MissingKind
Definition gpu_audio_program.hpp:53
@ ProviderResourcesOnStaged
Definition gpu_audio_program.hpp:63
@ CapabilityNotPrepared
Definition gpu_audio_program.hpp:70
@ ProviderResourcesNotOwned
Definition gpu_audio_program.hpp:61
@ PathUnavailable
Definition gpu_audio_program.hpp:55
@ MissingAlgorithmicLead
Definition gpu_audio_program.hpp:56
@ CpuProviderOnGpuPath
Definition gpu_audio_program.hpp:85
@ CapabilityInvalid
Definition gpu_audio_program.hpp:81
constexpr GpuAudioProgramValidation validate_gpu_audio_program(const GpuAudioProgramDescriptor &program) noexcept
Validate the backend-neutral prepared-program contract.
Definition gpu_audio_program.hpp:122
Backend-neutral, allocation-free capability snapshot for installed SDK consumers.
Definition gpu_audio_capability.hpp:46
Backend-neutral metadata for a typed program prepared for a fixed audio stream.
Definition gpu_audio_program.hpp:97
GpuAudioExecutionPath path
Definition gpu_audio_program.hpp:99
GpuAudioProgramKind kind
Definition gpu_audio_program.hpp:98
std::uint32_t channels
Definition gpu_audio_program.hpp:102
GpuAudioProvider provider
Definition gpu_audio_program.hpp:100
std::uint32_t provider_slots
Definition gpu_audio_program.hpp:107
std::uint32_t pipeline_depth
Definition gpu_audio_program.hpp:106
bool provider_owned_resources
Definition gpu_audio_program.hpp:108
std::uint32_t block_size
Definition gpu_audio_program.hpp:103
std::uint32_t sample_rate
Definition gpu_audio_program.hpp:104
MissPolicy miss_policy
Definition gpu_audio_program.hpp:101
bool cpu_fallback_prepared
Definition gpu_audio_program.hpp:109
std::uint32_t algorithmic_lead_blocks
Definition gpu_audio_program.hpp:105
Definition gpu_audio_program.hpp:112
constexpr bool accepted() const noexcept
Definition gpu_audio_program.hpp:115
GpuAudioProgramError error
Definition gpu_audio_program.hpp:113
static constexpr std::uint32_t kTerminalDispositionCount
Number of GpuAudioTerminalDisposition values counted by terminal_counts.
Definition gpu_audio_status.hpp:84