Skip to main content

pulse_pixelstream_types/
previs_dlss.rs

1use myko::prelude::*;
2use myko::TS;
3use myko_macros::myko_item;
4use serde::{Deserialize, Serialize};
5
6#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, TS)]
7#[serde(rename_all = "snake_case")]
8pub enum DlssReconstruction {
9    SuperResolution,
10    RayReconstruction,
11}
12
13#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, TS)]
14#[serde(rename_all = "snake_case")]
15pub enum DlssQuality {
16    Unmanaged,
17    Auto,
18    UltraPerformance,
19    Performance,
20    Balanced,
21    Quality,
22    UltraQuality,
23    Dlaa,
24}
25
26#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TS)]
27#[serde(tag = "state", rename_all = "snake_case", deny_unknown_fields)]
28pub enum DlssSettings {
29    Disabled,
30    Enabled {
31        reconstruction: DlssReconstruction,
32        quality: DlssQuality,
33    },
34}
35
36#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TS)]
37#[serde(rename_all = "camelCase")]
38pub struct PrevisProcessTarget {
39    pub cluster_name: String,
40    pub deployment_generation: u64,
41    pub host: String,
42    pub process_id: u32,
43    #[serde(default)]
44    pub process_started_at: Option<String>,
45    pub process_generation: u64,
46}
47
48#[myko_item]
49pub struct PrevisDlssRequest {
50    pub streamer_id: String,
51    pub request_id: String,
52    pub target: PrevisProcessTarget,
53    pub settings: DlssSettings,
54    #[serde(default)]
55    pub requested_at_ms: u64,
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[test]
63    fn process_target_keeps_the_process_start_fence() {
64        let target: PrevisProcessTarget = serde_json::from_value(serde_json::json!({
65            "clusterName": "12of12",
66            "deploymentGeneration": 42,
67            "host": "render-13",
68            "processId": 4100,
69            "processGeneration": 42,
70            "processStartedAt": "2026-09-05T02:59:06+00:00"
71        }))
72        .unwrap();
73
74        assert_eq!(
75            target.process_started_at.as_deref(),
76            Some("2026-09-05T02:59:06+00:00")
77        );
78    }
79
80    #[test]
81    fn legacy_process_target_replays_without_the_process_start_fence() {
82        let target: PrevisProcessTarget = serde_json::from_value(serde_json::json!({
83            "clusterName": "12of12",
84            "deploymentGeneration": 42,
85            "host": "render-13",
86            "processId": 4100,
87            "processGeneration": 42
88        }))
89        .unwrap();
90
91        assert_eq!(target.process_started_at, None);
92    }
93
94    #[test]
95    fn settings_round_trip_without_optional_field_states() {
96        for settings in [
97            DlssSettings::Disabled,
98            DlssSettings::Enabled {
99                reconstruction: DlssReconstruction::RayReconstruction,
100                quality: DlssQuality::Quality,
101            },
102        ] {
103            let encoded = serde_json::to_value(&settings).unwrap();
104            assert_eq!(
105                serde_json::from_value::<DlssSettings>(encoded).unwrap(),
106                settings
107            );
108        }
109        assert_eq!(
110            serde_json::to_value(DlssSettings::Disabled).unwrap(),
111            serde_json::json!({ "state": "disabled" })
112        );
113    }
114}