From 359e845437fdb945f884c68791aae76866bd686e Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sat, 14 Mar 2026 15:24:08 +0100 Subject: [PATCH 1/3] drivers/graphics: Rename buffer related fields and variables And clarify that buffers have a separate index namespace by removing usage of dumb_buffer_id. --- drivers/graphics/driver-graphics/src/lib.rs | 52 ++++++++++----------- drivers/graphics/virtio-gpud/src/scheme.rs | 2 +- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index db3bc3c9b1..339dfc45c4 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -92,7 +92,7 @@ pub struct CursorPlane { pub y: i32, pub hot_x: i32, pub hot_y: i32, - pub framebuffer: Option>, + pub buffer: Option>, } pub struct GraphicsScheme { @@ -326,7 +326,7 @@ enum Handle { V2 { vt: usize, next_id: u32, - fbs: HashMap>, + buffers: HashMap>, }, SchemeRoot, } @@ -344,7 +344,7 @@ impl GraphicsSchemeInner { y: 0, hot_x: 0, hot_y: 0, - framebuffer: None, + buffer: None, }, }) } @@ -391,7 +391,7 @@ impl SchemeSync for GraphicsSchemeInner { Handle::V2 { vt, next_id: 0, - fbs: HashMap::new(), + buffers: HashMap::new(), } } else { let mut parts = path.split('/'); @@ -427,7 +427,7 @@ impl SchemeSync for GraphicsSchemeInner { Handle::V2 { vt, next_id: _, - fbs: _, + buffers: _, } => format!("/scheme/{}/v2/{vt}", self.scheme_name), Handle::SchemeRoot => return Err(Error::new(EOPNOTSUPP)), }; @@ -462,13 +462,13 @@ impl SchemeSync for GraphicsSchemeInner { id_index(i) | (1 << 13) } - fn dumb_buffer_id(i: u32) -> u32 { - id_index(i) | (1 << 14) - } - match self.handles.get_mut(&id).ok_or(Error::new(EBADF))? { Handle::V1Screen { .. } | Handle::SchemeRoot => return Err(Error::new(EOPNOTSUPP)), - Handle::V2 { vt, next_id, fbs } => match metadata[0] { + Handle::V2 { + vt, + next_id, + buffers, + } => match metadata[0] { ipc::VERSION => ipc::DrmVersion::with(payload, |mut data| { data.set_version_major(1); data.set_version_minor(4); @@ -561,9 +561,9 @@ impl SchemeSync for GraphicsSchemeInner { let update_buffer = data.flags() & DRM_MODE_CURSOR_BO != 0; if update_buffer { - cursor_plane.framebuffer = if data.handle() == 0 { + cursor_plane.buffer = if data.handle() == 0 { None - } else if let Some(buffer) = fbs.get(&id_index(data.handle())) { + } else if let Some(buffer) = buffers.get(&data.handle()) { Some(buffer.clone()) } else { return Err(Error::new(EINVAL)); @@ -718,7 +718,7 @@ impl SchemeSync for GraphicsSchemeInner { Ok(0) }), ipc::MODE_ADD_FB => ipc::DrmModeFbCmd::with(payload, |mut data| { - data.set_fb_id(fb_handle_id(id_index(data.handle()))); + data.set_fb_id(fb_handle_id(data.handle())); Ok(0) }), ipc::MODE_CREATE_DUMB => ipc::DrmModeCreateDumb::with(payload, |mut data| { @@ -729,8 +729,8 @@ impl SchemeSync for GraphicsSchemeInner { let fb = self.adapter.create_dumb_buffer(data.width(), data.height()); *next_id += 1; - fbs.insert(*next_id, Arc::new(fb)); - data.set_handle(dumb_buffer_id(*next_id as u32)); + buffers.insert(*next_id, Arc::new(fb)); + data.set_handle(*next_id as u32); data.set_pitch(data.width() * 4); data.set_size(u64::from(data.width()) * u64::from(data.height()) * 4); Ok(0) @@ -740,25 +740,24 @@ impl SchemeSync for GraphicsSchemeInner { return Err(Error::new(EINVAL)); } - let fb_id = id_index(data.handle()); + let buffer_id = data.handle(); - if !fbs.contains_key(&fb_id) { + if !buffers.contains_key(&buffer_id) { return Err(Error::new(EINVAL)); } // FIXME use a better scheme for creating map offsets assert!( - ((fbs[&fb_id].width() * fbs[&fb_id].height() * 4) as usize) + ((buffers[&buffer_id].width() * buffers[&buffer_id].height() * 4) as usize) < MAP_FAKE_OFFSET_MULTIPLIER ); - data.set_offset((fb_id as usize * MAP_FAKE_OFFSET_MULTIPLIER) as u64); + data.set_offset((buffer_id as usize * MAP_FAKE_OFFSET_MULTIPLIER) as u64); Ok(0) }), ipc::MODE_DESTROY_DUMB => ipc::DrmModeDestroyDumb::with(payload, |data| { - let fb_id = id_index(data.handle()); - if fbs.remove(&fb_id).is_none() { + if buffers.remove(&data.handle()).is_none() { return Err(Error::new(ENOENT)); } Ok(0) @@ -809,9 +808,9 @@ impl SchemeSync for GraphicsSchemeInner { let update_buffer = data.flags() & DRM_MODE_CURSOR_BO != 0; if update_buffer { - cursor_plane.framebuffer = if data.handle() == 0 { + cursor_plane.buffer = if data.handle() == 0 { None - } else if let Some(buffer) = fbs.get(&id_index(data.handle())) { + } else if let Some(buffer) = buffers.get(&data.handle()) { Some(buffer.clone()) } else { return Err(Error::new(EINVAL)); @@ -858,7 +857,7 @@ impl SchemeSync for GraphicsSchemeInner { let framebuffer = if payload.fb_id == 0 { None - } else if let Some(framebuffer) = fbs.get(&id_index(payload.fb_id)) { + } else if let Some(framebuffer) = buffers.get(&id_index(payload.fb_id)) { Some(framebuffer) } else { return Err(Error::new(EINVAL)); @@ -902,9 +901,10 @@ impl SchemeSync for GraphicsSchemeInner { Handle::V2 { vt: _, next_id: _, - fbs, + buffers, } => ( - fbs.get(&((offset as usize / MAP_FAKE_OFFSET_MULTIPLIER) as u32)) + buffers + .get(&((offset as usize / MAP_FAKE_OFFSET_MULTIPLIER) as u32)) .ok_or(Error::new(EINVAL)) .unwrap(), offset & (MAP_FAKE_OFFSET_MULTIPLIER as u64 - 1), diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index c507ada4a8..8c12e6085d 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -492,7 +492,7 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> { } fn handle_cursor(&mut self, cursor: &CursorPlane, dirty_fb: bool) { - if let Some(buffer) = &cursor.framebuffer { + if let Some(buffer) = &cursor.buffer { if dirty_fb { self.update_cursor(buffer, cursor.x, cursor.y, cursor.hot_x, cursor.hot_y); } else { From d11da9440b72ce9eca8acff90b36467e0e15526f Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sat, 14 Mar 2026 15:45:10 +0100 Subject: [PATCH 2/3] drivers/graphics: Fix mixup between buffers and framebuffers --- drivers/graphics/console-draw/src/lib.rs | 15 +++++++++------ drivers/graphics/fbbootlogd/src/scheme.rs | 4 ++-- drivers/graphics/fbcond/src/display.rs | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/graphics/console-draw/src/lib.rs b/drivers/graphics/console-draw/src/lib.rs index 74c525a63e..7231f71c36 100644 --- a/drivers/graphics/console-draw/src/lib.rs +++ b/drivers/graphics/console-draw/src/lib.rs @@ -290,11 +290,12 @@ impl TextScreen { } } - let mut new_fb = + let mut new_buffer = map.display_handle .create_dumb_buffer((width, height), DrmFourcc::Argb8888, 32)?; + let new_fb = map.display_handle.add_framebuffer(&new_buffer, 24, 32)?; - let new_mapping = map.display_handle.map_dumb_buffer(&mut new_fb)?; + let new_mapping = map.display_handle.map_dumb_buffer(&mut new_buffer)?; let mut new_mapping = unsafe { mem::transmute::, DumbMapping<'static>>(new_mapping) }; @@ -307,8 +308,8 @@ impl TextScreen { new_mapping.as_mut_ptr() as *mut u32, new_mapping.len() / 4, ), - width: new_fb.size().0 as usize, - height: new_fb.size().1 as usize, + width: new_buffer.size().0 as usize, + height: new_buffer.size().1 as usize, }; if new_map.height >= old_map.height { @@ -327,10 +328,12 @@ impl TextScreen { } } - let old_fb = mem::replace(&mut map.buffer, new_fb); + let old_buffer = mem::replace(&mut map.buffer, new_buffer); + let old_fb = mem::replace(&mut map.fb, new_fb); map.mapping = new_mapping; - let _ = map.display_handle.destroy_dumb_buffer(old_fb); + let _ = map.display_handle.destroy_dumb_buffer(old_buffer); + let _ = map.display_handle.destroy_framebuffer(old_fb); Ok(()) } diff --git a/drivers/graphics/fbbootlogd/src/scheme.rs b/drivers/graphics/fbbootlogd/src/scheme.rs index f3485c94d1..7191c0aa47 100644 --- a/drivers/graphics/fbbootlogd/src/scheme.rs +++ b/drivers/graphics/fbbootlogd/src/scheme.rs @@ -146,7 +146,7 @@ impl FbbootlogScheme { } } map.display_handle - .update_plane(0, u32::from(map.buffer.handle()), total_damage) + .update_plane(0, u32::from(map.fb), total_damage) .unwrap(); } @@ -248,7 +248,7 @@ impl SchemeSync for FbbootlogScheme { if let Some(map) = &self.display_map { map.display_handle - .update_plane(0, u32::from(map.buffer.handle()), damage) + .update_plane(0, u32::from(map.fb), damage) .unwrap(); } } diff --git a/drivers/graphics/fbcond/src/display.rs b/drivers/graphics/fbcond/src/display.rs index 5bbd47c4a2..6c09225c99 100644 --- a/drivers/graphics/fbcond/src/display.rs +++ b/drivers/graphics/fbcond/src/display.rs @@ -82,7 +82,7 @@ impl Display { pub fn sync_rect(&mut self, damage: Damage) { if let Some(map) = &self.map { map.display_handle - .update_plane(0, u32::from(map.buffer.handle()), damage) + .update_plane(0, u32::from(map.fb), damage) .unwrap(); } } From 7b8ebe9dcadc90e13886351f7fe81de12da82fae Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sat, 14 Mar 2026 16:09:46 +0100 Subject: [PATCH 3/3] drivers/graphics: Return size of CRTC from fpath This is the actual size of the Orbital desktop. Previously resizing a virtio-gpu window after Orbital started but before logging in would cause the launcher to be out of view. --- drivers/graphics/driver-graphics/src/lib.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 339dfc45c4..40a847b322 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -421,7 +421,11 @@ impl SchemeSync for GraphicsSchemeInner { fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> syscall::Result { let path = match self.handles.get(&id).ok_or(Error::new(EBADF))? { Handle::V1Screen { vt, screen } => { - let (width, height) = self.adapter.display_size(*screen); + let crtc_id = self.objects.crtc_ids()[*screen]; + let crtc = self.objects.get_crtc(crtc_id).unwrap().lock().unwrap(); + let (width, height) = crtc + .mode + .map_or((640, 480), |mode| (mode.hdisplay, mode.vdisplay)); format!("{}:{vt}.{screen}/{width}/{height}", self.scheme_name) } Handle::V2 {