1
0
Fork 0
forked from wry/wry

metal: don't use non-desktop screens

This commit is contained in:
Julian Orth 2024-04-25 13:27:28 +02:00
parent 88a396575c
commit b5f1166360

View file

@ -172,6 +172,7 @@ pub struct ConnectorDisplayData {
pub modes: Vec<DrmModeInfo>, pub modes: Vec<DrmModeInfo>,
pub mode: Option<DrmModeInfo>, pub mode: Option<DrmModeInfo>,
pub refresh: u32, pub refresh: u32,
pub non_desktop: bool,
pub monitor_manufacturer: String, pub monitor_manufacturer: String,
pub monitor_name: String, pub monitor_name: String,
@ -1190,6 +1191,7 @@ fn create_connector_display_data(
modes: info.modes, modes: info.modes,
mode, mode,
refresh, refresh,
non_desktop: props.get("non-desktop")?.value.get() != 0,
monitor_manufacturer: manufacturer, monitor_manufacturer: manufacturer,
monitor_name: name, monitor_name: name,
monitor_serial_number: serial_number, monitor_serial_number: serial_number,
@ -1744,8 +1746,7 @@ impl MetalBackend {
if let Err(e) = self.update_device_properties(dev) { if let Err(e) = self.update_device_properties(dev) {
return Err(MetalError::UpdateProperties(e)); return Err(MetalError::UpdateProperties(e));
} }
let mut preserve = Preserve::default(); self.init_drm_device(dev, &mut Preserve::default())?;
self.init_drm_device(dev, &mut preserve)?;
for connector in dev.connectors.lock().values() { for connector in dev.connectors.lock().values() {
if connector.primary_plane.is_some() { if connector.primary_plane.is_some() {
connector.schedule_present(); connector.schedule_present();
@ -2011,8 +2012,7 @@ impl MetalBackend {
} }
fn re_init_drm_device(&self, dev: &Rc<MetalDrmDeviceData>) { fn re_init_drm_device(&self, dev: &Rc<MetalDrmDeviceData>) {
let mut preserve = Preserve::default(); if let Err(e) = self.init_drm_device(dev, &mut Preserve::default()) {
if let Err(e) = self.init_drm_device(dev, &mut preserve) {
log::error!("Could not initialize device: {}", ErrorFmt(e)); log::error!("Could not initialize device: {}", ErrorFmt(e));
} }
for connector in dev.connectors.lock().values() { for connector in dev.connectors.lock().values() {
@ -2076,9 +2076,9 @@ impl MetalBackend {
for connector in dev.connectors.lock().values() { for connector in dev.connectors.lock().values() {
let dd = connector.display.borrow_mut(); let dd = connector.display.borrow_mut();
if !connector.enabled.get() || dd.connection != ConnectorStatus::Connected { if should_ignore(connector, &dd) {
if dd.crtc_id.value.get().is_some() { if dd.crtc_id.value.get().is_some() {
log::debug!("Connector is not connected but has an assigned crtc"); log::debug!("Connector should be ignored but has an assigned crtc");
return false; return false;
} }
continue; continue;
@ -2306,7 +2306,7 @@ impl MetalBackend {
changes: &mut Change, changes: &mut Change,
) -> Result<(), MetalError> { ) -> Result<(), MetalError> {
let dd = connector.display.borrow_mut(); let dd = connector.display.borrow_mut();
if !connector.enabled.get() || dd.connection != ConnectorStatus::Connected { if should_ignore(connector, &dd) {
return Ok(()); return Ok(());
} }
let crtc = 'crtc: { let crtc = 'crtc: {
@ -2521,3 +2521,7 @@ fn modes_equal(a: &DrmModeInfo, b: &DrmModeInfo) -> bool {
&& a.vrefresh == b.vrefresh && a.vrefresh == b.vrefresh
&& a.flags == b.flags && a.flags == b.flags
} }
fn should_ignore(connector: &MetalConnector, dd: &ConnectorDisplayData) -> bool {
!connector.enabled.get() || dd.connection != ConnectorStatus::Connected || dd.non_desktop
}