Merge pull request #374 from mahkoh/jorth/no-props-cache
metal: don't cache connector properties across forced probes
This commit is contained in:
commit
8c26e56b65
1 changed files with 37 additions and 37 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue