graphics/vesad: Merge OffscreenBuffer into GraphicScreen
This commit is contained in:
@@ -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() }
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user