diff --git a/graphics/vesad/src/display.rs b/graphics/vesad/src/display.rs deleted file mode 100644 index f1276bcdd4..0000000000 --- a/graphics/vesad/src/display.rs +++ /dev/null @@ -1,45 +0,0 @@ -use std::alloc::{self, Layout}; -use std::ptr; -use std::ptr::NonNull; - -pub struct OffscreenBuffer { - ptr: NonNull<[u32]>, -} - -impl OffscreenBuffer { - #[inline] - fn layout(len: usize) -> Layout { - // optimizes to an integer mul - Layout::array::(len).unwrap().align_to(4096).unwrap() - } - - #[inline] - pub fn new(len: usize) -> Self { - let layout = Self::layout(len); - let ptr = unsafe { alloc::alloc_zeroed(layout) }; - let ptr = ptr::slice_from_raw_parts_mut(ptr.cast(), len); - let ptr = NonNull::new(ptr).unwrap_or_else(|| alloc::handle_alloc_error(layout)); - OffscreenBuffer { ptr } - } - - pub fn ptr(&self) -> *mut u8 { - self.ptr.as_ptr().cast::() - } -} -impl Drop for OffscreenBuffer { - fn drop(&mut self) { - let layout = Self::layout(self.ptr.len()); - unsafe { alloc::dealloc(self.ptr.as_ptr().cast(), layout) }; - } -} -impl std::ops::Deref for OffscreenBuffer { - type Target = [u32]; - fn deref(&self) -> &[u32] { - unsafe { self.ptr.as_ref() } - } -} -impl std::ops::DerefMut for OffscreenBuffer { - fn deref_mut(&mut self) -> &mut [u32] { - unsafe { self.ptr.as_mut() } - } -} diff --git a/graphics/vesad/src/main.rs b/graphics/vesad/src/main.rs index e92f92b642..8cafa6b2ee 100644 --- a/graphics/vesad/src/main.rs +++ b/graphics/vesad/src/main.rs @@ -11,7 +11,6 @@ use std::os::fd::AsRawFd; use crate::framebuffer::FrameBuffer; use crate::scheme::FbAdapter; -mod display; mod framebuffer; mod scheme; mod screen; diff --git a/graphics/vesad/src/scheme.rs b/graphics/vesad/src/scheme.rs index 495a5a48cf..15d7f2867a 100644 --- a/graphics/vesad/src/scheme.rs +++ b/graphics/vesad/src/scheme.rs @@ -25,7 +25,7 @@ impl GraphicsAdapter for FbAdapter { } fn map_resource(&mut self, resource: &Self::Resource) -> *mut u8 { - resource.offscreen.ptr() + resource.ptr() } fn set_scanout(&mut self, display_id: usize, resource: &Self::Resource) { diff --git a/graphics/vesad/src/screen.rs b/graphics/vesad/src/screen.rs index 3523f24a83..e90a4b39c2 100644 --- a/graphics/vesad/src/screen.rs +++ b/graphics/vesad/src/screen.rs @@ -1,25 +1,44 @@ +use std::alloc::{self, Layout}; use std::convert::TryInto; -use std::ptr; +use std::ptr::{self, NonNull}; use driver_graphics::Resource; use inputd::Damage; +use syscall::PAGE_SIZE; -use crate::display::OffscreenBuffer; use crate::framebuffer::FrameBuffer; pub struct GraphicScreen { pub width: usize, pub height: usize, - pub offscreen: OffscreenBuffer, + ptr: NonNull<[u32]>, } impl GraphicScreen { pub fn new(width: usize, height: usize) -> GraphicScreen { - GraphicScreen { - width, - height, - offscreen: OffscreenBuffer::new(width * height), - } + let len = width * height; + let layout = Self::layout(len); + let ptr = unsafe { alloc::alloc_zeroed(layout) }; + let ptr = ptr::slice_from_raw_parts_mut(ptr.cast(), len); + let ptr = NonNull::new(ptr).unwrap_or_else(|| alloc::handle_alloc_error(layout)); + + GraphicScreen { width, height, ptr } + } + + #[inline] + fn layout(len: usize) -> Layout { + // optimizes to an integer mul + Layout::array::(len) + .unwrap() + .align_to(PAGE_SIZE) + .unwrap() + } +} + +impl Drop for GraphicScreen { + fn drop(&mut self) { + let layout = Self::layout(self.ptr.len()); + unsafe { alloc::dealloc(self.ptr.as_ptr().cast(), layout) }; } } @@ -34,6 +53,10 @@ impl Resource for GraphicScreen { } impl GraphicScreen { + pub fn ptr(&self) -> *mut u8 { + self.ptr.as_ptr().cast::() + } + pub fn sync(&self, framebuffer: &mut FrameBuffer, sync_rects: &[Damage]) { for sync_rect in sync_rects { let sync_rect = sync_rect.clip( @@ -50,7 +73,7 @@ impl GraphicScreen { let row_pixel_count = w; - let mut offscreen_ptr = self.offscreen.as_ptr(); + let mut offscreen_ptr = self.ptr.as_ptr() as *mut u32; let mut onscreen_ptr = framebuffer.onscreen as *mut u32; // FIXME use as_mut_ptr once stable unsafe {