graphics: Rename resource to framebuffer

This matches the Linux DRM name.
This commit is contained in:
bjorn3
2025-03-06 21:41:26 +01:00
parent 92295f2ea4
commit be5b865058
3 changed files with 69 additions and 54 deletions
+33 -28
View File
@@ -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<usize>;
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<T: GraphicsAdapter> {
handles: BTreeMap<usize, Handle>,
active_vt: usize,
vts_res: HashMap<usize, HashMap<usize, T::Resource>>,
vts_fb: HashMap<usize, HashMap<usize, T::Framebuffer>>,
}
enum Handle {
@@ -53,7 +58,7 @@ impl<T: GraphicsAdapter> GraphicsScheme<T> {
next_id: 0,
handles: BTreeMap::new(),
active_vt: 0,
vts_res: HashMap::new(),
vts_fb: HashMap::new(),
}
}
@@ -75,16 +80,16 @@ impl<T: GraphicsAdapter> GraphicsScheme<T> {
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<T: GraphicsAdapter> GraphicsScheme<T> {
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<T: GraphicsAdapter> Scheme for GraphicsScheme<T> {
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<T: GraphicsAdapter> Scheme for GraphicsScheme<T> {
fn fpath(&mut self, id: usize, buf: &mut [u8]) -> syscall::Result<usize> {
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<T: GraphicsAdapter> Scheme for GraphicsScheme<T> {
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<T: GraphicsAdapter> Scheme for GraphicsScheme<T> {
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<T: GraphicsAdapter> Scheme for GraphicsScheme<T> {
)
};
self.adapter.update_plane(*screen, resource, damage);
self.adapter.update_plane(*screen, framebuffer, damage);
Ok(buf.len())
}
@@ -255,8 +260,8 @@ impl<T: GraphicsAdapter> Scheme for GraphicsScheme<T> {
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)
}
}
+13 -8
View File
@@ -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<usize> {
(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::<u8>()
fn map_dumb_framebuffer(&mut self, framebuffer: &Self::Framebuffer) -> *mut u8 {
framebuffer.ptr.as_ptr().cast::<u8>()
}
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
}
+23 -18
View File
@@ -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<GpuRect> 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<usize> {
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);