graphics: Rename resource to framebuffer
This matches the Linux DRM name.
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user