diff --git a/src/cli/screenshot.rs b/src/cli/screenshot.rs index cddaf540..7402453b 100644 --- a/src/cli/screenshot.rs +++ b/src/cli/screenshot.rs @@ -69,6 +69,7 @@ async fn run(screenshot: Rc) { format: XRGB8888, modifier: ev.modifier, planes, + is_disjoint: Default::default(), }; res.push(Ok((buf, Some(ev.drm_dev)))); }); @@ -96,6 +97,7 @@ async fn run(screenshot: Rc) { format: XRGB8888, modifier: ev.modifier, planes: planes.take(), + is_disjoint: Default::default(), }; res.push(Ok((buf, dev.take()))) }, diff --git a/src/gfx_apis/vulkan/bo_allocator.rs b/src/gfx_apis/vulkan/bo_allocator.rs index 8e8d2200..ccee4310 100644 --- a/src/gfx_apis/vulkan/bo_allocator.rs +++ b/src/gfx_apis/vulkan/bo_allocator.rs @@ -230,6 +230,7 @@ impl VulkanBoAllocator { format: format.format, modifier: modifier.modifier, planes, + is_disjoint: Default::default(), }; unsafe { let cmd = data.command_buffer.buffer; diff --git a/src/ifs/wl_drm.rs b/src/ifs/wl_drm.rs index 580d1ef0..c26e4512 100644 --- a/src/ifs/wl_drm.rs +++ b/src/ifs/wl_drm.rs @@ -142,6 +142,7 @@ impl WlDrmRequestHandler for WlDrm { format, modifier: INVALID_MODIFIER, planes: PlaneVec::new(), + is_disjoint: Default::default(), }; if req.stride0 > 0 { dmabuf.planes.push(DmaBufPlane { diff --git a/src/ifs/zwp_linux_buffer_params_v1.rs b/src/ifs/zwp_linux_buffer_params_v1.rs index 801d258e..f9e62719 100644 --- a/src/ifs/zwp_linux_buffer_params_v1.rs +++ b/src/ifs/zwp_linux_buffer_params_v1.rs @@ -93,6 +93,7 @@ impl ZwpLinuxBufferParamsV1 { format: format.format, modifier, planes: PlaneVec::new(), + is_disjoint: Default::default(), }; let mut planes: Vec<_> = self.planes.borrow_mut().drain_values().collect(); planes.sort_by_key(|a| a.plane_idx); diff --git a/src/it/test_ifs/test_screenshot.rs b/src/it/test_ifs/test_screenshot.rs index 580d616a..c7e08a9f 100644 --- a/src/it/test_ifs/test_screenshot.rs +++ b/src/it/test_ifs/test_screenshot.rs @@ -38,6 +38,7 @@ impl TestJayScreenshot { format: XRGB8888, modifier: ev.modifier, planes, + is_disjoint: Default::default(), }))); Ok(()) } @@ -73,6 +74,7 @@ impl TestJayScreenshot { format: XRGB8888, modifier: ev.modifier, planes: self.planes.take(), + is_disjoint: Default::default(), }))); Ok(()) } diff --git a/src/udmabuf.rs b/src/udmabuf.rs index e991378a..0bf020ea 100644 --- a/src/udmabuf.rs +++ b/src/udmabuf.rs @@ -162,6 +162,7 @@ impl Allocator for Udmabuf { format, modifier: LINEAR_MODIFIER, planes, + is_disjoint: Default::default(), }; Ok(Rc::new(UdmabufBo { buf: dmabuf, diff --git a/src/video/dmabuf.rs b/src/video/dmabuf.rs index 2991d5d8..1e6482ee 100644 --- a/src/video/dmabuf.rs +++ b/src/video/dmabuf.rs @@ -5,7 +5,7 @@ use { video::{LINEAR_MODIFIER, Modifier}, }, arrayvec::ArrayVec, - std::{rc::Rc, sync::OnceLock}, + std::{cell::OnceCell, rc::Rc, sync::OnceLock}, uapi::{ _IOW, _IOWR, OwnedFd, c::{self, dev_t, ioctl}, @@ -30,6 +30,7 @@ pub struct DmaBuf { pub format: &'static Format, pub modifier: Modifier, pub planes: PlaneVec, + pub is_disjoint: OnceCell, } pub const MAX_PLANES: usize = 4; @@ -38,23 +39,25 @@ pub type PlaneVec = ArrayVec; impl DmaBuf { pub fn is_disjoint(&self) -> bool { - if self.planes.len() <= 1 { - return false; - } - let stat = match uapi::fstat(self.planes[0].fd.raw()) { - Ok(s) => s, - _ => return true, - }; - for plane in &self.planes[1..] { - let stat2 = match uapi::fstat(plane.fd.raw()) { + *self.is_disjoint.get_or_init(|| { + if self.planes.len() <= 1 { + return false; + } + let stat = match uapi::fstat(self.planes[0].fd.raw()) { Ok(s) => s, _ => return true, }; - if stat2.st_ino != stat.st_ino { - return true; + for plane in &self.planes[1..] { + let stat2 = match uapi::fstat(plane.fd.raw()) { + Ok(s) => s, + _ => return true, + }; + if stat2.st_ino != stat.st_ino { + return true; + } } - } - false + false + }) } pub fn udmabuf_size(&self) -> Option { diff --git a/src/video/gbm.rs b/src/video/gbm.rs index 8d10f486..59898c28 100644 --- a/src/video/gbm.rs +++ b/src/video/gbm.rs @@ -202,6 +202,7 @@ unsafe fn export_bo(dmabuf_ids: &DmaBufIds, bo: *mut Bo) -> Result