From a7d55cb2b884c63c8e16b972453ac161da9e50d0 Mon Sep 17 00:00:00 2001 From: Atreya Bain Date: Mon, 19 Feb 2024 09:09:21 +0530 Subject: [PATCH] [gpu] Add GPU impl --- src/emu/graphics.rs | 33 +++++++++++++++++++++++--------- src/graphics/graphics_adapter.rs | 14 +++++++------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/emu/graphics.rs b/src/emu/graphics.rs index e3d994a..202603d 100644 --- a/src/emu/graphics.rs +++ b/src/emu/graphics.rs @@ -1,31 +1,46 @@ +use std::cell::RefCell; +use crate::graphics::graphics_adapter::GraphicsAdapter; use crate::misc::emulator_error::DeviceType::GRAPHICS; use crate::misc::emulator_error::EmulatorError; use crate::misc::result::EmulatorResult; pub const DEVICE_FRAMEBUFFER_SIZE: usize = 256 * 256; -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct GraphicsProcessor { - framebuffer: Box<[u8; DEVICE_FRAMEBUFFER_SIZE]>, + frame_buffer: RefCell>, + graphics_adapter: Box } -/// Abstracted graphics processor. Refer GraphicsAdapter +/// Abstracted graphics processor. Calls `[GraphicsAdapter]` impl GraphicsProcessor { - pub fn try_new() -> EmulatorResult { + pub fn try_new(graphics_adapter: Box) -> EmulatorResult { let framebuffer = vec![0; DEVICE_FRAMEBUFFER_SIZE].into_boxed_slice() .try_into() .map_err(|_| { EmulatorError::AllocationFailure(GRAPHICS, "Failed to allocate graphics") })?; Ok(GraphicsProcessor { - framebuffer + frame_buffer: RefCell::new(framebuffer), + graphics_adapter }) } - pub fn set_framebuffer(&mut self, memory_slice: &[u8]) { - self.framebuffer.copy_from_slice(memory_slice); + /// take a copy of FB and + pub fn draw(&self, memory_slice: &[u8;DEVICE_FRAMEBUFFER_SIZE])->EmulatorResult<()>{ + self.set_framebuffer(memory_slice); + let fb_immut = self.frame_buffer.borrow(); + self.graphics_adapter.draw(fb_immut) } - pub fn get_framebuffer(&self) -> &[u8; DEVICE_FRAMEBUFFER_SIZE] { - &self.framebuffer + fn set_framebuffer(&self, memory_slice: &[u8;DEVICE_FRAMEBUFFER_SIZE]) { + let mut fb = self.frame_buffer.borrow_mut(); + fb.copy_from_slice(memory_slice); + } + pub fn get_framebuffer(&self) -> Box<[u8; DEVICE_FRAMEBUFFER_SIZE]> { + self.frame_buffer.borrow().clone() } } +#[cfg(test)] +mod test{ + +} \ No newline at end of file diff --git a/src/graphics/graphics_adapter.rs b/src/graphics/graphics_adapter.rs index 13b7921..3b209fb 100644 --- a/src/graphics/graphics_adapter.rs +++ b/src/graphics/graphics_adapter.rs @@ -1,17 +1,17 @@ -use crate::emu::graphics::{DEVICE_FRAMEBUFFER_SIZE, GraphicsProcessor}; +use std::cell::Ref; +use std::fmt::Debug; use crate::misc::result::EmulatorResult; -pub trait GraphicsAdapter{ - fn draw(&mut self,frame_buf:&[u8;DEVICE_FRAMEBUFFER_SIZE])->EmulatorResult<()>; +pub trait GraphicsAdapter: Debug { + fn draw(&self, frame_buf: Ref>) -> EmulatorResult<()>; } #[derive(Debug, Clone)] -pub struct SDLGraphicsAdapter{ - graphics_processor: GraphicsProcessor +pub struct SDLGraphicsAdapter { } -impl GraphicsAdapter for SDLGraphicsAdapter{ - fn draw(&mut self, frame_buf: &[u8; DEVICE_FRAMEBUFFER_SIZE]) -> EmulatorResult<()> { +impl GraphicsAdapter for SDLGraphicsAdapter { + fn draw(&self, frame_buffer: Ref>) -> EmulatorResult<()> { todo!() } }