From 3cf1b227b600be6d5c1ba9b5aff7bab1fc371de3 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Wed, 10 Apr 2024 11:30:15 +0200 Subject: [PATCH] metal: disable IN_FENCE_FD on nvidia driver --- deploy-notes.md | 4 ++++ release-notes.md | 4 ++++ src/backends/metal/video.rs | 26 ++++++++++++++++++++++++-- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/deploy-notes.md b/deploy-notes.md index 404a50d0..96c414fb 100644 --- a/deploy-notes.md +++ b/deploy-notes.md @@ -1,5 +1,9 @@ # Unreleased +# 1.0.3 + +- Needs jay-compositor release. + # 1.0.2 - Needs jay-compositor release. diff --git a/release-notes.md b/release-notes.md index 65e7ea38..e3a4d288 100644 --- a/release-notes.md +++ b/release-notes.md @@ -2,6 +2,10 @@ - Add support for wp-alpha-modifier. +# 1.0.3 (2024-04-11) + +- Partially disable explicit sync on nvidia drivers. + # 1.0.2 (2024-04-10) - Fixed a bug that caused the portal to fail. diff --git a/src/backends/metal/video.rs b/src/backends/metal/video.rs index 7d28ff93..69c06789 100644 --- a/src/backends/metal/video.rs +++ b/src/backends/metal/video.rs @@ -88,6 +88,7 @@ pub struct MetalDrmDevice { pub ctx: CloneCell>, pub on_change: OnChange, pub direct_scanout_enabled: Cell>, + pub is_nvidia: bool, } impl MetalDrmDevice { @@ -714,7 +715,9 @@ impl MetalConnector { c.change(plane.crtc_y.id, crtc_y as u64); c.change(plane.crtc_w.id, crtc_w as u64); c.change(plane.crtc_h.id, crtc_h as u64); - c.change(plane.in_fence_fd, in_fence as u64); + if !self.dev.is_nvidia { + c.change(plane.in_fence_fd, in_fence as u64); + } }); new_fb = Some(fb); } @@ -748,7 +751,9 @@ 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); - c.change(plane.in_fence_fd, in_fence as u64); + if !self.dev.is_nvidia { + c.change(plane.in_fence_fd, in_fence as u64); + } }); } else { changes.change_object(plane.id, |c| { @@ -1586,6 +1591,22 @@ impl MetalBackend { Err(e) => return Err(MetalError::GbmDevice(e)), }; + let mut is_nvidia = false; + match gbm.drm.version() { + Ok(v) => { + is_nvidia = v.name.contains_str("nvidia"); + if is_nvidia { + log::warn!( + "Device {} use the nvidia driver. IN_FENCE_FD will not be used.", + pending.devnode.as_bytes().as_bstr(), + ); + } + } + Err(e) => { + log::warn!("Could not fetch DRM version information: {}", ErrorFmt(e)); + } + } + let dev = Rc::new(MetalDrmDevice { backend: self.clone(), id: pending.id, @@ -1608,6 +1629,7 @@ impl MetalBackend { ctx: CloneCell::new(ctx), on_change: Default::default(), direct_scanout_enabled: Default::default(), + is_nvidia, }); let (connectors, futures) = get_connectors(self, &dev, &resources.connectors)?;