From e5de85299b1c61d920f59af76c4e626d076668b6 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sat, 13 Sep 2025 12:49:34 +0200 Subject: [PATCH] metal: handle cursor plane allocation failures gracefully --- src/backends/metal/transaction.rs | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/backends/metal/transaction.rs b/src/backends/metal/transaction.rs index 1e80694d..f4d693af 100644 --- a/src/backends/metal/transaction.rs +++ b/src/backends/metal/transaction.rs @@ -418,11 +418,11 @@ impl MetalDeviceTransaction { crtc.new.mode_blob = Some(Rc::new(blob)); mode.clone() }; - for plane in [crtc_planes.primary, crtc_planes.cursor] { - if plane.is_none() { + for plane_id in [&mut crtc_planes.primary, &mut crtc_planes.cursor] { + if plane_id.is_none() { continue; } - let plane = slf.planes.get_mut(&plane).unwrap(); + let plane = slf.planes.get_mut(plane_id).unwrap(); plane.new.assigned_crtc = crtc.obj.id; plane.changed.extend(crtc.changed.iter().cloned()); let (x, y, width, height, format, old_buffers); @@ -484,7 +484,8 @@ impl MetalDeviceTransaction { None => { let modifiers = &plane.obj.formats.get(&format.drm).unwrap().modifiers; connector.changed.set(true); - let buffers = slf + let is_cursor = plane.obj.ty == PlaneType::Cursor; + let res = slf .dev .dev .backend @@ -495,15 +496,28 @@ impl MetalDeviceTransaction { width, height, render_ctx, - plane.obj.ty == PlaneType::Cursor, + is_cursor, ) .map_err(|e| { BackendConnectorTransactionError::AllocateScanoutBuffers( connector.obj.kernel_id(), Box::new(e), ) - })?; - let buffers = Rc::new(buffers); + }); + if let Err(e) = &res + && is_cursor + { + log::error!( + "Could not allocate buffers for cursor plane of {}: {}", + connector.obj.kernel_id(), + ErrorFmt(e), + ); + plane.new = DrmPlaneState::default(); + unused_planes.insert(*plane_id, ()); + *plane_id = DrmPlane::NONE; + continue; + } + let buffers = Rc::new(res?); plane.new.buffers = Some(buffers.clone()); new_buffers = Some(buffers.clone()); buffers