graphics/vesad: Merge OffscreenBuffer into GraphicScreen

This commit is contained in:
bjorn3
2024-12-28 14:51:02 +01:00
parent b5eeaed9e1
commit 5af43fcaa2
4 changed files with 33 additions and 56 deletions
-45
View File
@@ -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::<u32>(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::<u8>()
}
}
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() }
}
}
-1
View File
@@ -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;
+1 -1
View File
@@ -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) {
+32 -9
View File
@@ -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::<u32>(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::<u8>()
}
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 {