From 364c53fde7470f896cad87ea2410be1e454c180c Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Wed, 19 Feb 2025 13:05:37 +0100 Subject: [PATCH] metal: don't cache connector properties across forced probes --- src/backends/metal/video.rs | 74 ++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/backends/metal/video.rs b/src/backends/metal/video.rs index 4bd2e79c..61657522 100644 --- a/src/backends/metal/video.rs +++ b/src/backends/metal/video.rs @@ -332,6 +332,8 @@ pub struct ConnectorDisplayData { pub non_desktop_effective: bool, pub vrr_capable: bool, pub _vrr_refresh_max_nsec: u64, + pub default_properties: Vec<(DrmProperty, u64)>, + pub untyped_properties: AHashMap, pub connector_id: ConnectorKernelId, pub output_id: Rc, @@ -427,8 +429,6 @@ pub struct MetalConnector { pub id: DrmConnector, pub master: Rc, pub state: Rc, - pub default_properties: Vec<(DrmProperty, u64)>, - pub untyped_properties: RefCell>, pub dev: Rc, pub backend: Rc, @@ -1113,30 +1113,11 @@ fn create_connector( connector: DrmConnector, dev: &Rc, ) -> Result<(Rc, ConnectorFutures), DrmError> { - let props = collect_properties(&dev.master, connector)?; - let default_properties = create_default_properties( - &props, - &[ - ("Broadcast RGB", DefaultValue::Enum("Automatic")), - ("Colorspace", DefaultValue::Enum("Default")), - ("HDR_OUTPUT_METADATA", DefaultValue::Fixed(0)), - ("HDR_SOURCE_METADATA", DefaultValue::Fixed(0)), - ("Output format", DefaultValue::Enum("Default")), - ("WRITEBACK_FB_ID", DefaultValue::Fixed(0)), - ("WRITEBACK_OUT_FENCE_PTR", DefaultValue::Fixed(0)), - ("content type", DefaultValue::Enum("No Data")), - ("dither", DefaultValue::Enum("off")), - ("max bpc", DefaultValue::RangeMax), - ], - ); - let untyped_properties = props.to_untyped(); - let display = create_connector_display_data(connector, dev, Some(props), None)?; + let display = create_connector_display_data(connector, dev, None)?; let slf = Rc::new(MetalConnector { id: connector, master: dev.master.clone(), state: backend.state.clone(), - default_properties, - untyped_properties: RefCell::new(untyped_properties), dev: dev.clone(), backend: backend.clone(), connector_id: backend.state.connector_ids.next(), @@ -1197,7 +1178,6 @@ fn create_connector( fn create_connector_display_data( connector: DrmConnector, dev: &Rc, - props: Option, non_desktop_override: Option, ) -> Result { let info = dev.master.get_connector_info(connector, true)?; @@ -1209,10 +1189,7 @@ fn create_connector_display_data( } } } - let props = match props { - Some(p) => p, - _ => collect_properties(&dev.master, connector)?, - }; + let props = collect_properties(&dev.master, connector)?; let connection = ConnectorStatus::from_drm(info.connection); let mut name = String::new(); let mut manufacturer = String::new(); @@ -1350,6 +1327,21 @@ fn create_connector_display_data( }; let mode = mode_opt.clone(); drop(mode_opt); + let default_properties = create_default_properties( + &props, + &[ + ("Broadcast RGB", DefaultValue::Enum("Automatic")), + ("Colorspace", DefaultValue::Enum("Default")), + ("HDR_OUTPUT_METADATA", DefaultValue::Fixed(0)), + ("HDR_SOURCE_METADATA", DefaultValue::Fixed(0)), + ("Output format", DefaultValue::Enum("Default")), + ("WRITEBACK_FB_ID", DefaultValue::Fixed(0)), + ("WRITEBACK_OUT_FENCE_PTR", DefaultValue::Fixed(0)), + ("content type", DefaultValue::Enum("No Data")), + ("dither", DefaultValue::Enum("off")), + ("max bpc", DefaultValue::RangeMax), + ], + ); Ok(ConnectorDisplayData { crtc_id: props.get("CRTC_ID")?.map(|v| DrmCrtc(v as _)), crtcs, @@ -1361,6 +1353,8 @@ fn create_connector_display_data( non_desktop_effective: non_desktop_override.unwrap_or(non_desktop), vrr_capable, _vrr_refresh_max_nsec: vrr_refresh_max_nsec, + default_properties, + untyped_properties: props.to_untyped(), connection, mm_width: info.mm_width, mm_height: info.mm_height, @@ -1707,8 +1701,7 @@ impl MetalBackend { } let mut preserve = Preserve::default(); for c in dev.connectors.lock().values() { - let dd = - create_connector_display_data(c.id, &dev.dev, None, c.non_desktop_override.get()); + let dd = create_connector_display_data(c.id, &dev.dev, c.non_desktop_override.get()); let mut dd = match dd { Ok(d) => d, Err(e) => { @@ -1972,12 +1965,11 @@ impl MetalBackend { }; let master = &dev.dev.master; for c in dev.connectors.lock().values() { - let dd = c.display.borrow_mut(); - let props = &mut *c.untyped_properties.borrow_mut(); - collect_untyped_properties(master, c.id, props)?; + let dd = &mut *c.display.borrow_mut(); + collect_untyped_properties(master, c.id, &mut dd.untyped_properties)?; dd.crtc_id .value - .set(DrmCrtc(get(props, dd.crtc_id.id)? as _)); + .set(DrmCrtc(get(&dd.untyped_properties, dd.crtc_id.id)? as _)); } for c in dev.dev.crtcs.values() { let props = &mut *c.untyped_properties.borrow_mut(); @@ -2418,17 +2410,25 @@ impl MetalBackend { fn reset_default_properties(&self, dev: &Rc, changes: &mut Change) { macro_rules! reset { - ($obj:expr) => {{ - let props = &*$obj.untyped_properties.borrow(); - for (k, v) in &$obj.default_properties { + ($obj:expr, $default:expr, $untyped:expr) => {{ + let props = $untyped; + for (k, v) in $default { if props.get(k) != Some(v) { changes.change_object($obj.id, |c| c.change(*k, *v)); } } }}; + ($obj:expr) => { + reset!( + $obj, + &$obj.default_properties, + &*$obj.untyped_properties.borrow() + ) + }; } for connector in dev.connectors.lock().values() { - reset!(connector); + let dd = &*connector.display.borrow(); + reset!(connector, &dd.default_properties, &dd.untyped_properties); } for plane in dev.dev.planes.values() { reset!(plane);