diff --git a/Cargo.lock b/Cargo.lock index d8b2084..956e734 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,6 +6,7 @@ version = 3 name = "able_graphics_library" version = "0.1.2" dependencies = [ + "embedded-graphics", "versioning", ] @@ -35,7 +36,7 @@ dependencies = [ name = "aidl" version = "0.1.0" dependencies = [ - "logos 0.13.0", + "logos", ] [[package]] @@ -76,6 +77,12 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" name = "axel2wat" version = "0.1.0" +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + [[package]] name = "base64" version = "0.13.1" @@ -98,6 +105,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + [[package]] name = "cfg-if" version = "1.0.0" @@ -139,6 +152,38 @@ dependencies = [ name = "derelict_microarchitecture" version = "0.1.0" +[[package]] +name = "embedded-graphics" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "750082c65094fbcc4baf9ba31583ce9a8bb7f52cadfb96f6164b1bc7f922f32b" +dependencies = [ + "az", + "byteorder", + "embedded-graphics-core", + "float-cmp", + "micromath", +] + +[[package]] +name = "embedded-graphics-core" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b1239db5f3eeb7e33e35bd10bd014e7b2537b17e071f726a09351431337cfa" +dependencies = [ + "az", + "byteorder", +] + +[[package]] +name = "float-cmp" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4" +dependencies = [ + "num-traits", +] + [[package]] name = "fnv" version = "1.0.7" @@ -225,22 +270,13 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "logos" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf8b031682c67a8e3d5446840f9573eb7fe26efe7ec8d195c9ac4c0647c502f1" -dependencies = [ - "logos-derive 0.12.1", -] - [[package]] name = "logos" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c000ca4d908ff18ac99b93a062cb8958d331c3220719c52e77cb19cc6ac5d2c1" dependencies = [ - "logos-derive 0.13.0", + "logos-derive", ] [[package]] @@ -257,20 +293,6 @@ dependencies = [ "syn 2.0.15", ] -[[package]] -name = "logos-derive" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c" -dependencies = [ - "beef", - "fnv", - "proc-macro2", - "quote", - "regex-syntax", - "syn 1.0.105", -] - [[package]] name = "logos-derive" version = "0.13.0" @@ -295,10 +317,25 @@ dependencies = [ "versioning", ] +[[package]] +name = "micromath" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc4010833aea396656c2f91ee704d51a6f1329ec2ab56ffd00bfd56f7481ea94" + [[package]] name = "no_video" version = "0.1.0" +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -590,7 +627,7 @@ checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" name = "uri" version = "0.1.0" dependencies = [ - "logos 0.13.0", + "logos", ] [[package]] @@ -631,7 +668,7 @@ dependencies = [ name = "wat2wasm" version = "0.1.0" dependencies = [ - "logos 0.12.1", + "logos", ] [[package]] diff --git a/libraries/able_graphics_library/Cargo.toml b/libraries/able_graphics_library/Cargo.toml index 3c9132d..48f68b7 100644 --- a/libraries/able_graphics_library/Cargo.toml +++ b/libraries/able_graphics_library/Cargo.toml @@ -7,3 +7,4 @@ edition = "2021" [dependencies] versioning = { path = "../versioning" } +embedded-graphics = "0.7.1" diff --git a/libraries/able_graphics_library/src/engine3d/buffer.rs b/libraries/able_graphics_library/src/engine3d/buffer.rs index 261d204..ba9d11a 100644 --- a/libraries/able_graphics_library/src/engine3d/buffer.rs +++ b/libraries/able_graphics_library/src/engine3d/buffer.rs @@ -6,8 +6,6 @@ use alloc::vec::Vec; use super::error::GPUError; -pub type VertexBuffer = Vec; - #[repr(C)] pub struct XYZ { x: f64, @@ -22,28 +20,3 @@ pub struct XYZW { z: f64, w: f64, } - -pub struct GraphicsEngine { - vertex_buffer_attributes_editable: bool, - vertex_buffer: VertexBuffer, - vertex_size: usize, -} -impl GraphicsEngine { - pub fn new() -> Self { - Self { - vertex_buffer_attributes_editable: true, - vertex_buffer: Vec::new(), - vertex_size: 0, - } - } - pub fn append_vertex(&mut self, mut vertex: Vec) -> Result<(), GPUError> { - if self.vertex_buffer_attributes_editable { - return Err(GPUError::EngineNotInitialized); - } - if !vertex.len() == self.vertex_size { - return Err(GPUError::ImproperVertexSize); - } - self.vertex_buffer.append(&mut vertex); - Ok(()) - } -} diff --git a/libraries/able_graphics_library/src/engine3d/color.rs b/libraries/able_graphics_library/src/engine3d/color.rs deleted file mode 100644 index c2ec0d6..0000000 --- a/libraries/able_graphics_library/src/engine3d/color.rs +++ /dev/null @@ -1,21 +0,0 @@ -pub struct Color3 { - pub r: u8, - pub g: u8, - pub b: u8, -} - -impl Color3 { - /// Usage - /// The alpha value is a number between 0.0 and 1.0, which represents the transparency - /// or translucency of the other color. - pub fn blend(&self, other: &Self, alpha: f32) -> Self { - let r = (1.0 - alpha) * f32::from(self.r) + alpha * f32::from(other.r); - let g = (1.0 - alpha) * f32::from(self.g) + alpha * f32::from(other.g); - let b = (1.0 - alpha) * f32::from(self.b) + alpha * f32::from(other.b); - Self { - r: r as u8, - g: g as u8, - b: b as u8, - } - } -} diff --git a/libraries/able_graphics_library/src/engine3d/display.rs b/libraries/able_graphics_library/src/engine3d/display.rs deleted file mode 100644 index 6b76362..0000000 --- a/libraries/able_graphics_library/src/engine3d/display.rs +++ /dev/null @@ -1,35 +0,0 @@ -use alloc::vec::Vec; - -pub enum DisplayError { - InvalidFormat, - InvalidWidth, - InvalidHeight, - InvalidBPP, - InvalidFPS, -} - -pub fn parse_display_string(s: &str) -> Result<(u32, u32, u32, u32), DisplayError> { - let parts: Vec<&str> = s.split('x').collect(); - if parts.len() != 3 { - return Err(DisplayError::InvalidFormat); - } - - let width = parts[0] - .parse::() - .map_err(|_| DisplayError::InvalidWidth)?; - let height = parts[1] - .parse::() - .map_err(|_| DisplayError::InvalidHeight)?; - let bits: Vec<&str> = parts[2].split('@').collect(); - if bits.len() != 2 { - return Err(DisplayError::InvalidFormat); - } - - let bpp = bits[0] - .parse::() - .map_err(|_| DisplayError::InvalidBPP)?; - let fps = bits[1] - .parse::() - .map_err(|_| DisplayError::InvalidFPS)?; - Ok((width, height, bpp, fps)) -} diff --git a/libraries/able_graphics_library/src/engine3d/error.rs b/libraries/able_graphics_library/src/engine3d/error.rs deleted file mode 100644 index e577866..0000000 --- a/libraries/able_graphics_library/src/engine3d/error.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub enum GPUError { - ImproperVertexSize = 10, - EngineNotInitialized = 100, -} diff --git a/libraries/able_graphics_library/src/engine3d/framebuffer.rs b/libraries/able_graphics_library/src/engine3d/framebuffer.rs deleted file mode 100644 index 781a2f8..0000000 --- a/libraries/able_graphics_library/src/engine3d/framebuffer.rs +++ /dev/null @@ -1,54 +0,0 @@ -use core::ptr; - -use alloc::vec::Vec; - -use super::color::Color3; -/// NOTE: Assumes the layout of RGBA -pub struct FrameBuffer { - pub width: u32, - pub height: u32, - pub data: Vec, -} - -impl FrameBuffer { - pub fn new(width: u32, height: u32) -> Self { - let data = vec![0; (width * height) as usize]; - FrameBuffer { - width, - height, - data, - } - } - - /// WARNING: Slow - pub fn set_pixel(&mut self, x: u32, y: u32, color: u32) { - let index = (y * self.width + x) as usize; - self.data[index] = color; - } - - /// WARNING: Slow - pub fn get_pixel(&self, x: u32, y: u32) -> u32 { - let index = (y * self.width + x) as usize; - self.data[index] - } - - /// Quickly writes the provided color to the whole framebuffer - pub fn clear(&mut self, color: Color3) { - unsafe { - // TODO: properly clear instead of only copying red - ptr::write_bytes(self.data.as_mut_ptr(), color.r, self.data.len()); - } - } - - // TODO(Able): Test preformance of clear2 - #[allow(dead_code)] - fn clear2(&mut self, color: u32) { - self.data.fill(color); - } - /// Check the size of one framebuffer vs the other. - /// NOTE: Just because this returns false does not mean that something is wrong - /// there are cases that this makes sense - pub fn check_size(&self, other: &FrameBuffer) -> bool { - self.width == other.width && self.height == other.height - } -} diff --git a/libraries/able_graphics_library/src/engine3d/mod.rs b/libraries/able_graphics_library/src/engine3d/mod.rs index 6d63e40..f838c36 100644 --- a/libraries/able_graphics_library/src/engine3d/mod.rs +++ b/libraries/able_graphics_library/src/engine3d/mod.rs @@ -1,5 +1 @@ -pub mod buffer; -pub mod color; -pub mod display; -pub mod error; -pub mod framebuffer; +pub mod vertex; diff --git a/libraries/able_graphics_library/src/engine3d/vertex.rs b/libraries/able_graphics_library/src/engine3d/vertex.rs new file mode 100644 index 0000000..2f48e27 --- /dev/null +++ b/libraries/able_graphics_library/src/engine3d/vertex.rs @@ -0,0 +1,48 @@ +use alloc::vec::Vec; + +pub type VertexBuffer = Vec; + +pub struct GraphicsEngine { + vertex_buffer_attributes_editable: bool, + vertex_buffer: VertexBuffer, + vertex_size: usize, +} +impl GraphicsEngine { + pub fn new() -> Self { + Self { + vertex_buffer_attributes_editable: true, + vertex_buffer: Vec::new(), + vertex_size: 0, + } + } + pub fn append_vertex(&mut self, mut vertex: Vec) -> Result<(), GPUError> { + if self.vertex_buffer_attributes_editable { + return Err(GPUError::EngineNotInitialized); + } + if !vertex.len() == self.vertex_size { + return Err(GPUError::ImproperVertexSize); + } + self.vertex_buffer.append(&mut vertex); + Ok(()) + } +} + +#[repr(C)] +pub struct XYZ { + x: f64, + y: f64, + z: f64, +} + +#[repr(C)] +pub struct XYZW { + x: f64, + y: f64, + z: f64, + w: f64, +} + +pub enum GPUError { + ImproperVertexSize, + EngineNotInitialized, +} diff --git a/libraries/able_graphics_library/src/raw_pixel/arch/mod.rs b/libraries/able_graphics_library/src/raw_pixel/arch/mod.rs new file mode 100644 index 0000000..aebe168 --- /dev/null +++ b/libraries/able_graphics_library/src/raw_pixel/arch/mod.rs @@ -0,0 +1 @@ +pub mod x86; diff --git a/libraries/able_graphics_library/src/raw_pixel/arch/x86/mod.rs b/libraries/able_graphics_library/src/raw_pixel/arch/x86/mod.rs new file mode 100644 index 0000000..708c150 --- /dev/null +++ b/libraries/able_graphics_library/src/raw_pixel/arch/x86/mod.rs @@ -0,0 +1,52 @@ +use embedded_graphics::{ + pixelcolor::Rgb888, + prelude::{DrawTarget, IntoStorage, OriginDimensions, Size}, + Pixel, +}; + +pub struct Display { + fb: *mut u32, + size: Size, +} + +unsafe impl Send for Display {} +impl DrawTarget for Display { + type Color = Rgb888; + type Error = BlitOutOfBoundsError; + + fn draw_iter(&mut self, pixels: I) -> Result<(), Self::Error> + where + I: IntoIterator>, + { + for Pixel(pos, rgb) in pixels { + let pos_x = u32::try_from(pos.x).map_err(|_| BlitOutOfBoundsError)?; + let pos_y = u32::try_from(pos.y).map_err(|_| BlitOutOfBoundsError)?; + + unsafe { + if pos_x >= self.size.width || pos_y >= self.size.height { + return Err(BlitOutOfBoundsError); + } + + self.fb + .add( + (pos_y * self.size.width + pos_x) + .try_into() + .map_err(|_| BlitOutOfBoundsError)?, + ) + .write_volatile(rgb.into_storage()); + } + } + + Ok(()) + } +} + +impl OriginDimensions for Display { + #[inline] + fn size(&self) -> Size { + self.size + } +} + +#[derive(Debug)] +pub struct BlitOutOfBoundsError; diff --git a/libraries/able_graphics_library/src/raw_pixel/mod.rs b/libraries/able_graphics_library/src/raw_pixel/mod.rs index f8c5e66..444d8b0 100644 --- a/libraries/able_graphics_library/src/raw_pixel/mod.rs +++ b/libraries/able_graphics_library/src/raw_pixel/mod.rs @@ -1,18 +1,12 @@ +mod arch; + use alloc::vec::Vec; +use arch::x86::Display; + pub struct Color { r: u8, g: u8, b: u8, a: u8, } - -pub struct PixelBuffer { - width: usize, - height: usize, - data: Vec, -} -impl PixelBuffer { - pub fn xy_calc(x: usize, y: isize) {} - pub fn blit(&mut self, x: isize, y: isize, buff: PixelBuffer) {} -} diff --git a/programs/system_config/assets/example_config.toml b/programs/system_config/assets/example_config.toml index 09a23f8..01bc6d8 100644 --- a/programs/system_config/assets/example_config.toml +++ b/programs/system_config/assets/example_config.toml @@ -25,7 +25,6 @@ userspace = "https://git.ablecorp.us/AbleOS/ableos_userland" version = "0.1.1" hash = "" repo = "userspace" -authors = [] [packages.list_files.configuration]