120constexpr GpuAudioCapabilityValidation
124 if (
static_cast<std::uint8_t
>(capability.path) >
static_cast<std::uint8_t
>(Path::Cpu) ||
125 static_cast<std::uint8_t
>(capability.provider) >
127 static_cast<std::uint8_t
>(capability.eligibility) >
129 static_cast<int>(capability.fallback_policy) < 0 ||
131 static_cast<std::uint8_t
>(capability.recovery_policy) >
133 return {Error::InvalidEnumValue};
135 if (!capability.prepared) {
136 if (capability.path != Path::Unavailable ||
140 capability.prepared_lead_blocks != 0 || capability.fallback_available ||
141 capability.diagnostics_available || capability.prepared_latency_blocks != 0 ||
142 capability.gpu_kernel_available ||
144 return {Error::UnpreparedStateHasPreparation};
148 if (capability.path == Path::Unavailable)
149 return {Error::PreparedPathUnavailable};
151 return {Error::PreparedPathIneligible};
152 if (capability.path == Path::Cpu) {
154 return {Error::CpuPathWithoutCpuProvider};
155 if (capability.gpu_kernel_available)
156 return {Error::CpuPathWithGpuKernel};
158 return {Error::CpuProviderOnGpuPath};
160 if (capability.path == Path::SharedMemory && capability.prepared_lead_blocks == 0)
161 return {Error::SharedLeadMissing};
163 return {Error::FallbackUnavailable};
221constexpr GpuAudioStatusValidation
227 return {Error::SchemaVersionMismatch};
232 if (!engine_ok(status.requested_engine) || !engine_ok(status.selected_engine) ||
233 static_cast<std::uint8_t
>(status.provider_state) >
234 static_cast<std::uint8_t
>(State::Unavailable) ||
235 static_cast<std::uint8_t
>(status.provider) >
237 static_cast<int>(status.fallback_policy) < 0 ||
239 static_cast<std::uint8_t
>(status.recovery_reason) >
240 static_cast<std::uint8_t
>(Reason::SustainedDeadlineMisses) ||
241 static_cast<std::uint8_t
>(status.completion_mode) >
243 static_cast<std::uint8_t
>(status.shadow_mode) >
245 return {Error::InvalidEnumValue};
248 if ((status.recovery_reason == Reason::None) != (status.recovery_sequence == UINT64_MAX))
249 return {Error::RecoverySequenceMismatch};
252 (status.shadow_delivered_blocks != 0 || status.shadow_late_blocks != 0 ||
253 status.shadow_double_miss_blocks != 0 || status.shadow_inline_cost_pct != 0.0f))
254 return {Error::ShadowCountsWithoutShadow};
259 std::uint64_t terminal_total = 0;
260 for (
const auto count : status.terminal_counts) {
261 if (count > UINT64_MAX - terminal_total)
262 return {Error::TerminalCountsInconsistent};
263 terminal_total += count;
267 const auto gpu_delivered = status.terminal_counts[1];
268 const auto cpu_fallback = status.terminal_counts[2];
269 if (gpu_delivered > status.produced_blocks || cpu_fallback > status.fallback_blocks)
270 return {Error::TerminalCountsInconsistent};
274 (status.gpu_kernel_available || status.epoch != 0))
275 return {Error::CpuProviderWithGpuState};
277 if (status.provider_state == State::Uninitialized) {
278 if (status.recovery_reason != Reason::None)
279 return {Error::UninitializedStateHasRecovery};
282 status.block_size != 0 || status.latency_samples != 0 ||
283 status.prepared_lead_blocks != 0 || status.fallback_available ||
284 status.diagnostics_available)
285 return {Error::UninitializedStateHasPreparation};
289 if (status.sample_rate == 0 || status.block_size == 0)
290 return {Error::PreparedShapeMissing};
292 return {Error::ReadyWithoutEngine};
295 return {Error::GpuEngineWithoutProvider};
299 if ((status.provider_state == State::Degraded || status.provider_state == State::Unavailable) &&
301 return {Error::DegradedOrUnavailableOnGpu};
302 if ((status.recovery_reason == Reason::ProviderLost ||
303 status.recovery_reason == Reason::ProviderUnresponsive) &&
304 status.provider_state != State::Unavailable)
305 return {Error::LostProviderNotUnavailable};
306 if (status.recovery_reason == Reason::SustainedDeadlineMisses &&
307 status.provider_state != State::Degraded)
308 return {Error::SustainedMissesNotDegraded};
313 if ((status.recovery_reason == Reason::SequenceGap ||
314 status.recovery_reason == Reason::InputSaturated ||
315 status.recovery_reason == Reason::ProviderFailure ||
316 status.recovery_reason == Reason::InvalidCallback ||
317 status.recovery_reason == Reason::OfflineFence) &&
318 status.provider_state == State::Ready)
319 return {Error::FencingCauseReportedReady};
323 if (status.epoch != 0 && !status.delivery_epoch_active && status.provider_state == State::Ready)
324 return {Error::ReadyWithoutDeliveryEpoch};
326 return {Error::FallbackUnavailable};
328 if (status.reacquire_successes > status.reacquire_attempts)
329 return {Error::ReacquireSuccessesExceedAttempts};
330 if (status.last_reacquire_to_gpu_ns != 0 && status.reacquire_successes == 0)
331 return {Error::ReacquireTimingWithoutSuccess};
332 if (status.recovery_reason == Reason::ProviderReacquired) {
333 if (status.reacquire_successes == 0)
334 return {Error::ReacquiredWithoutSuccess};
335 if (status.provider_state == State::Unavailable)
336 return {Error::ReacquiredNotDelivering};
342 return {Error::GpuEngineWithoutKernel};
Definition flow_pans.hpp:19
GpuAudioRecoveryPolicy
Whether a node may re-acquire a lost provider on its own.
Definition gpu_audio_capability.hpp:39
@ AutoReacquire
Definition gpu_audio_capability.hpp:41
@ Manual
Definition gpu_audio_capability.hpp:40
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
constexpr GpuAudioStatusValidation validate_gpu_audio_status(const GpuAudioStatus &status) noexcept
Validate a status snapshot taken at a quiescent point.
Definition gpu_audio_capability.hpp:222
GpuAudioStatusError
Why a host-visible status snapshot is inconsistent.
Definition gpu_audio_capability.hpp:176
@ ReacquiredNotDelivering
Definition gpu_audio_capability.hpp:196
@ PreparedShapeMissing
Definition gpu_audio_capability.hpp:183
@ ShadowCountsWithoutShadow
Definition gpu_audio_capability.hpp:190
@ LostProviderNotUnavailable
Definition gpu_audio_capability.hpp:187
@ UninitializedStateHasRecovery
Definition gpu_audio_capability.hpp:182
@ GpuEngineWithoutProvider
Definition gpu_audio_capability.hpp:185
@ CpuProviderWithGpuState
Definition gpu_audio_capability.hpp:189
@ GpuEngineWithoutKernel
Definition gpu_audio_capability.hpp:201
@ TerminalCountsInconsistent
Definition gpu_audio_capability.hpp:191
@ SchemaVersionMismatch
Definition gpu_audio_capability.hpp:178
@ DegradedOrUnavailableOnGpu
Definition gpu_audio_capability.hpp:186
@ None
Definition gpu_audio_capability.hpp:177
@ ReadyWithoutEngine
Definition gpu_audio_capability.hpp:184
@ UninitializedStateHasPreparation
Definition gpu_audio_capability.hpp:181
@ SustainedMissesNotDegraded
Definition gpu_audio_capability.hpp:188
@ ReacquireSuccessesExceedAttempts
Definition gpu_audio_capability.hpp:194
@ RecoverySequenceMismatch
Definition gpu_audio_capability.hpp:180
@ ReacquireTimingWithoutSuccess
Definition gpu_audio_capability.hpp:197
@ ReadyWithoutDeliveryEpoch
Definition gpu_audio_capability.hpp:207
@ FencingCauseReportedReady
Definition gpu_audio_capability.hpp:204
@ ReacquiredWithoutSuccess
Definition gpu_audio_capability.hpp:195
GpuAudioRecoveryReason
First latched reason that a node entered recovery.
Definition gpu_audio_status.hpp:40
GpuAudioEligibility
Eligibility of the configured transport path.
Definition gpu_audio_capability.hpp:32
@ Eligible
Definition gpu_audio_capability.hpp:34
@ Unavailable
Definition gpu_audio_capability.hpp:33
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
GpuAudioCapabilityError
Why a capability snapshot is not self-consistent.
Definition gpu_audio_capability.hpp:74
@ InvalidEnumValue
Definition gpu_audio_capability.hpp:76
@ PreparedPathUnavailable
Definition gpu_audio_capability.hpp:78
@ UnpreparedStateHasPreparation
Definition gpu_audio_capability.hpp:77
@ FallbackUnavailable
Definition gpu_audio_capability.hpp:84
@ None
Definition gpu_audio_capability.hpp:75
@ PreparedPathIneligible
Definition gpu_audio_capability.hpp:79
@ SharedLeadMissing
Definition gpu_audio_capability.hpp:83
@ CpuPathWithGpuKernel
Definition gpu_audio_capability.hpp:82
@ CpuProviderOnGpuPath
Definition gpu_audio_capability.hpp:81
@ CpuPathWithoutCpuProvider
Definition gpu_audio_capability.hpp:80
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
@ Dawn
Definition gpu_audio_capability.hpp:23
@ Unknown
Definition gpu_audio_capability.hpp:22
@ Metal
Definition gpu_audio_capability.hpp:24
GpuAudioEngine
The engine a host asked the audio provider to use.
Definition gpu_audio_status.hpp:16
@ Gpu
Definition gpu_audio_status.hpp:19
@ Unknown
Definition gpu_audio_status.hpp:17
@ Worker
Definition gpu_audio_status.hpp:73
@ None
Definition gpu_audio_status.hpp:71
GpuAudioProviderState
Lifecycle state suitable for UI, trace, and host diagnostics.
Definition gpu_audio_status.hpp:28
@ TimedWaitAny
Definition gpu_audio_status.hpp:64
Backend-neutral, allocation-free capability snapshot for installed SDK consumers.
Definition gpu_audio_capability.hpp:46
GpuAudioRecoveryPolicy recovery_policy
The recovery policy in effect, not the one configured: a transport configured for AutoReacquire repor...
Definition gpu_audio_capability.hpp:67
std::uint32_t prepared_latency_blocks
Definition gpu_audio_capability.hpp:60
GpuAudioEligibility eligibility
Definition gpu_audio_capability.hpp:49
bool gpu_kernel_available
Definition gpu_audio_capability.hpp:63
std::uint32_t prepared_lead_blocks
Definition gpu_audio_capability.hpp:53
GpuAudioProvider provider
Definition gpu_audio_capability.hpp:48
GpuAudioExecutionPath path
Definition gpu_audio_capability.hpp:47
bool prepared
Definition gpu_audio_capability.hpp:54
MissPolicy fallback_policy
Definition gpu_audio_capability.hpp:50
bool diagnostics_available
Definition gpu_audio_capability.hpp:56
bool fallback_available
Definition gpu_audio_capability.hpp:55
Definition gpu_audio_capability.hpp:87
constexpr bool accepted() const noexcept
Definition gpu_audio_capability.hpp:90
GpuAudioCapabilityError error
Definition gpu_audio_capability.hpp:88
Definition gpu_audio_capability.hpp:210
constexpr bool accepted() const noexcept
Definition gpu_audio_capability.hpp:213
GpuAudioStatusError error
Definition gpu_audio_capability.hpp:211
Versioned, allocation-free status shared by native hosts and UI adapters.
Definition gpu_audio_status.hpp:80
static constexpr std::uint32_t kSchemaVersion
Definition gpu_audio_status.hpp:81