1
0
Fork 0
forked from wry/wry

Merge pull request #374 from mahkoh/jorth/no-props-cache

metal: don't cache connector properties across forced probes
This commit is contained in:
mahkoh 2025-02-19 13:12:08 +01:00 committed by GitHub
commit 8c26e56b65
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -332,6 +332,8 @@ pub struct ConnectorDisplayData {
pub non_desktop_effective: bool, pub non_desktop_effective: bool,
pub vrr_capable: bool, pub vrr_capable: bool,
pub _vrr_refresh_max_nsec: u64, pub _vrr_refresh_max_nsec: u64,
pub default_properties: Vec<(DrmProperty, u64)>,
pub untyped_properties: AHashMap<DrmProperty, u64>,
pub connector_id: ConnectorKernelId, pub connector_id: ConnectorKernelId,
pub output_id: Rc<OutputId>, pub output_id: Rc<OutputId>,
@ -427,8 +429,6 @@ pub struct MetalConnector {
pub id: DrmConnector, pub id: DrmConnector,
pub master: Rc<DrmMaster>, pub master: Rc<DrmMaster>,
pub state: Rc<State>, pub state: Rc<State>,
pub default_properties: Vec<(DrmProperty, u64)>,
pub untyped_properties: RefCell<AHashMap<DrmProperty, u64>>,
pub dev: Rc<MetalDrmDevice>, pub dev: Rc<MetalDrmDevice>,
pub backend: Rc<MetalBackend>, pub backend: Rc<MetalBackend>,
@ -1113,30 +1113,11 @@ fn create_connector(
connector: DrmConnector, connector: DrmConnector,
dev: &Rc<MetalDrmDevice>, dev: &Rc<MetalDrmDevice>,
) -> Result<(Rc<MetalConnector>, ConnectorFutures), DrmError> { ) -> Result<(Rc<MetalConnector>, ConnectorFutures), DrmError> {
let props = collect_properties(&dev.master, connector)?; let display = create_connector_display_data(connector, dev, None)?;
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 slf = Rc::new(MetalConnector { let slf = Rc::new(MetalConnector {
id: connector, id: connector,
master: dev.master.clone(), master: dev.master.clone(),
state: backend.state.clone(), state: backend.state.clone(),
default_properties,
untyped_properties: RefCell::new(untyped_properties),
dev: dev.clone(), dev: dev.clone(),
backend: backend.clone(), backend: backend.clone(),
connector_id: backend.state.connector_ids.next(), connector_id: backend.state.connector_ids.next(),
@ -1197,7 +1178,6 @@ fn create_connector(
fn create_connector_display_data( fn create_connector_display_data(
connector: DrmConnector, connector: DrmConnector,
dev: &Rc<MetalDrmDevice>, dev: &Rc<MetalDrmDevice>,
props: Option<CollectedProperties>,
non_desktop_override: Option<bool>, non_desktop_override: Option<bool>,
) -> Result<ConnectorDisplayData, DrmError> { ) -> Result<ConnectorDisplayData, DrmError> {
let info = dev.master.get_connector_info(connector, true)?; let info = dev.master.get_connector_info(connector, true)?;
@ -1209,10 +1189,7 @@ fn create_connector_display_data(
} }
} }
} }
let props = match props { let props = collect_properties(&dev.master, connector)?;
Some(p) => p,
_ => collect_properties(&dev.master, connector)?,
};
let connection = ConnectorStatus::from_drm(info.connection); let connection = ConnectorStatus::from_drm(info.connection);
let mut name = String::new(); let mut name = String::new();
let mut manufacturer = String::new(); let mut manufacturer = String::new();
@ -1350,6 +1327,21 @@ fn create_connector_display_data(
}; };
let mode = mode_opt.clone(); let mode = mode_opt.clone();
drop(mode_opt); 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 { Ok(ConnectorDisplayData {
crtc_id: props.get("CRTC_ID")?.map(|v| DrmCrtc(v as _)), crtc_id: props.get("CRTC_ID")?.map(|v| DrmCrtc(v as _)),
crtcs, crtcs,
@ -1361,6 +1353,8 @@ fn create_connector_display_data(
non_desktop_effective: non_desktop_override.unwrap_or(non_desktop), non_desktop_effective: non_desktop_override.unwrap_or(non_desktop),
vrr_capable, vrr_capable,
_vrr_refresh_max_nsec: vrr_refresh_max_nsec, _vrr_refresh_max_nsec: vrr_refresh_max_nsec,
default_properties,
untyped_properties: props.to_untyped(),
connection, connection,
mm_width: info.mm_width, mm_width: info.mm_width,
mm_height: info.mm_height, mm_height: info.mm_height,
@ -1707,8 +1701,7 @@ impl MetalBackend {
} }
let mut preserve = Preserve::default(); let mut preserve = Preserve::default();
for c in dev.connectors.lock().values() { for c in dev.connectors.lock().values() {
let dd = let dd = create_connector_display_data(c.id, &dev.dev, c.non_desktop_override.get());
create_connector_display_data(c.id, &dev.dev, None, c.non_desktop_override.get());
let mut dd = match dd { let mut dd = match dd {
Ok(d) => d, Ok(d) => d,
Err(e) => { Err(e) => {
@ -1972,12 +1965,11 @@ impl MetalBackend {
}; };
let master = &dev.dev.master; let master = &dev.dev.master;
for c in dev.connectors.lock().values() { for c in dev.connectors.lock().values() {
let dd = c.display.borrow_mut(); let dd = &mut *c.display.borrow_mut();
let props = &mut *c.untyped_properties.borrow_mut(); collect_untyped_properties(master, c.id, &mut dd.untyped_properties)?;
collect_untyped_properties(master, c.id, props)?;
dd.crtc_id dd.crtc_id
.value .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() { for c in dev.dev.crtcs.values() {
let props = &mut *c.untyped_properties.borrow_mut(); let props = &mut *c.untyped_properties.borrow_mut();
@ -2418,17 +2410,25 @@ impl MetalBackend {
fn reset_default_properties(&self, dev: &Rc<MetalDrmDeviceData>, changes: &mut Change) { fn reset_default_properties(&self, dev: &Rc<MetalDrmDeviceData>, changes: &mut Change) {
macro_rules! reset { macro_rules! reset {
($obj:expr) => {{ ($obj:expr, $default:expr, $untyped:expr) => {{
let props = &*$obj.untyped_properties.borrow(); let props = $untyped;
for (k, v) in &$obj.default_properties { for (k, v) in $default {
if props.get(k) != Some(v) { if props.get(k) != Some(v) {
changes.change_object($obj.id, |c| c.change(*k, *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() { 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() { for plane in dev.dev.planes.values() {
reset!(plane); reset!(plane);