From be5b8650589dc0849967db0c11eb4b4a1925977e Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Thu, 6 Mar 2025 21:41:26 +0100 Subject: [PATCH] graphics: Rename resource to framebuffer This matches the Linux DRM name. --- graphics/driver-graphics/src/lib.rs | 61 ++++++++++++++++------------- graphics/vesad/src/scheme.rs | 21 ++++++---- graphics/virtio-gpud/src/scheme.rs | 41 ++++++++++--------- 3 files changed, 69 insertions(+), 54 deletions(-) diff --git a/graphics/driver-graphics/src/lib.rs b/graphics/driver-graphics/src/lib.rs index 035ceb6a91..d3b8fe3777 100644 --- a/graphics/driver-graphics/src/lib.rs +++ b/graphics/driver-graphics/src/lib.rs @@ -9,18 +9,23 @@ use redox_scheme::{RequestKind, Response, Scheme, SignalBehavior, Socket}; use syscall::{Error, MapFlags, Result, EAGAIN, EBADF, EINVAL}; pub trait GraphicsAdapter { - type Resource: Resource; + type Framebuffer: Framebuffer; fn displays(&self) -> Vec; fn display_size(&self, display_id: usize) -> (u32, u32); - fn create_resource(&mut self, width: u32, height: u32) -> Self::Resource; - fn map_resource(&mut self, resource: &Self::Resource) -> *mut u8; + fn create_dumb_framebuffer(&mut self, width: u32, height: u32) -> Self::Framebuffer; + fn map_dumb_framebuffer(&mut self, framebuffer: &Self::Framebuffer) -> *mut u8; - fn update_plane(&mut self, display_id: usize, resource: &Self::Resource, damage: &[Damage]); + fn update_plane( + &mut self, + display_id: usize, + framebuffer: &Self::Framebuffer, + damage: &[Damage], + ); } -pub trait Resource { +pub trait Framebuffer { fn width(&self) -> u32; fn height(&self) -> u32; } @@ -34,7 +39,7 @@ pub struct GraphicsScheme { handles: BTreeMap, active_vt: usize, - vts_res: HashMap>, + vts_fb: HashMap>, } enum Handle { @@ -53,7 +58,7 @@ impl GraphicsScheme { next_id: 0, handles: BTreeMap::new(), active_vt: 0, - vts_res: HashMap::new(), + vts_fb: HashMap::new(), } } @@ -75,16 +80,16 @@ impl GraphicsScheme { log::info!("activate {}", vt_event.vt); for display_id in self.adapter.displays() { - let resource = self - .vts_res + let framebuffer = self + .vts_fb .entry(vt_event.vt) .or_default() .entry(display_id) .or_insert_with(|| { let (width, height) = self.adapter.display_size(display_id); - self.adapter.create_resource(width, height) + self.adapter.create_dumb_framebuffer(width, height) }); - Self::update_whole_screen(&mut self.adapter, display_id, resource); + Self::update_whole_screen(&mut self.adapter, display_id, framebuffer); self.active_vt = vt_event.vt; } @@ -135,15 +140,15 @@ impl GraphicsScheme { Ok(()) } - fn update_whole_screen(adapter: &mut T, screen: usize, resource: &T::Resource) { + fn update_whole_screen(adapter: &mut T, screen: usize, framebuffer: &T::Framebuffer) { adapter.update_plane( screen, - resource, + framebuffer, &[Damage { x: 0, y: 0, - width: resource.width(), - height: resource.height(), + width: framebuffer.width(), + height: framebuffer.height(), }], ); } @@ -167,13 +172,13 @@ impl Scheme for GraphicsScheme { return Err(Error::new(EINVAL)); } - self.vts_res + self.vts_fb .entry(vt) .or_default() .entry(id) .or_insert_with(|| { let (width, height) = self.adapter.display_size(id); - self.adapter.create_resource(width, height) + self.adapter.create_dumb_framebuffer(width, height) }); self.next_id += 1; @@ -184,12 +189,12 @@ impl Scheme for GraphicsScheme { fn fpath(&mut self, id: usize, buf: &mut [u8]) -> syscall::Result { let Handle::Screen { vt, screen } = self.handles.get(&id).ok_or(Error::new(EBADF))?; - let resource = &self.vts_res[vt][screen]; + let framebuffer = &self.vts_fb[vt][screen]; let path = format!( "{}:{vt}.{screen}/{}/{}", self.scheme_name, - resource.width(), - resource.height() + framebuffer.width(), + framebuffer.height() ); buf[..path.len()].copy_from_slice(path.as_bytes()); Ok(path.len()) @@ -199,11 +204,11 @@ impl Scheme for GraphicsScheme { let Handle::Screen { vt, screen } = self.handles.get(&id).ok_or(Error::new(EBADF))?; if *vt != self.active_vt { // This is a protection against background VT's spamming us with flush requests. We will - // flush the resource on the next VT switch anyway + // flush the framebuffer on the next VT switch anyway return Ok(0); } - let resource = &self.vts_res[vt][screen]; - Self::update_whole_screen(&mut self.adapter, *screen, resource); + let framebuffer = &self.vts_fb[vt][screen]; + Self::update_whole_screen(&mut self.adapter, *screen, framebuffer); Ok(0) } @@ -223,11 +228,11 @@ impl Scheme for GraphicsScheme { if *vt != self.active_vt { // This is a protection against background VT's spamming us with flush requests. We will - // flush the resource on the next VT switch anyway + // flush the framebuffer on the next VT switch anyway return Ok(buf.len()); } - let resource = &self.vts_res[vt][screen]; + let framebuffer = &self.vts_fb[vt][screen]; let damage = unsafe { core::slice::from_raw_parts( @@ -236,7 +241,7 @@ impl Scheme for GraphicsScheme { ) }; - self.adapter.update_plane(*screen, resource, damage); + self.adapter.update_plane(*screen, framebuffer, damage); Ok(buf.len()) } @@ -255,8 +260,8 @@ impl Scheme for GraphicsScheme { log::info!("KSMSG MMAP {} {:?} {} {}", id, flags, offset, size); let handle = self.handles.get(&id).ok_or(Error::new(EINVAL))?; let Handle::Screen { vt, screen } = handle; - let resource = &self.vts_res[vt][screen]; - let ptr = T::map_resource(&mut self.adapter, resource); + let framebuffer = &self.vts_fb[vt][screen]; + let ptr = T::map_dumb_framebuffer(&mut self.adapter, framebuffer); Ok(ptr as usize) } } diff --git a/graphics/vesad/src/scheme.rs b/graphics/vesad/src/scheme.rs index 938b8a6678..32e3a22436 100644 --- a/graphics/vesad/src/scheme.rs +++ b/graphics/vesad/src/scheme.rs @@ -2,7 +2,7 @@ use std::alloc::{self, Layout}; use std::convert::TryInto; use std::ptr::{self, NonNull}; -use driver_graphics::{GraphicsAdapter, Resource}; +use driver_graphics::{Framebuffer, GraphicsAdapter}; use graphics_ipc::v1::Damage; use syscall::PAGE_SIZE; @@ -13,7 +13,7 @@ pub struct FbAdapter { } impl GraphicsAdapter for FbAdapter { - type Resource = GraphicScreen; + type Framebuffer = GraphicScreen; fn displays(&self) -> Vec { (0..self.framebuffers.len()).collect() @@ -26,16 +26,21 @@ impl GraphicsAdapter for FbAdapter { ) } - fn create_resource(&mut self, width: u32, height: u32) -> Self::Resource { + fn create_dumb_framebuffer(&mut self, width: u32, height: u32) -> Self::Framebuffer { GraphicScreen::new(width as usize, height as usize) } - fn map_resource(&mut self, resource: &Self::Resource) -> *mut u8 { - resource.ptr.as_ptr().cast::() + fn map_dumb_framebuffer(&mut self, framebuffer: &Self::Framebuffer) -> *mut u8 { + framebuffer.ptr.as_ptr().cast::() } - fn update_plane(&mut self, display_id: usize, resource: &Self::Resource, damage: &[Damage]) { - resource.sync(&mut self.framebuffers[display_id], damage) + fn update_plane( + &mut self, + display_id: usize, + framebuffer: &Self::Framebuffer, + damage: &[Damage], + ) { + framebuffer.sync(&mut self.framebuffers[display_id], damage) } } @@ -73,7 +78,7 @@ impl Drop for GraphicScreen { } } -impl Resource for GraphicScreen { +impl Framebuffer for GraphicScreen { fn width(&self) -> u32 { self.width as u32 } diff --git a/graphics/virtio-gpud/src/scheme.rs b/graphics/virtio-gpud/src/scheme.rs index 6bd41c91a7..b6eda2e2b0 100644 --- a/graphics/virtio-gpud/src/scheme.rs +++ b/graphics/virtio-gpud/src/scheme.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use common::{dma::Dma, sgl}; -use driver_graphics::{GraphicsAdapter, GraphicsScheme, Resource}; +use driver_graphics::{Framebuffer, GraphicsAdapter, GraphicsScheme}; use graphics_ipc::v1::Damage; use inputd::DisplayHandle; @@ -23,14 +23,14 @@ impl Into for Damage { } } -pub struct VirtGpuResource { +pub struct VirtGpuFramebuffer { id: ResourceId, sgl: sgl::Sgl, width: u32, height: u32, } -impl Resource for VirtGpuResource { +impl Framebuffer for VirtGpuFramebuffer { fn width(&self) -> u32 { self.width } @@ -95,7 +95,7 @@ impl VirtGpuAdapter<'_> { } impl GraphicsAdapter for VirtGpuAdapter<'_> { - type Resource = VirtGpuResource; + type Framebuffer = VirtGpuFramebuffer; fn displays(&self) -> Vec { self.displays.iter().enumerate().map(|(i, _)| i).collect() @@ -108,7 +108,7 @@ impl GraphicsAdapter for VirtGpuAdapter<'_> { ) } - fn create_resource(&mut self, width: u32, height: u32) -> Self::Resource { + fn create_dumb_framebuffer(&mut self, width: u32, height: u32) -> Self::Framebuffer { futures::executor::block_on(async { let bpp = 32; let fb_size = width as usize * height as usize * bpp / 8; @@ -157,7 +157,7 @@ impl GraphicsAdapter for VirtGpuAdapter<'_> { self.control_queue.send(command).await; assert_eq!(header.ty, CommandTy::RespOkNodata); - VirtGpuResource { + VirtGpuFramebuffer { id: res_id, sgl, width, @@ -166,19 +166,24 @@ impl GraphicsAdapter for VirtGpuAdapter<'_> { }) } - fn map_resource(&mut self, resource: &Self::Resource) -> *mut u8 { - resource.sgl.as_ptr() + fn map_dumb_framebuffer(&mut self, framebuffer: &Self::Framebuffer) -> *mut u8 { + framebuffer.sgl.as_ptr() } - fn update_plane(&mut self, display_id: usize, resource: &Self::Resource, damage: &[Damage]) { + fn update_plane( + &mut self, + display_id: usize, + framebuffer: &Self::Framebuffer, + damage: &[Damage], + ) { futures::executor::block_on(async { let req = Dma::new(XferToHost2d::new( - resource.id, + framebuffer.id, GpuRect { x: 0, y: 0, - width: resource.width, - height: resource.height, + width: framebuffer.width, + height: framebuffer.height, }, 0, )) @@ -187,22 +192,22 @@ impl GraphicsAdapter for VirtGpuAdapter<'_> { assert_eq!(header.ty, CommandTy::RespOkNodata); // FIXME once we support resizing we also need to check that the current and target size match - if self.displays[display_id].active_resource != Some(resource.id) { + if self.displays[display_id].active_resource != Some(framebuffer.id) { let scanout_request = Dma::new(SetScanout::new( display_id as u32, - resource.id, - GpuRect::new(0, 0, resource.width, resource.height), + framebuffer.id, + GpuRect::new(0, 0, framebuffer.width, framebuffer.height), )) .unwrap(); let header = self.send_request(scanout_request).await.unwrap(); assert_eq!(header.ty, CommandTy::RespOkNodata); - self.displays[display_id].active_resource = Some(resource.id); + self.displays[display_id].active_resource = Some(framebuffer.id); } for damage in damage { let flush = ResourceFlush::new( - resource.id, - damage.clip(resource.width, resource.height).into(), + framebuffer.id, + damage.clip(framebuffer.width, framebuffer.height).into(), ); let header = self.send_request(Dma::new(flush).unwrap()).await.unwrap(); assert_eq!(header.ty, CommandTy::RespOkNodata);