From b53267fa8a1756fcf9f82e610234df820b9f2121 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Mon, 14 Jul 2025 15:11:39 +0200 Subject: [PATCH] head-management: add jay-vrr-mode-setter-v1 extension --- src/ifs/head_management.rs | 1 + .../head_management/head_management_macros.rs | 1 + src/ifs/head_management/jay_head_ext.rs | 1 + .../jay_head_ext_jay_vrr_mode_setter_v1.rs | 60 +++++++++++++++++++ .../jay_head_manager_session_v1.rs | 13 ++++ wire/jay_head_ext_jay_vrr_mode_setter_v1.txt | 15 +++++ ...ead_manager_ext_jay_vrr_mode_setter_v1.txt | 7 +++ 7 files changed, 98 insertions(+) create mode 100644 src/ifs/head_management/jay_head_ext/jay_head_ext_jay_vrr_mode_setter_v1.rs create mode 100644 wire/jay_head_ext_jay_vrr_mode_setter_v1.txt create mode 100644 wire/jay_head_manager_ext_jay_vrr_mode_setter_v1.txt diff --git a/src/ifs/head_management.rs b/src/ifs/head_management.rs index 006093fe..7ce6b5cd 100644 --- a/src/ifs/head_management.rs +++ b/src/ifs/head_management.rs @@ -127,6 +127,7 @@ enum HeadOp { SetScale(Scale), SetMode(usize), SetNonDesktopOverride(Option), + SetVrrMode(VrrMode), } #[derive(Copy, Clone, Debug, Eq, PartialEq, Default)] diff --git a/src/ifs/head_management/head_management_macros.rs b/src/ifs/head_management/head_management_macros.rs index 67ae0447..c4b36d3b 100644 --- a/src/ifs/head_management/head_management_macros.rs +++ b/src/ifs/head_management/head_management_macros.rs @@ -406,4 +406,5 @@ declare_extensions! { non_desktop_override_v1: NonDesktopOverrideV1, jay_vrr_mode_info_v1: JayVrrModeInfoV1, jay_tearing_mode_info_v1: JayTearingModeInfoV1, + jay_vrr_mode_setter_v1: JayVrrModeSetterV1, } diff --git a/src/ifs/head_management/jay_head_ext.rs b/src/ifs/head_management/jay_head_ext.rs index a217dbf9..345e5a24 100644 --- a/src/ifs/head_management/jay_head_ext.rs +++ b/src/ifs/head_management/jay_head_ext.rs @@ -9,6 +9,7 @@ pub(super) mod jay_head_ext_drm_color_space_info_v1; pub(super) mod jay_head_ext_format_info_v1; pub(super) mod jay_head_ext_jay_tearing_mode_info_v1; pub(super) mod jay_head_ext_jay_vrr_mode_info_v1; +pub(super) mod jay_head_ext_jay_vrr_mode_setter_v1; pub(super) mod jay_head_ext_mode_info_v1; pub(super) mod jay_head_ext_mode_setter_v1; pub(super) mod jay_head_ext_non_desktop_info_v1; diff --git a/src/ifs/head_management/jay_head_ext/jay_head_ext_jay_vrr_mode_setter_v1.rs b/src/ifs/head_management/jay_head_ext/jay_head_ext_jay_vrr_mode_setter_v1.rs new file mode 100644 index 00000000..4244384c --- /dev/null +++ b/src/ifs/head_management/jay_head_ext/jay_head_ext_jay_vrr_mode_setter_v1.rs @@ -0,0 +1,60 @@ +use { + crate::{ + ifs::head_management::{HeadOp, HeadState}, + wire::{ + jay_head_ext_jay_vrr_mode_setter_v1::{ + JayHeadExtJayVrrModeSetterV1RequestHandler, SetMode, SupportedMode, + }, + jay_head_manager_ext_jay_vrr_mode_setter_v1::JayHeadManagerExtJayVrrModeSetterV1RequestHandler, + }, + }, + jay_config::video::VrrMode, + std::rc::Rc, +}; + +impl_jay_vrr_mode_setter_v1! { + version = 1, + after_announce = after_announce, +} + +impl HeadName { + fn after_announce(&self, _shared: &HeadState) { + self.send_supported_mode(VrrMode::NEVER); + self.send_supported_mode(VrrMode::ALWAYS); + self.send_supported_mode(VrrMode::VARIANT_1); + self.send_supported_mode(VrrMode::VARIANT_2); + self.send_supported_mode(VrrMode::VARIANT_3); + } + + pub(in super::super) fn send_supported_mode(&self, mode: VrrMode) { + self.client.event(SupportedMode { + self_id: self.id, + mode: mode.0, + }); + } +} + +impl JayHeadManagerExtJayVrrModeSetterV1RequestHandler for MgrName { + type Error = ErrorName; + + mgr_common_req!(); +} + +impl JayHeadExtJayVrrModeSetterV1RequestHandler for HeadName { + type Error = ErrorName; + + head_common_req!(); + + fn set_mode(&self, req: SetMode, _slf: &Rc) -> Result<(), Self::Error> { + if req.mode > VrrMode::VARIANT_3.0 { + return Err(ErrorName::UnknownMode(req.mode)); + } + self.common.push_op(HeadOp::SetVrrMode(VrrMode(req.mode)))?; + Ok(()) + } +} + +error! { + #[error("Unknown VRR mode {0}")] + UnknownMode(u32), +} diff --git a/src/ifs/head_management/jay_head_manager_session_v1.rs b/src/ifs/head_management/jay_head_manager_session_v1.rs index 932fab91..9d098579 100644 --- a/src/ifs/head_management/jay_head_manager_session_v1.rs +++ b/src/ifs/head_management/jay_head_manager_session_v1.rs @@ -385,6 +385,7 @@ impl JayHeadManagerSessionV1RequestHandler for JayHeadManagerSessionV1 { COMPOSITOR_SPACE_INFO_SCALE = 1 << 5, MODE_INFO = 1 << 6, NON_DESKTOP_INFO = 1 << 7, + VRR_MODE_INFO = 1 << 8, COMPOSITOR_SPACE_INFO_ENABLED = 1 << 13, } for head in self.heads.lock().values() { @@ -430,6 +431,10 @@ impl JayHeadManagerSessionV1RequestHandler for JayHeadManagerSessionV1 { to_send |= CORE_INFO; to_send |= NON_DESKTOP_INFO; } + HeadOp::SetVrrMode(m) => { + state.vrr_mode = m; + to_send |= VRR_MODE_INFO; + } } } if to_send.contains(CORE_INFO) @@ -468,6 +473,11 @@ impl JayHeadManagerSessionV1RequestHandler for JayHeadManagerSessionV1 { { i.send_state(state); } + if to_send.contains(VRR_MODE_INFO) + && let Some(i) = &head.ext.jay_vrr_mode_info_v1 + { + i.send_mode(state); + } } slf.schedule_transaction_result(req.result, None)?; Ok(()) @@ -503,6 +513,7 @@ impl JayHeadManagerSessionV1RequestHandler for JayHeadManagerSessionV1 { node.set_position(desired.position.0, desired.position.1); node.set_preferred_scale(desired.scale); node.update_transform(desired.transform); + node.set_vrr_mode(VrrMode::from_config(desired.vrr_mode).unwrap()); } else if let Some(mi) = &desired.monitor_info { let pos = &self.client.state.persistent_output_states; let pos = match pos.get(&mi.output_id) { @@ -524,6 +535,8 @@ impl JayHeadManagerSessionV1RequestHandler for JayHeadManagerSessionV1 { pos.pos.set(desired.position); pos.scale.set(desired.scale); pos.transform.set(desired.transform); + pos.vrr_mode + .set(VrrMode::from_config(desired.vrr_mode).unwrap()); } } slf.schedule_transaction_result(req.result, None)?; diff --git a/wire/jay_head_ext_jay_vrr_mode_setter_v1.txt b/wire/jay_head_ext_jay_vrr_mode_setter_v1.txt new file mode 100644 index 00000000..34288cf8 --- /dev/null +++ b/wire/jay_head_ext_jay_vrr_mode_setter_v1.txt @@ -0,0 +1,15 @@ +request destroy (destructor) { + +} + +event reset { + +} + +event supported_mode { + mode: u32, +} + +request set_mode { + mode: u32, +} diff --git a/wire/jay_head_manager_ext_jay_vrr_mode_setter_v1.txt b/wire/jay_head_manager_ext_jay_vrr_mode_setter_v1.txt new file mode 100644 index 00000000..e67da63a --- /dev/null +++ b/wire/jay_head_manager_ext_jay_vrr_mode_setter_v1.txt @@ -0,0 +1,7 @@ +request destroy (destructor) { + +} + +event head { + head: id(jay_head_ext_jay_vrr_mode_setter_v1) (new), +}