all: use let chains
This commit is contained in:
parent
3d5d146d65
commit
286857971a
89 changed files with 1516 additions and 1574 deletions
|
|
@ -247,13 +247,13 @@ impl Backend for MetalBackend {
|
|||
for device in devices.values() {
|
||||
let mut change = device.dev.master.change();
|
||||
for connector in device.connectors.lock().values() {
|
||||
if let Some(crtc) = connector.crtc.get() {
|
||||
if idle == crtc.active.value.get() {
|
||||
crtc.active.value.set(!idle);
|
||||
change.change_object(crtc.id, |c| {
|
||||
c.change(crtc.active.id, (!idle) as _);
|
||||
});
|
||||
}
|
||||
if let Some(crtc) = connector.crtc.get()
|
||||
&& idle == crtc.active.value.get()
|
||||
{
|
||||
crtc.active.value.set(!idle);
|
||||
change.change_object(crtc.id, |c| {
|
||||
c.change(crtc.active.id, (!idle) as _);
|
||||
});
|
||||
}
|
||||
}
|
||||
if let Err(e) = change.commit(DRM_MODE_ATOMIC_ALLOW_MODESET, 0) {
|
||||
|
|
@ -283,10 +283,10 @@ impl Backend for MetalBackend {
|
|||
fn get_input_fds(&self) -> Vec<Rc<OwnedFd>> {
|
||||
let mut res = vec![];
|
||||
for dev in &*self.device_holder.input_devices.borrow() {
|
||||
if let Some(dev) = dev {
|
||||
if let Some(fd) = dev.fd.get() {
|
||||
res.push(fd);
|
||||
}
|
||||
if let Some(dev) = dev
|
||||
&& let Some(fd) = dev.fd.get()
|
||||
{
|
||||
res.push(fd);
|
||||
}
|
||||
}
|
||||
res
|
||||
|
|
@ -428,11 +428,11 @@ impl LibInputAdapter for DeviceHolder {
|
|||
Ok(s) => s,
|
||||
Err(e) => return Err(LibInputError::Stat(e.into())),
|
||||
};
|
||||
if let Some(MetalDevice::Input(d)) = self.devices.get(&stat.st_rdev) {
|
||||
if let Some(fd) = d.fd.get() {
|
||||
return uapi::fcntl_dupfd_cloexec(fd.raw(), 0)
|
||||
.map_err(|e| LibInputError::DupFd(e.into()));
|
||||
}
|
||||
if let Some(MetalDevice::Input(d)) = self.devices.get(&stat.st_rdev)
|
||||
&& let Some(fd) = d.fd.get()
|
||||
{
|
||||
return uapi::fcntl_dupfd_cloexec(fd.raw(), 0)
|
||||
.map_err(|e| LibInputError::DupFd(e.into()));
|
||||
}
|
||||
Err(LibInputError::DeviceUnavailable)
|
||||
}
|
||||
|
|
@ -537,25 +537,25 @@ impl MetalInputDevice {
|
|||
|
||||
fn set_accel_profile_(&self, profile: AccelProfile) {
|
||||
self.desired.accel_profile.set(Some(profile));
|
||||
if let Some(dev) = self.inputdev.get() {
|
||||
if dev.device().accel_available() {
|
||||
dev.device().set_accel_profile(profile);
|
||||
self.effective
|
||||
.accel_profile
|
||||
.set(Some(dev.device().accel_profile()));
|
||||
}
|
||||
if let Some(dev) = self.inputdev.get()
|
||||
&& dev.device().accel_available()
|
||||
{
|
||||
dev.device().set_accel_profile(profile);
|
||||
self.effective
|
||||
.accel_profile
|
||||
.set(Some(dev.device().accel_profile()));
|
||||
}
|
||||
}
|
||||
|
||||
fn set_click_method_(&self, method: ConfigClickMethod) {
|
||||
self.desired.click_method.set(Some(method));
|
||||
if let Some(dev) = self.inputdev.get() {
|
||||
if dev.device().has_click_methods() {
|
||||
dev.device().set_click_method(method);
|
||||
self.effective
|
||||
.click_method
|
||||
.set(Some(dev.device().click_method()));
|
||||
}
|
||||
if let Some(dev) = self.inputdev.get()
|
||||
&& dev.device().has_click_methods()
|
||||
{
|
||||
dev.device().set_click_method(method);
|
||||
self.effective
|
||||
.click_method
|
||||
.set(Some(dev.device().click_method()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -595,13 +595,13 @@ impl InputDevice for MetalInputDevice {
|
|||
|
||||
fn set_left_handed(&self, left_handed: bool) {
|
||||
self.desired.left_handed.set(Some(left_handed));
|
||||
if let Some(dev) = self.inputdev.get() {
|
||||
if dev.device().left_handed_available() {
|
||||
dev.device().set_left_handed(left_handed);
|
||||
self.effective
|
||||
.left_handed
|
||||
.set(Some(dev.device().left_handed()));
|
||||
}
|
||||
if let Some(dev) = self.inputdev.get()
|
||||
&& dev.device().left_handed_available()
|
||||
{
|
||||
dev.device().set_left_handed(left_handed);
|
||||
self.effective
|
||||
.left_handed
|
||||
.set(Some(dev.device().left_handed()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -629,13 +629,13 @@ impl InputDevice for MetalInputDevice {
|
|||
|
||||
fn set_accel_speed(&self, speed: f64) {
|
||||
self.desired.accel_speed.set(Some(speed));
|
||||
if let Some(dev) = self.inputdev.get() {
|
||||
if dev.device().accel_available() {
|
||||
dev.device().set_accel_speed(speed);
|
||||
self.effective
|
||||
.accel_speed
|
||||
.set(Some(dev.device().accel_speed()));
|
||||
}
|
||||
if let Some(dev) = self.inputdev.get()
|
||||
&& dev.device().accel_available()
|
||||
{
|
||||
dev.device().set_accel_speed(speed);
|
||||
self.effective
|
||||
.accel_speed
|
||||
.set(Some(dev.device().accel_speed()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -653,13 +653,13 @@ impl InputDevice for MetalInputDevice {
|
|||
|
||||
fn set_calibration_matrix(&self, m: [[f32; 3]; 2]) {
|
||||
self.desired.calibration_matrix.set(Some(m));
|
||||
if let Some(dev) = self.inputdev.get() {
|
||||
if dev.device().has_calibration_matrix() {
|
||||
dev.device().set_calibration_matrix(m);
|
||||
self.effective
|
||||
.calibration_matrix
|
||||
.set(Some(dev.device().get_calibration_matrix()));
|
||||
}
|
||||
if let Some(dev) = self.inputdev.get()
|
||||
&& dev.device().has_calibration_matrix()
|
||||
{
|
||||
dev.device().set_calibration_matrix(m);
|
||||
self.effective
|
||||
.calibration_matrix
|
||||
.set(Some(dev.device().get_calibration_matrix()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -677,13 +677,13 @@ impl InputDevice for MetalInputDevice {
|
|||
|
||||
fn set_tap_enabled(&self, enabled: bool) {
|
||||
self.desired.tap_enabled.set(Some(enabled));
|
||||
if let Some(dev) = self.inputdev.get() {
|
||||
if dev.device().tap_available() {
|
||||
dev.device().set_tap_enabled(enabled);
|
||||
self.effective
|
||||
.tap_enabled
|
||||
.set(Some(dev.device().tap_enabled()));
|
||||
}
|
||||
if let Some(dev) = self.inputdev.get()
|
||||
&& dev.device().tap_available()
|
||||
{
|
||||
dev.device().set_tap_enabled(enabled);
|
||||
self.effective
|
||||
.tap_enabled
|
||||
.set(Some(dev.device().tap_enabled()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -693,13 +693,13 @@ impl InputDevice for MetalInputDevice {
|
|||
|
||||
fn set_drag_enabled(&self, enabled: bool) {
|
||||
self.desired.drag_enabled.set(Some(enabled));
|
||||
if let Some(dev) = self.inputdev.get() {
|
||||
if dev.device().tap_available() {
|
||||
dev.device().set_drag_enabled(enabled);
|
||||
self.effective
|
||||
.drag_enabled
|
||||
.set(Some(dev.device().drag_enabled()));
|
||||
}
|
||||
if let Some(dev) = self.inputdev.get()
|
||||
&& dev.device().tap_available()
|
||||
{
|
||||
dev.device().set_drag_enabled(enabled);
|
||||
self.effective
|
||||
.drag_enabled
|
||||
.set(Some(dev.device().drag_enabled()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -709,13 +709,13 @@ impl InputDevice for MetalInputDevice {
|
|||
|
||||
fn set_drag_lock_enabled(&self, enabled: bool) {
|
||||
self.desired.drag_lock_enabled.set(Some(enabled));
|
||||
if let Some(dev) = self.inputdev.get() {
|
||||
if dev.device().tap_available() {
|
||||
dev.device().set_drag_lock_enabled(enabled);
|
||||
self.effective
|
||||
.drag_lock_enabled
|
||||
.set(Some(dev.device().drag_lock_enabled()));
|
||||
}
|
||||
if let Some(dev) = self.inputdev.get()
|
||||
&& dev.device().tap_available()
|
||||
{
|
||||
dev.device().set_drag_lock_enabled(enabled);
|
||||
self.effective
|
||||
.drag_lock_enabled
|
||||
.set(Some(dev.device().drag_lock_enabled()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -725,13 +725,13 @@ impl InputDevice for MetalInputDevice {
|
|||
|
||||
fn set_natural_scrolling_enabled(&self, enabled: bool) {
|
||||
self.desired.natural_scrolling_enabled.set(Some(enabled));
|
||||
if let Some(dev) = self.inputdev.get() {
|
||||
if dev.device().has_natural_scrolling() {
|
||||
dev.device().set_natural_scrolling_enabled(enabled);
|
||||
self.effective
|
||||
.natural_scrolling_enabled
|
||||
.set(Some(dev.device().natural_scrolling_enabled()));
|
||||
}
|
||||
if let Some(dev) = self.inputdev.get()
|
||||
&& dev.device().has_natural_scrolling()
|
||||
{
|
||||
dev.device().set_natural_scrolling_enabled(enabled);
|
||||
self.effective
|
||||
.natural_scrolling_enabled
|
||||
.set(Some(dev.device().natural_scrolling_enabled()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -763,13 +763,13 @@ impl InputDevice for MetalInputDevice {
|
|||
self.desired
|
||||
.middle_button_emulation_enabled
|
||||
.set(Some(enabled));
|
||||
if let Some(dev) = self.inputdev.get() {
|
||||
if dev.device().middle_button_emulation_available() {
|
||||
dev.device().set_middle_button_emulation_enabled(enabled);
|
||||
self.effective
|
||||
.middle_button_emulation_enabled
|
||||
.set(Some(dev.device().middle_button_emulation_enabled()));
|
||||
}
|
||||
if let Some(dev) = self.inputdev.get()
|
||||
&& dev.device().middle_button_emulation_available()
|
||||
{
|
||||
dev.device().set_middle_button_emulation_enabled(enabled);
|
||||
self.effective
|
||||
.middle_button_emulation_enabled
|
||||
.set(Some(dev.device().middle_button_emulation_enabled()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -345,10 +345,10 @@ impl MetalBackend {
|
|||
let id = &slf.device_holder.devices;
|
||||
let mut slots = slf.device_holder.input_devices.borrow_mut();
|
||||
let dev = 'dev: {
|
||||
if let Some(dev) = slots[slot].clone() {
|
||||
if dev.id == device_id {
|
||||
break 'dev dev;
|
||||
}
|
||||
if let Some(dev) = slots[slot].clone()
|
||||
&& dev.id == device_id
|
||||
{
|
||||
break 'dev dev;
|
||||
}
|
||||
return;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -200,13 +200,13 @@ impl MetalConnector {
|
|||
present_fb = Some(fb);
|
||||
}
|
||||
self.perform_screencopies(&present_fb, &node, &cd);
|
||||
if let Some(sync_file) = self.cursor_sync_file.take() {
|
||||
if let Err(e) = self.state.ring.readable(&sync_file).await {
|
||||
log::error!(
|
||||
"Could not wait for cursor sync file to complete: {}",
|
||||
ErrorFmt(e)
|
||||
);
|
||||
}
|
||||
if let Some(sync_file) = self.cursor_sync_file.take()
|
||||
&& let Err(e) = self.state.ring.readable(&sync_file).await
|
||||
{
|
||||
log::error!(
|
||||
"Could not wait for cursor sync file to complete: {}",
|
||||
ErrorFmt(e)
|
||||
);
|
||||
}
|
||||
self.await_present_fb(present_fb.as_mut()).await;
|
||||
let mut res = self.program_connector(
|
||||
|
|
@ -216,36 +216,36 @@ impl MetalConnector {
|
|||
cursor_programming.as_ref(),
|
||||
present_fb.as_ref(),
|
||||
);
|
||||
if res.is_err() {
|
||||
if let Some(dsd_id) = direct_scanout_id {
|
||||
let fb = self.prepare_present_fb(
|
||||
&cd,
|
||||
&linear_cd,
|
||||
buffer,
|
||||
&plane,
|
||||
latched.as_ref().unwrap(),
|
||||
false,
|
||||
)?;
|
||||
present_fb = Some(fb);
|
||||
self.await_present_fb(present_fb.as_mut()).await;
|
||||
res = self.program_connector(
|
||||
version,
|
||||
&crtc,
|
||||
&plane,
|
||||
cursor_programming.as_ref(),
|
||||
present_fb.as_ref(),
|
||||
);
|
||||
if res.is_ok() {
|
||||
let mut cache = self.scanout_buffers.borrow_mut();
|
||||
if let Some(buffer) = cache.remove(&dsd_id) {
|
||||
cache.insert(
|
||||
dsd_id,
|
||||
DirectScanoutCache {
|
||||
tex: buffer.tex,
|
||||
fb: None,
|
||||
},
|
||||
);
|
||||
}
|
||||
if res.is_err()
|
||||
&& let Some(dsd_id) = direct_scanout_id
|
||||
{
|
||||
let fb = self.prepare_present_fb(
|
||||
&cd,
|
||||
&linear_cd,
|
||||
buffer,
|
||||
&plane,
|
||||
latched.as_ref().unwrap(),
|
||||
false,
|
||||
)?;
|
||||
present_fb = Some(fb);
|
||||
self.await_present_fb(present_fb.as_mut()).await;
|
||||
res = self.program_connector(
|
||||
version,
|
||||
&crtc,
|
||||
&plane,
|
||||
cursor_programming.as_ref(),
|
||||
present_fb.as_ref(),
|
||||
);
|
||||
if res.is_ok() {
|
||||
let mut cache = self.scanout_buffers.borrow_mut();
|
||||
if let Some(buffer) = cache.remove(&dsd_id) {
|
||||
cache.insert(
|
||||
dsd_id,
|
||||
DirectScanoutCache {
|
||||
tex: buffer.tex,
|
||||
fb: None,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -369,20 +369,22 @@ impl MetalConnector {
|
|||
change!(c, plane.crtc_y, crtc_y);
|
||||
change!(c, plane.crtc_w, crtc_w);
|
||||
change!(c, plane.crtc_h, crtc_h);
|
||||
if !try_async_flip && !self.dev.is_nvidia {
|
||||
if let Some(sf) = self.backend.signaled_sync_file.get() {
|
||||
c.change(plane.in_fence_fd, sf.0.raw() as u64);
|
||||
}
|
||||
if !try_async_flip
|
||||
&& !self.dev.is_nvidia
|
||||
&& let Some(sf) = self.backend.signaled_sync_file.get()
|
||||
{
|
||||
c.change(plane.in_fence_fd, sf.0.raw() as u64);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if self.dev.is_amd && crtc.vrr_enabled.value.get() {
|
||||
// Work around https://gitlab.freedesktop.org/drm/amd/-/issues/2186
|
||||
if let Some(fb) = &*self.active_framebuffer.borrow() {
|
||||
changes.change_object(plane.id, |c| {
|
||||
c.change(plane.fb_id, fb.fb.id().0 as _);
|
||||
});
|
||||
}
|
||||
// Work around https://gitlab.freedesktop.org/drm/amd/-/issues/2186
|
||||
if self.dev.is_amd
|
||||
&& crtc.vrr_enabled.value.get()
|
||||
&& let Some(fb) = &*self.active_framebuffer.borrow()
|
||||
{
|
||||
changes.change_object(plane.id, |c| {
|
||||
c.change(plane.fb_id, fb.fb.id().0 as _);
|
||||
});
|
||||
}
|
||||
}
|
||||
if let Some(cursor) = cursor {
|
||||
|
|
@ -408,10 +410,10 @@ impl MetalConnector {
|
|||
c.change(plane.src_y.id, 0);
|
||||
c.change(plane.src_w.id, (*width as u64) << 16);
|
||||
c.change(plane.src_h.id, (*height as u64) << 16);
|
||||
if !self.dev.is_nvidia {
|
||||
if let Some(sf) = self.backend.signaled_sync_file.get() {
|
||||
c.change(plane.in_fence_fd, sf.0.raw() as u64);
|
||||
}
|
||||
if !self.dev.is_nvidia
|
||||
&& let Some(sf) = self.backend.signaled_sync_file.get()
|
||||
{
|
||||
c.change(plane.in_fence_fd, sf.0.raw() as u64);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -606,11 +608,11 @@ impl MetalConnector {
|
|||
}
|
||||
}
|
||||
}
|
||||
if let Some(clear) = pass.clear {
|
||||
if clear != Color::SOLID_BLACK {
|
||||
// Background could be visible.
|
||||
return None;
|
||||
}
|
||||
if let Some(clear) = pass.clear
|
||||
&& clear != Color::SOLID_BLACK
|
||||
{
|
||||
// Background could be visible.
|
||||
return None;
|
||||
}
|
||||
ct
|
||||
};
|
||||
|
|
@ -683,10 +685,10 @@ impl MetalConnector {
|
|||
break 'format f;
|
||||
}
|
||||
// Try opaque format if possible.
|
||||
if let Some(opaque) = dmabuf.format.opaque {
|
||||
if let Some(f) = plane.formats.get(&opaque.drm) {
|
||||
break 'format f;
|
||||
}
|
||||
if let Some(opaque) = dmabuf.format.opaque
|
||||
&& let Some(f) = plane.formats.get(&opaque.drm)
|
||||
{
|
||||
break 'format f;
|
||||
}
|
||||
return None;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -759,13 +759,13 @@ impl MetalConnector {
|
|||
}
|
||||
if let Err(e) = self.master.queue_sequence(crtc.id) {
|
||||
log::error!("Could not queue a CRTC sequence: {}", ErrorFmt(&e));
|
||||
if let DrmError::QueueSequence(OsError(c::EOPNOTSUPP)) = e {
|
||||
if let Some(node) = self.state.root.outputs.get(&self.connector_id) {
|
||||
log::warn!("{}: Switching to vblank emulation", self.kernel_id());
|
||||
crtc.needs_vblank_emulation.set(true);
|
||||
node.global.connector.needs_vblank_emulation.set(true);
|
||||
node.vblank();
|
||||
}
|
||||
if let DrmError::QueueSequence(OsError(c::EOPNOTSUPP)) = e
|
||||
&& let Some(node) = self.state.root.outputs.get(&self.connector_id)
|
||||
{
|
||||
log::warn!("{}: Switching to vblank emulation", self.kernel_id());
|
||||
crtc.needs_vblank_emulation.set(true);
|
||||
node.global.connector.needs_vblank_emulation.set(true);
|
||||
node.vblank();
|
||||
}
|
||||
} else {
|
||||
crtc.have_queued_sequence.set(true);
|
||||
|
|
@ -856,15 +856,13 @@ impl Connector for MetalConnector {
|
|||
}
|
||||
|
||||
fn set_enabled(&self, enabled: bool) {
|
||||
if self.enabled.replace(enabled) != enabled {
|
||||
if self.display.borrow_mut().connection == ConnectorStatus::Connected {
|
||||
if let Some(dev) = self.backend.device_holder.drm_devices.get(&self.dev.devnum) {
|
||||
if let Err(e) = self.backend.handle_drm_change_(&dev, true) {
|
||||
dev.unprocessed_change.set(true);
|
||||
log::error!("Could not dis/enable connector: {}", ErrorFmt(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
if self.enabled.replace(enabled) != enabled
|
||||
&& self.display.borrow_mut().connection == ConnectorStatus::Connected
|
||||
&& let Some(dev) = self.backend.device_holder.drm_devices.get(&self.dev.devnum)
|
||||
&& let Err(e) = self.backend.handle_drm_change_(&dev, true)
|
||||
{
|
||||
dev.unprocessed_change.set(true);
|
||||
log::error!("Could not dis/enable connector: {}", ErrorFmt(e));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -930,11 +928,11 @@ impl Connector for MetalConnector {
|
|||
}
|
||||
dd.non_desktop_effective = non_desktop_effective;
|
||||
drop(dd);
|
||||
if let Some(dev) = self.backend.device_holder.drm_devices.get(&self.dev.devnum) {
|
||||
if let Err(e) = self.backend.handle_drm_change_(&dev, true) {
|
||||
dev.unprocessed_change.set(true);
|
||||
log::error!("Could not override non-desktop setting: {}", ErrorFmt(e));
|
||||
}
|
||||
if let Some(dev) = self.backend.device_holder.drm_devices.get(&self.dev.devnum)
|
||||
&& let Err(e) = self.backend.handle_drm_change_(&dev, true)
|
||||
{
|
||||
dev.unprocessed_change.set(true);
|
||||
log::error!("Could not override non-desktop setting: {}", ErrorFmt(e));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -991,11 +989,11 @@ impl Connector for MetalConnector {
|
|||
}
|
||||
self.try_switch_format.set(true);
|
||||
}
|
||||
if let Some(dev) = self.backend.device_holder.drm_devices.get(&self.dev.devnum) {
|
||||
if let Err(e) = self.backend.handle_drm_change_(&dev, true) {
|
||||
dev.unprocessed_change.set(true);
|
||||
log::error!("Could not change format: {}", ErrorFmt(e));
|
||||
}
|
||||
if let Some(dev) = self.backend.device_holder.drm_devices.get(&self.dev.devnum)
|
||||
&& let Err(e) = self.backend.handle_drm_change_(&dev, true)
|
||||
{
|
||||
dev.unprocessed_change.set(true);
|
||||
log::error!("Could not change format: {}", ErrorFmt(e));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1376,10 +1374,10 @@ fn create_connector_display_data(
|
|||
}
|
||||
}
|
||||
for desc in &edid.base_block.descriptors {
|
||||
if let Some(desc) = desc {
|
||||
if let Descriptor::DisplayRangeLimitsAndAdditionalTiming(timings) = desc {
|
||||
break 'fetch_min_hz timings.vertical_field_rate_min as u64;
|
||||
}
|
||||
if let Some(desc) = desc
|
||||
&& let Descriptor::DisplayRangeLimitsAndAdditionalTiming(timings) = desc
|
||||
{
|
||||
break 'fetch_min_hz timings.vertical_field_rate_min as u64;
|
||||
}
|
||||
}
|
||||
0
|
||||
|
|
@ -1450,11 +1448,11 @@ fn create_connector_display_data(
|
|||
}
|
||||
};
|
||||
let mut mode_opt = desired_state.mode.borrow_mut();
|
||||
if let Some(mode) = &*mode_opt {
|
||||
if !info.modes.contains(mode) {
|
||||
log::warn!("Discarding previously desired mode");
|
||||
*mode_opt = None;
|
||||
}
|
||||
if let Some(mode) = &*mode_opt
|
||||
&& !info.modes.contains(mode)
|
||||
{
|
||||
log::warn!("Discarding previously desired mode");
|
||||
*mode_opt = None;
|
||||
}
|
||||
if mode_opt.is_none() {
|
||||
*mode_opt = info.modes.first().cloned();
|
||||
|
|
@ -1854,12 +1852,11 @@ impl MetalBackend {
|
|||
for c in removed_connectors {
|
||||
dev.futures.remove(&c);
|
||||
if let Some(c) = dev.connectors.remove(&c) {
|
||||
if let Some(lease_id) = c.lease.get() {
|
||||
if let Some(lease) = dev.dev.leases.remove(&lease_id) {
|
||||
if !lease.try_revoke() {
|
||||
dev.dev.leases_to_break.set(lease_id, lease);
|
||||
}
|
||||
}
|
||||
if let Some(lease_id) = c.lease.get()
|
||||
&& let Some(lease) = dev.dev.leases.remove(&lease_id)
|
||||
&& !lease.try_revoke()
|
||||
{
|
||||
dev.dev.leases_to_break.set(lease_id, lease);
|
||||
}
|
||||
match c.frontend_state.get() {
|
||||
FrontState::Removed | FrontState::Disconnected => {}
|
||||
|
|
@ -1908,12 +1905,11 @@ impl MetalBackend {
|
|||
}
|
||||
if disconnect {
|
||||
c.tearing_requested.set(false);
|
||||
if let Some(lease_id) = c.lease.get() {
|
||||
if let Some(lease) = dev.dev.leases.remove(&lease_id) {
|
||||
if !lease.try_revoke() {
|
||||
dev.dev.leases_to_break.set(lease_id, lease);
|
||||
}
|
||||
}
|
||||
if let Some(lease_id) = c.lease.get()
|
||||
&& let Some(lease) = dev.dev.leases.remove(&lease_id)
|
||||
&& !lease.try_revoke()
|
||||
{
|
||||
dev.dev.leases_to_break.set(lease_id, lease);
|
||||
}
|
||||
c.send_event(ConnectorEvent::Disconnected);
|
||||
} else if preserve_any {
|
||||
|
|
@ -2493,13 +2489,13 @@ impl MetalBackend {
|
|||
log::warn!("Cannot preserve connector whose crtc is inactive");
|
||||
fail!(c.id);
|
||||
}
|
||||
if let Some(plane) = c.primary_plane.get() {
|
||||
if plane.crtc_id.value.get() != crtc.id {
|
||||
log::warn!(
|
||||
"Cannot preserve connector whose primary plane is attached to a different crtc"
|
||||
);
|
||||
fail!(c.id);
|
||||
}
|
||||
if let Some(plane) = c.primary_plane.get()
|
||||
&& plane.crtc_id.value.get() != crtc.id
|
||||
{
|
||||
log::warn!(
|
||||
"Cannot preserve connector whose primary plane is attached to a different crtc"
|
||||
);
|
||||
fail!(c.id);
|
||||
}
|
||||
if let Some(plane) = c.cursor_plane.get() {
|
||||
let crtc_id = plane.crtc_id.value.get();
|
||||
|
|
@ -2510,11 +2506,11 @@ impl MetalBackend {
|
|||
fail!(c.id);
|
||||
}
|
||||
}
|
||||
if let Some(m) = &dd.colorspace {
|
||||
if m.value.get() != dd.persistent.color_space.get().to_drm() {
|
||||
log::debug!("Connector has wrong colorspace");
|
||||
fail!(c.id);
|
||||
}
|
||||
if let Some(m) = &dd.colorspace
|
||||
&& m.value.get() != dd.persistent.color_space.get().to_drm()
|
||||
{
|
||||
log::debug!("Connector has wrong colorspace");
|
||||
fail!(c.id);
|
||||
}
|
||||
if let Some(diff) = self.compare_hdr_metadata(&dev.dev, &dd) {
|
||||
log::debug!("{}", diff);
|
||||
|
|
@ -2541,23 +2537,22 @@ impl MetalBackend {
|
|||
}
|
||||
|
||||
fn make_render_device(&self, dev: &MetalDrmDevice, force: bool) {
|
||||
if !force {
|
||||
if let Some(ctx) = self.ctx.get() {
|
||||
if ctx.dev_id == dev.id {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if !force
|
||||
&& let Some(ctx) = self.ctx.get()
|
||||
&& ctx.dev_id == dev.id
|
||||
{
|
||||
return;
|
||||
}
|
||||
let ctx = dev.ctx.get();
|
||||
if self.signaled_sync_file.is_none() {
|
||||
if let Some(sync) = ctx.gfx.sync_obj_ctx() {
|
||||
match sync.create_signaled_sync_file() {
|
||||
Ok(sf) => {
|
||||
self.signaled_sync_file.set(Some(sf));
|
||||
}
|
||||
Err(e) => {
|
||||
log::warn!("Could not create signaled sync file: {}", ErrorFmt(e));
|
||||
}
|
||||
if self.signaled_sync_file.is_none()
|
||||
&& let Some(sync) = ctx.gfx.sync_obj_ctx()
|
||||
{
|
||||
match sync.create_signaled_sync_file() {
|
||||
Ok(sf) => {
|
||||
self.signaled_sync_file.set(Some(sf));
|
||||
}
|
||||
Err(e) => {
|
||||
log::warn!("Could not create signaled sync file: {}", ErrorFmt(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2675,32 +2670,31 @@ impl MetalBackend {
|
|||
flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
|
||||
self.reset_connectors_and_crtcs(dev, &mut changes, preserve);
|
||||
for connector in dev.connectors.lock().values() {
|
||||
if !preserve.connectors.contains(&connector.id) {
|
||||
if let Err(e) = self.assign_connector_crtc(connector, &mut changes) {
|
||||
log::error!("Could not assign a crtc: {}", ErrorFmt(e));
|
||||
}
|
||||
if !preserve.connectors.contains(&connector.id)
|
||||
&& let Err(e) = self.assign_connector_crtc(connector, &mut changes)
|
||||
{
|
||||
log::error!("Could not assign a crtc: {}", ErrorFmt(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
self.reset_planes(dev, &mut changes, preserve);
|
||||
let mut old_buffers = vec![];
|
||||
for connector in dev.connectors.lock().values() {
|
||||
if !preserve.connectors.contains(&connector.id) {
|
||||
if let Err(e) =
|
||||
if !preserve.connectors.contains(&connector.id)
|
||||
&& let Err(e) =
|
||||
self.assign_connector_planes(connector, &mut changes, &ctx, &mut old_buffers)
|
||||
{
|
||||
log::error!("Could not assign a plane: {}", ErrorFmt(e));
|
||||
}
|
||||
{
|
||||
log::error!("Could not assign a plane: {}", ErrorFmt(e));
|
||||
}
|
||||
}
|
||||
let res = loop {
|
||||
let res = changes.commit(flags, 0);
|
||||
if let Err(e) = &res {
|
||||
if flags.not_contains(DRM_MODE_ATOMIC_ALLOW_MODESET) {
|
||||
log::warn!("Fast commit failed, retrying with modeset: {}", ErrorFmt(e));
|
||||
flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
|
||||
continue;
|
||||
}
|
||||
if let Err(e) = &res
|
||||
&& flags.not_contains(DRM_MODE_ATOMIC_ALLOW_MODESET)
|
||||
{
|
||||
log::warn!("Fast commit failed, retrying with modeset: {}", ErrorFmt(e));
|
||||
flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
|
||||
continue;
|
||||
}
|
||||
break res;
|
||||
};
|
||||
|
|
@ -2775,11 +2769,11 @@ impl MetalBackend {
|
|||
if dd.should_enable_vrr() {
|
||||
vrr_crtcs.insert(crtc_id);
|
||||
}
|
||||
if let Some(m) = &dd.colorspace {
|
||||
if m.value.get() != dd.persistent.color_space.get().to_drm() {
|
||||
log::debug!("Connector has wrong colorspace");
|
||||
return false;
|
||||
}
|
||||
if let Some(m) = &dd.colorspace
|
||||
&& m.value.get() != dd.persistent.color_space.get().to_drm()
|
||||
{
|
||||
log::debug!("Connector has wrong colorspace");
|
||||
return false;
|
||||
}
|
||||
if let Some(diff) = self.compare_hdr_metadata(&dev.dev, &dd) {
|
||||
log::debug!("{}", diff);
|
||||
|
|
@ -3139,10 +3133,9 @@ impl MetalBackend {
|
|||
if plane.ty == PlaneType::Primary
|
||||
&& !plane.assigned.get()
|
||||
&& plane.lease.is_none()
|
||||
&& let Some(format) = plane.formats.get(&format.drm)
|
||||
{
|
||||
if let Some(format) = plane.formats.get(&format.drm) {
|
||||
break 'primary_plane (plane.clone(), &format.modifiers);
|
||||
}
|
||||
break 'primary_plane (plane.clone(), &format.modifiers);
|
||||
}
|
||||
}
|
||||
return Err(MetalError::NoPrimaryPlaneForConnector);
|
||||
|
|
@ -3189,12 +3182,11 @@ impl MetalBackend {
|
|||
&& !plane.assigned.get()
|
||||
&& plane.lease.is_none()
|
||||
&& plane.formats.contains_key(&ARGB8888.drm)
|
||||
&& let Some(format) = plane.formats.get(&ARGB8888.drm)
|
||||
{
|
||||
if let Some(format) = plane.formats.get(&ARGB8888.drm) {
|
||||
cursor_plane = Some(plane.clone());
|
||||
cursor_modifiers = &format.modifiers;
|
||||
break;
|
||||
}
|
||||
cursor_plane = Some(plane.clone());
|
||||
cursor_modifiers = &format.modifiers;
|
||||
break;
|
||||
}
|
||||
}
|
||||
let mut cursor_buffers = None;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue