use dear_imgui_rs::{ContextId, NativeWindowTarget, render::SnapshotEpoch};
use crate::WgpuDrawDependencies;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct WgpuFrameScope {
pub context_id: ContextId,
pub epoch: Option<SnapshotEpoch>,
pub frame_count: usize,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum WgpuFrameSkipReason {
ZeroSize,
NoDrawData,
NoDrawCommands,
Timeout,
Outdated,
Lost,
Occluded,
RetiredTarget,
TargetBusy,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct WgpuDrawRecording {
pub scope: WgpuFrameScope,
pub dependencies: WgpuDrawDependencies,
pub recorded: bool,
pub skip_reason: Option<WgpuFrameSkipReason>,
}
impl WgpuDrawRecording {
pub(crate) fn skipped(scope: WgpuFrameScope, reason: WgpuFrameSkipReason) -> Self {
Self {
scope,
dependencies: WgpuDrawDependencies::default(),
recorded: false,
skip_reason: Some(reason),
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
pub enum WgpuFrameStage {
Unrecorded,
Recorded,
Submitted,
PresentationRequested,
}
#[derive(Clone, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum WgpuFrameOutcome {
Observed,
Skipped(WgpuFrameSkipReason),
Discarded,
Failed {
operation: &'static str,
message: String,
},
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct WgpuViewportObservation {
pub target: NativeWindowTarget,
pub scope: WgpuFrameScope,
pub dependencies: WgpuDrawDependencies,
pub stage: WgpuFrameStage,
pub outcome: WgpuFrameOutcome,
}
impl WgpuViewportObservation {
#[cfg(any(feature = "multi-viewport-winit", feature = "multi-viewport-sdl3"))]
pub(crate) fn from_recording(target: NativeWindowTarget, recording: WgpuDrawRecording) -> Self {
Self {
target,
scope: recording.scope,
dependencies: recording.dependencies,
stage: if recording.recorded {
WgpuFrameStage::Recorded
} else {
WgpuFrameStage::Unrecorded
},
outcome: recording
.skip_reason
.map_or(WgpuFrameOutcome::Observed, WgpuFrameOutcome::Skipped),
}
}
}