diff --git a/graphics/driver-graphics/src/lib.rs b/graphics/driver-graphics/src/lib.rs index cb3ddf741d..383e34cb7f 100644 --- a/graphics/driver-graphics/src/lib.rs +++ b/graphics/driver-graphics/src/lib.rs @@ -496,6 +496,23 @@ impl SchemeSync for GraphicsScheme { Ok(size_of::()) } + ipc::DESTROY_DUMB_FRAMEBUFFER => { + if payload.len() < size_of::() { + return Err(Error::new(EINVAL)); + } + let payload = unsafe { + transmute::< + &mut [u8; size_of::()], + &mut ipc::DestroyDumbFramebuffer, + >(payload.as_mut_array().unwrap()) + }; + + if fbs.remove(&{ payload.fb_id }).is_none() { + return Err(Error::new(ENOENT)); + } + + Ok(size_of::()) + } ipc::UPDATE_PLANE => { if payload.len() < size_of::() { return Err(Error::new(EINVAL)); diff --git a/graphics/fbbootlogd/src/scheme.rs b/graphics/fbbootlogd/src/scheme.rs index 1cf2f21cf2..f6180e280b 100644 --- a/graphics/fbbootlogd/src/scheme.rs +++ b/graphics/fbbootlogd/src/scheme.rs @@ -95,6 +95,8 @@ impl FbbootlogScheme { }, ); + let _ = map.display_handle.destroy_dumb_framebuffer(map.fb); + map.fb = fb; map.inner = new_map; diff --git a/graphics/graphics-ipc/src/v2.rs b/graphics/graphics-ipc/src/v2.rs index 689e865bc2..ca23f82e25 100644 --- a/graphics/graphics-ipc/src/v2.rs +++ b/graphics/graphics-ipc/src/v2.rs @@ -124,6 +124,19 @@ impl V2GraphicsHandle { Ok(unsafe { DisplayMap::new(offscreen, width as usize, height as usize) }) } + pub fn destroy_dumb_framebuffer(&self, id: usize) -> io::Result { + let mut cmd = ipc::DestroyDumbFramebuffer { fb_id: id }; + unsafe { + sys_call( + &self.file, + &mut cmd, + 0, + &[ipc::DESTROY_DUMB_FRAMEBUFFER, 0, 0], + )?; + } + Ok(cmd.fb_id) + } + pub fn update_plane(&self, display_id: usize, fb_id: usize, damage: Damage) -> io::Result<()> { let mut cmd = ipc::UpdatePlane { display_id, @@ -172,7 +185,13 @@ pub mod ipc { pub offset: usize, } - pub const UPDATE_PLANE: u64 = 5; + pub const DESTROY_DUMB_FRAMEBUFFER: u64 = 5; + #[repr(C, packed)] + pub struct DestroyDumbFramebuffer { + pub fb_id: usize, + } + + pub const UPDATE_PLANE: u64 = 6; #[repr(C, packed)] pub struct UpdatePlane { pub display_id: usize,