forked from koniifer/ableos
stash to hold stuff till cargo fix
This commit is contained in:
parent
bbe2a0183a
commit
b47e8bd64c
164
ableos/Cargo.lock
generated
164
ableos/Cargo.lock
generated
|
@ -35,15 +35,22 @@ dependencies = [
|
||||||
"lliw",
|
"lliw",
|
||||||
"log",
|
"log",
|
||||||
"pic8259",
|
"pic8259",
|
||||||
|
"picorand",
|
||||||
"pretty-hex",
|
"pretty-hex",
|
||||||
|
"rkyv",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
"shadeable",
|
"shadeable",
|
||||||
|
"smoltcp",
|
||||||
"spin",
|
"spin",
|
||||||
"uart_16550",
|
"uart_16550",
|
||||||
"unicode-width",
|
"unicode-width",
|
||||||
"vga",
|
"vga",
|
||||||
"volatile 0.2.7",
|
"volatile 0.2.7",
|
||||||
"wasmi",
|
"wasmi",
|
||||||
|
"watson",
|
||||||
"x86_64",
|
"x86_64",
|
||||||
|
"y-compositor-protocol",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -82,6 +89,12 @@ version = "0.9.21"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a62c8f6168cd106687ee36a2b71a46c4144d73399f72814104d33094b8092fd2"
|
checksum = "a62c8f6168cd106687ee36a2b71a46c4144d73399f72814104d33094b8092fd2"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "byteorder"
|
||||||
|
version = "1.4.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-if"
|
name = "cfg-if"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
|
@ -176,6 +189,15 @@ dependencies = [
|
||||||
"wasi",
|
"wasi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.11.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
|
||||||
|
dependencies = [
|
||||||
|
"ahash",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "instant"
|
name = "instant"
|
||||||
version = "0.1.12"
|
version = "0.1.12"
|
||||||
|
@ -185,6 +207,12 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itoa"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
|
@ -239,6 +267,12 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "managed"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memory_units"
|
name = "memory_units"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
|
@ -312,6 +346,12 @@ dependencies = [
|
||||||
"x86_64",
|
"x86_64",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "picorand"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b6fc30519d2508c7e20e01da371cd27b1d4533fdb98e279955cb636b50210688"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pretty-hex"
|
name = "pretty-hex"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
|
@ -333,6 +373,26 @@ dependencies = [
|
||||||
"unicode-xid",
|
"unicode-xid",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ptr_meta"
|
||||||
|
version = "0.1.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1"
|
||||||
|
dependencies = [
|
||||||
|
"ptr_meta_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ptr_meta_derive"
|
||||||
|
version = "0.1.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.14"
|
version = "1.0.14"
|
||||||
|
@ -370,17 +430,84 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rkyv"
|
||||||
|
version = "0.7.29"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "49a37de5dfc60bae2d94961dacd03c7b80e426b66a99fa1b17799570dbdd8f96"
|
||||||
|
dependencies = [
|
||||||
|
"hashbrown",
|
||||||
|
"ptr_meta",
|
||||||
|
"rkyv_derive",
|
||||||
|
"seahash",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rkyv_derive"
|
||||||
|
version = "0.7.29"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "719d447dd0e84b23cee6cb5b32d97e21efb112a3e3c636c8da36647b938475a1"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ryu"
|
||||||
|
version = "1.0.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "scopeguard"
|
name = "scopeguard"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
|
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "seahash"
|
||||||
|
version = "4.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde"
|
||||||
|
version = "1.0.133"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "97565067517b60e2d1ea8b268e59ce036de907ac523ad83a0475da04e818989a"
|
||||||
|
dependencies = [
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.133"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ed201699328568d8d08208fdd080e3ff594e6c422e438b6705905da01005d537"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_json"
|
||||||
|
version = "1.0.75"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c059c05b48c5c0067d4b4b2b4f0732dd65feb52daf7e0ea09cd87e7dadc1af79"
|
||||||
|
dependencies = [
|
||||||
|
"itoa",
|
||||||
|
"ryu",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "shadeable"
|
name = "shadeable"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libm",
|
"libm",
|
||||||
|
"log",
|
||||||
"rhai",
|
"rhai",
|
||||||
"vga",
|
"vga",
|
||||||
]
|
]
|
||||||
|
@ -400,6 +527,18 @@ dependencies = [
|
||||||
"static_assertions",
|
"static_assertions",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "smoltcp"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d2308a1657c8db1f5b4993bab4e620bdbe5623bd81f254cf60326767bb243237"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"byteorder",
|
||||||
|
"log",
|
||||||
|
"managed",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "spin"
|
name = "spin"
|
||||||
version = "0.5.2"
|
version = "0.5.2"
|
||||||
|
@ -531,6 +670,22 @@ dependencies = [
|
||||||
"parity-wasm",
|
"parity-wasm",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "watson"
|
||||||
|
version = "0.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1cea7ead78c402dbf14e7f11911b0b48955ea13d46e012e2d98775e23c65d4ef"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
"webassembly",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "webassembly"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1d1a10e1dedffff9cfcbdd33c289c65b87da634259a460a3f23d513649fa7a8c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "x86_64"
|
name = "x86_64"
|
||||||
version = "0.14.7"
|
version = "0.14.7"
|
||||||
|
@ -541,3 +696,12 @@ dependencies = [
|
||||||
"bitflags",
|
"bitflags",
|
||||||
"volatile 0.4.4",
|
"volatile 0.4.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "y-compositor-protocol"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "git+https://git.ablecorp.us/able/y-compositor-protocol.git#d3bcd0d41c712bfc4b4f0f9e7b5dd470e00c04a2"
|
||||||
|
dependencies = [
|
||||||
|
"rkyv",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
|
@ -9,6 +9,8 @@ panic = "abort"
|
||||||
|
|
||||||
[package.metadata.bootimage]
|
[package.metadata.bootimage]
|
||||||
run-args = [
|
run-args = [
|
||||||
|
"-cpu",
|
||||||
|
"kvm64-v1",
|
||||||
"-serial",
|
"-serial",
|
||||||
"stdio",
|
"stdio",
|
||||||
"-smp",
|
"-smp",
|
||||||
|
@ -36,15 +38,45 @@ spin = "0.5.2"
|
||||||
vga = "*"
|
vga = "*"
|
||||||
log= "*"
|
log= "*"
|
||||||
pretty-hex = "0.2.1"
|
pretty-hex = "0.2.1"
|
||||||
|
|
||||||
unicode-width = "0.1.7"
|
unicode-width = "0.1.7"
|
||||||
|
picorand = "*"
|
||||||
|
watson = "0.4"
|
||||||
|
|
||||||
|
[dependencies.serde]
|
||||||
|
version = "*"
|
||||||
|
default-features = false
|
||||||
|
features = ["derive", "alloc"]
|
||||||
|
|
||||||
|
[dependencies.serde_json]
|
||||||
|
version = "*"
|
||||||
|
default-features = false
|
||||||
|
features = ["alloc"]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[dependencies.rkyv]
|
||||||
|
version = "0.7.29"
|
||||||
|
default-features = false
|
||||||
|
features = ["size_64", "alloc"]
|
||||||
|
|
||||||
|
|
||||||
|
[dependencies.smoltcp]
|
||||||
|
version = "0.8.0"
|
||||||
|
default-features = false
|
||||||
|
features = ["log", "proto-ipv4"]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[dependencies.y-compositor-protocol]
|
||||||
|
git = "https://git.ablecorp.us:443/able/y-compositor-protocol.git"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[dependencies.shadeable]
|
[dependencies.shadeable]
|
||||||
path = "../shadeable"
|
path = "../shadeable"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[dependencies.ab_glyph]
|
[dependencies.ab_glyph]
|
||||||
default-features = false
|
default-features = false
|
||||||
features = ["libm"]
|
features = ["libm"]
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
&[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
||||||
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
||||||
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
||||||
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
||||||
|
|
6
ableos/assets/kernel_config.json
Normal file
6
ableos/assets/kernel_config.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"logging_level": "Trace",
|
||||||
|
"run_tests": false,
|
||||||
|
"run_demos": false,
|
||||||
|
"run_shader_tests": true
|
||||||
|
}
|
|
@ -1,8 +1,9 @@
|
||||||
#![allow(clippy::print_literal)]
|
// #![allow(clippy::print_literal)]
|
||||||
use crate::logger;
|
use crate::logger;
|
||||||
|
|
||||||
use super::{gdt, interrupts};
|
use super::{gdt, interrupts};
|
||||||
|
|
||||||
|
/// x86_64 initialization
|
||||||
pub fn init() {
|
pub fn init() {
|
||||||
let result = logger::init();
|
let result = logger::init();
|
||||||
match result {
|
match result {
|
||||||
|
@ -13,5 +14,4 @@ pub fn init() {
|
||||||
interrupts::init_idt();
|
interrupts::init_idt();
|
||||||
unsafe { interrupts::PICS.lock().initialize() };
|
unsafe { interrupts::PICS.lock().initialize() };
|
||||||
x86_64::instructions::interrupts::enable();
|
x86_64::instructions::interrupts::enable();
|
||||||
info!("Initialized");
|
|
||||||
}
|
}
|
||||||
|
|
52
ableos/src/boot_conf.rs
Normal file
52
ableos/src/boot_conf.rs
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
use log::LevelFilter;
|
||||||
|
use serde::{de::value::BoolDeserializer, Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Serialize, Debug, Deserialize)]
|
||||||
|
pub enum LogLevel {
|
||||||
|
/// A level lower than all log levels.
|
||||||
|
Off,
|
||||||
|
/// Corresponds to the `Error` log level.
|
||||||
|
Error,
|
||||||
|
/// Corresponds to the `Warn` log level.
|
||||||
|
Warn,
|
||||||
|
/// Corresponds to the `Info` log level.
|
||||||
|
Info,
|
||||||
|
/// Corresponds to the `Debug` log level.
|
||||||
|
Debug,
|
||||||
|
/// Corresponds to the `Trace` log level.
|
||||||
|
Trace,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Debug, Deserialize)]
|
||||||
|
pub struct BootConfig {
|
||||||
|
pub logging_level: LogLevel,
|
||||||
|
|
||||||
|
pub run_tests: bool,
|
||||||
|
pub run_demos: bool,
|
||||||
|
pub run_shader_tests: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BootConfig {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
let data = include_str!("../assets/kernel_config.json");
|
||||||
|
|
||||||
|
// Parse the string of data into a Person object. This is exactly the
|
||||||
|
// same function as the one that produced serde_json::Value above, but
|
||||||
|
// now we are asking it for a Person as output.
|
||||||
|
let p: BootConfig = serde_json::from_str(data).unwrap();
|
||||||
|
info!("{:?}", p);
|
||||||
|
p
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn log_level(&self) -> LevelFilter {
|
||||||
|
use LevelFilter::*;
|
||||||
|
match self.logging_level {
|
||||||
|
LogLevel::Off => Off,
|
||||||
|
LogLevel::Error => Error,
|
||||||
|
LogLevel::Warn => Warn,
|
||||||
|
LogLevel::Info => Info,
|
||||||
|
LogLevel::Debug => Debug,
|
||||||
|
LogLevel::Trace => Trace,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,14 +1,23 @@
|
||||||
use alloc::{boxed::Box, vec, vec::Vec};
|
|
||||||
use shadeable::pixel_format::{new_rgba64, Rgba64};
|
|
||||||
use vga::{colors::Color16, writers::GraphicsWriter};
|
|
||||||
|
|
||||||
use crate::vga_e::VGAE;
|
use crate::vga_e::VGAE;
|
||||||
|
use alloc::{boxed::Box, vec, vec::Vec};
|
||||||
|
use shadeable::{
|
||||||
|
evaluate_shader,
|
||||||
|
pixel_format::{new_rgba64, Rgba64},
|
||||||
|
};
|
||||||
|
use spin;
|
||||||
|
use vga::{colors::Color16, writers::GraphicsWriter};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ScreenSize {
|
pub struct ScreenSize {
|
||||||
pub x: usize,
|
pub x: usize,
|
||||||
pub y: usize,
|
pub y: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lazy_static::lazy_static! {
|
||||||
|
pub static ref SCREEN_BUFFER: spin::Mutex<ScreenBuffer> = spin::Mutex::new(ScreenBuffer::new(640, 480));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
impl ScreenSize {
|
impl ScreenSize {
|
||||||
pub fn new(x: usize, y: usize) -> Self {
|
pub fn new(x: usize, y: usize) -> Self {
|
||||||
Self { x, y }
|
Self { x, y }
|
||||||
|
@ -35,6 +44,20 @@ impl ScreenBuffer {
|
||||||
buff: vec![0u64; x * y].into_boxed_slice(),
|
buff: vec![0u64; x * y].into_boxed_slice(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub fn draw_filled_circle(&mut self, cx: i32, cy: i32, radius: usize, color: Rgba64) {
|
||||||
|
let r = radius as i32 * 2;
|
||||||
|
for y in 0..640 {
|
||||||
|
for x in 0..480 {
|
||||||
|
let dx = cx - x as i32 * 2 - 1;
|
||||||
|
let dy = cy - y as i32 * 2 - 1;
|
||||||
|
|
||||||
|
if dx * dx + dy * dy <= r * r {
|
||||||
|
self.set_pixel(x, y, color);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_pixel(&mut self, x: usize, y: usize, color: Rgba64) {
|
pub fn set_pixel(&mut self, x: usize, y: usize, color: Rgba64) {
|
||||||
self.buff[y * self.size.x + x] = color;
|
self.buff[y * self.size.x + x] = color;
|
||||||
|
@ -45,7 +68,67 @@ impl ScreenBuffer {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn blit(&mut self, _width: usize, _height: usize) {}
|
pub fn blit(&mut self, _width: usize, _height: usize) {}
|
||||||
|
pub fn draw_filled_rect(&mut self, x1: usize, y1: usize, x2: usize, y2: usize, color: Rgba64) {
|
||||||
|
for y in y1..y2 {
|
||||||
|
for x in x1..x2 {
|
||||||
|
self.set_pixel(x, y, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn draw_unfilled_rect(
|
||||||
|
&mut self,
|
||||||
|
x1: usize,
|
||||||
|
y1: usize,
|
||||||
|
x2: usize,
|
||||||
|
y2: usize,
|
||||||
|
color: Rgba64,
|
||||||
|
) {
|
||||||
|
// x1 y1 => x2 y1 => x2 y2 => x1 y2 => x1 y1
|
||||||
|
self.draw_line(x1, y1, x2, y1, color);
|
||||||
|
self.draw_line(x2, y1, x2, y2, color);
|
||||||
|
self.draw_line(x2, y2, x1, y2, color);
|
||||||
|
self.draw_line(x1, y2, x1, y1, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn draw_line(&mut self, x1: usize, y1: usize, x2: usize, y2: usize, color: Rgba64) {
|
||||||
|
let x = crate::graphics::get_coordinates(
|
||||||
|
x1.try_into().unwrap(),
|
||||||
|
y1.try_into().unwrap(),
|
||||||
|
x2.try_into().unwrap(),
|
||||||
|
y2.try_into().unwrap(),
|
||||||
|
);
|
||||||
|
|
||||||
|
for coord in x {
|
||||||
|
self.set_pixel(coord.0, coord.1, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn shade(&mut self) {
|
||||||
|
for y in 0..100 {
|
||||||
|
for x in 0..100 {
|
||||||
|
let rgba_ret = evaluate_shader(x, y, self.buff[y * self.size.x + x]);
|
||||||
|
match rgba_ret {
|
||||||
|
Ok(pixel) => {
|
||||||
|
// info!("{:?}", pixel);
|
||||||
|
self.set_pixel(x, y, pixel);
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(err) => error!("{}", err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
info!("Shaders done");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO force clear
|
||||||
|
pub fn force_redraw(&mut self) {
|
||||||
|
use shadeable::pixel_format::into_vga_16;
|
||||||
|
VGAE.lock().clear_screen(into_vga_16(self.clear_color));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait VgaBuffer {
|
pub trait VgaBuffer {
|
||||||
fn copy_to_buffer(&self) -> GraphicsReturn;
|
fn copy_to_buffer(&self) -> GraphicsReturn;
|
||||||
}
|
}
|
||||||
|
@ -55,12 +138,58 @@ impl VgaBuffer for ScreenBuffer {
|
||||||
for y in 0..self.size.y {
|
for y in 0..self.size.y {
|
||||||
for x in 0..self.size.x {
|
for x in 0..self.size.x {
|
||||||
use shadeable::pixel_format::{get_color16, into_vga_16};
|
use shadeable::pixel_format::{get_color16, into_vga_16};
|
||||||
let vga_color = get_color16(self.buff[y * self.size.x + x]);
|
// let vga_color = get_color16(self.buff[y * self.size.x + x]);
|
||||||
// let vga_color = into_vga_16(self.buff[y * self.size.x + x]);
|
|
||||||
|
let vga_color = into_vga_16(self.buff[y * self.size.x + x]);
|
||||||
|
|
||||||
|
if into_vga_16(self.clear_color) != vga_color {
|
||||||
mode.set_pixel(x, y, vga_color);
|
mode.set_pixel(x, y, vga_color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GraphicsReturn::Ok
|
GraphicsReturn::Ok
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub fn get_coordinates(x1: i32, y1: i32, x2: i32, y2: i32) -> Vec<(usize, usize)> {
|
||||||
|
let mut coordinates: Vec<(usize, usize)> = vec![];
|
||||||
|
let dx: i32 = i32::abs(x2 - x1);
|
||||||
|
let dy: i32 = i32::abs(y2 - y1);
|
||||||
|
let sx: i32 = {
|
||||||
|
if x1 < x2 {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
-1
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let sy: i32 = {
|
||||||
|
if y1 < y2 {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
-1
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let mut error: i32 = (if dx > dy { dx } else { -dy }) / 2;
|
||||||
|
let mut current_x: i32 = x1;
|
||||||
|
let mut current_y: i32 = y1;
|
||||||
|
loop {
|
||||||
|
coordinates.push((current_x as usize, current_y as usize));
|
||||||
|
// info!("0 {:?}", (current_x, current_y));
|
||||||
|
|
||||||
|
if current_x == x2 && current_y == y2 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let error2: i32 = error;
|
||||||
|
|
||||||
|
if error2 > -dx {
|
||||||
|
error -= dy;
|
||||||
|
current_x += sx;
|
||||||
|
}
|
||||||
|
if error2 < dy {
|
||||||
|
error += dx;
|
||||||
|
current_y += sy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
coordinates
|
||||||
|
}
|
||||||
|
|
|
@ -1,40 +1,32 @@
|
||||||
#![allow(clippy::empty_loop)]
|
#![allow(clippy::empty_loop)]
|
||||||
|
|
||||||
// use std::println;
|
|
||||||
|
|
||||||
use alloc::format;
|
|
||||||
|
|
||||||
use shadeable::pixel_format::{from_vga_16, into_vga_16, new_rgba64};
|
|
||||||
use vga::{colors::Color16, writers::GraphicsWriter};
|
|
||||||
|
|
||||||
use crate::{
|
|
||||||
graphics::VgaBuffer,
|
|
||||||
relib::network::socket::{SimpleSock, SocketReturns},
|
|
||||||
vga_e::{self, num_to_vga16, VGAE},
|
|
||||||
};
|
|
||||||
|
|
||||||
use log::*;
|
|
||||||
|
|
||||||
use {
|
use {
|
||||||
crate::{
|
crate::{
|
||||||
arch::{drivers::graphics::GraphicsBuffer, init, sloop},
|
arch::{init, sloop},
|
||||||
driver_traits::graphics::Graphics,
|
boot_conf,
|
||||||
experiments::{
|
experiments::{
|
||||||
info::master,
|
info::master,
|
||||||
systeminfo::{KERNEL_VERSION, RELEASE_TYPE},
|
systeminfo::{KERNEL_VERSION, RELEASE_TYPE},
|
||||||
},
|
},
|
||||||
|
graphics::{VgaBuffer, SCREEN_BUFFER},
|
||||||
graphics::ScreenBuffer,
|
|
||||||
// log::LOG_STATE,
|
|
||||||
relib::math::rand::RAND_HANDLE,
|
relib::math::rand::RAND_HANDLE,
|
||||||
relib::network::socket::Socket,
|
relib::network::socket::Socket,
|
||||||
|
relib::network::socket::{SimpleSock, SocketReturns},
|
||||||
scheduler::{test_fn, Thread, ThreadList},
|
scheduler::{test_fn, Thread, ThreadList},
|
||||||
|
vga_e::{self, num_to_vga16},
|
||||||
},
|
},
|
||||||
alloc::{
|
alloc::{
|
||||||
|
format,
|
||||||
string::{String, ToString},
|
string::{String, ToString},
|
||||||
vec,
|
vec,
|
||||||
},
|
},
|
||||||
|
core::sync::atomic::{AtomicU64, Ordering::*},
|
||||||
lazy_static::lazy_static,
|
lazy_static::lazy_static,
|
||||||
|
log::*,
|
||||||
|
picorand::PicoRandGenerate,
|
||||||
|
rkyv::{ser::serializers::AllocSerializer, Deserialize},
|
||||||
|
shadeable::pixel_format::from_vga_16,
|
||||||
|
y_compositor_protocol::Version,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
@ -48,38 +40,113 @@ pub extern "C" fn stack_overflow() -> u8 {
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
pub static ref KEY_BUFFER: spin::Mutex<String> = spin::Mutex::new("".to_string());
|
pub static ref KEY_BUFFER: spin::Mutex<String> = spin::Mutex::new("".to_string());
|
||||||
pub static ref THREAD_LIST: spin::Mutex<ThreadList> = spin::Mutex::new(vec![]);
|
pub static ref THREAD_LIST: spin::Mutex<ThreadList> = spin::Mutex::new(vec![]);
|
||||||
pub static ref TICK: spin::Mutex<u64> = spin::Mutex::new(0);
|
pub static ref TICK: AtomicU64 = AtomicU64::new(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub fn kernel_main() -> ! {
|
pub fn kernel_main() -> ! {
|
||||||
|
let boot_conf = boot_conf::BootConfig::new();
|
||||||
|
|
||||||
init::init();
|
init::init();
|
||||||
|
log::set_max_level(boot_conf.log_level());
|
||||||
|
// info!("Initialized");
|
||||||
|
|
||||||
log::set_max_level(LevelFilter::Trace);
|
graphics_pipe_startup();
|
||||||
// crate::wasm::evaluate();
|
|
||||||
|
|
||||||
let mut abcde = ScreenBuffer::new(640, 480);
|
/*
|
||||||
// abcde.clear();
|
|
||||||
// abcde.copy_to_buffer();
|
|
||||||
|
|
||||||
VGAE.lock().clear_screen(Color16::Black);
|
|
||||||
|
|
||||||
trace!("length of screen buffer {}", abcde.buff.len());
|
|
||||||
trace!("Screen size {:?}", abcde.size);
|
|
||||||
|
|
||||||
for y in 0..480 {
|
|
||||||
for x in 0..640 {
|
|
||||||
let segment_x = x * 4 / 640;
|
|
||||||
let segment_y = y * 4 / 480;
|
|
||||||
let segment = segment_x + segment_y * 4;
|
|
||||||
|
|
||||||
abcde.set_pixel(x, y, from_vga_16(num_to_vga16(segment as u8)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// abcde.copy_to_buffer();
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
let mut proc_1 = SimpleSock::new();
|
||||||
|
proc_1.register_protocol("ProcSpawner".to_string());
|
||||||
|
|
||||||
|
let version = 0;
|
||||||
|
use rkyv::ser::Serializer;
|
||||||
|
let mut serializer = AllocSerializer::<0>::default();
|
||||||
|
serializer.serialize_value(&version).unwrap();
|
||||||
|
|
||||||
|
let bytes = serializer.into_serializer().into_inner();
|
||||||
|
proc_1.write(bytes.into_vec());
|
||||||
|
unsafe {
|
||||||
|
let the_bytes = proc_1.read(3).unwrap();
|
||||||
|
let archived = rkyv::archived_root::<Version>(&the_bytes);
|
||||||
|
let deserialized: Version = archived.deserialize(&mut rkyv::Infallible).unwrap();
|
||||||
|
// trace!("{:?}", deserialized);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
let mut graphics = SCREEN_BUFFER.lock();
|
||||||
|
graphics.force_redraw();
|
||||||
|
graphics.clear();
|
||||||
|
|
||||||
|
graphics.draw_filled_circle(100, 100, 5, 0x9900ff00);
|
||||||
|
screen_writer_test();
|
||||||
|
|
||||||
|
graphics.copy_to_buffer();
|
||||||
|
|
||||||
|
if boot_conf.run_tests {
|
||||||
|
// quick and dirty testing framework
|
||||||
|
socket_test();
|
||||||
|
graphics_pipe_test();
|
||||||
|
socket_startup_rng();
|
||||||
|
socket_test_rng();
|
||||||
|
}
|
||||||
|
|
||||||
|
if boot_conf.run_demos {
|
||||||
|
graphics_api_demo();
|
||||||
|
}
|
||||||
|
|
||||||
|
if boot_conf.run_shader_tests {
|
||||||
|
shader_tests();
|
||||||
|
}
|
||||||
|
|
||||||
|
// graphics.copy_to_buffer();
|
||||||
|
|
||||||
|
// info!("buffer copied");
|
||||||
|
|
||||||
|
sloop()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// called by arch specific timers to tick up all kernel related functions
|
||||||
|
pub fn tick() {
|
||||||
|
let mut data = TICK.load(Relaxed);
|
||||||
|
data += 1;
|
||||||
|
|
||||||
|
RAND_HANDLE.lock().seed_entropy_timer(data);
|
||||||
|
|
||||||
|
crate::kernel_state::KERNEL_STATE.lock().update_state();
|
||||||
|
TICK.store(data, Relaxed)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn key_entropy(key: u8) {
|
||||||
|
RAND_HANDLE.lock().seed_entropy_keyboard(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn test_threads() {
|
||||||
|
let mut a_thread = Thread::new();
|
||||||
|
|
||||||
|
a_thread.new_task(test_fn);
|
||||||
|
a_thread.new_task(test_fn);
|
||||||
|
THREAD_LIST.lock().push(a_thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn cpu_socket_startup() {
|
||||||
|
let mut cpu_info_socket = SimpleSock::new();
|
||||||
|
cpu_info_socket.register_protocol("CPU_INFO".to_string());
|
||||||
|
|
||||||
|
let x = master().unwrap();
|
||||||
|
let xyz = x.brand_string().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn log_version_data() {
|
||||||
|
info!("{} v{}", RELEASE_TYPE, KERNEL_VERSION);
|
||||||
|
info!(
|
||||||
|
"Brand String: {:?}",
|
||||||
|
master().unwrap().brand_string().unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn socket_test() {
|
||||||
let mut xyz = SimpleSock::new();
|
let mut xyz = SimpleSock::new();
|
||||||
|
|
||||||
xyz.peek();
|
xyz.peek();
|
||||||
|
@ -100,81 +167,120 @@ pub fn kernel_main() -> ! {
|
||||||
SocketReturns::ReadIndexOutOfBounds => todo!(),
|
SocketReturns::ReadIndexOutOfBounds => todo!(),
|
||||||
SocketReturns::WriteOk => todo!(),
|
SocketReturns::WriteOk => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn socket_test_rng() {
|
||||||
|
let mut test_sock = SimpleSock::grab_socket("RNGProvider".to_string()).unwrap();
|
||||||
|
info!(
|
||||||
|
"Recieving {} from protocol {}",
|
||||||
|
test_sock.read(1).unwrap()[0],
|
||||||
|
test_sock.protocol().unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn socket_startup_rng() {
|
||||||
|
use picorand::{WyRand, RNG};
|
||||||
|
let mut random_socket = SimpleSock::new();
|
||||||
|
|
||||||
|
random_socket.register_protocol("RNGProvider".to_string());
|
||||||
|
let bruh = TICK.load(core::sync::atomic::Ordering::Relaxed);
|
||||||
|
|
||||||
|
let mut rng = RNG::<WyRand, u8>::new(bruh);
|
||||||
|
|
||||||
|
for _ in 0..512 {
|
||||||
|
let x = rng.generate();
|
||||||
|
random_socket.write(vec![x]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn screen_writer_test() {
|
||||||
let mut sock_print_id = SimpleSock::new();
|
let mut sock_print_id = SimpleSock::new();
|
||||||
|
|
||||||
{
|
sock_print_id.register_protocol("Screen Printer".to_string());
|
||||||
sock_print_id.write(format!("a原b画cフdァeイfル 集").into());
|
|
||||||
// sock_print_id.write(format!("simple sockets are based").into());
|
// sock_print_id.write(format!("a原 b画 cフ dァ eイ fル 集").into());
|
||||||
// sock_print_id.write(format!("1....2....3....4....5....6....7....8....9").into());
|
sock_print_id.write(format!("λ³ Half Life 3 booting up ㎣").into());
|
||||||
}
|
// sock_print_id.write(format!("Happy birthday 🎉").into());
|
||||||
// crate::relib::image::mono_bitmap::bruh();
|
// sock_print_id.write(format!("1....2....3....4....5....6....7....8....9").into());
|
||||||
|
|
||||||
if true {
|
|
||||||
let mut prev = None;
|
let mut prev = None;
|
||||||
|
|
||||||
|
// let mut graphics = SCREEN_BUFFER.lock();
|
||||||
|
// graphics.clear();
|
||||||
|
// graphics.copy_to_buffer();
|
||||||
|
|
||||||
for current in (*String::from_utf8_lossy(&sock_print_id.peek().unwrap())).chars() {
|
for current in (*String::from_utf8_lossy(&sock_print_id.peek().unwrap())).chars() {
|
||||||
vga_e::draw_char(prev, current, 0);
|
vga_e::draw_char(prev, current, 0);
|
||||||
|
|
||||||
prev = Some(current);
|
prev = Some(current);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn vga_boot_screen() {
|
||||||
|
let mut abcde = SCREEN_BUFFER.lock();
|
||||||
|
|
||||||
|
for y in 0..480 {
|
||||||
|
for x in 0..640 {
|
||||||
|
let segment_x = x * 4 / 640;
|
||||||
|
let segment_y = y * 4 / 480;
|
||||||
|
let segment = segment_x + segment_y * 4;
|
||||||
|
|
||||||
|
abcde.set_pixel(x, y, from_vga_16(num_to_vga16(segment as u8)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if false {
|
|
||||||
draw_filled_circle(400, 350, 99, Color16::Black);
|
|
||||||
// let _ = shadeable::evaluate_shader(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// abcde.clear();
|
|
||||||
// abcde.copy_to_buffer();
|
|
||||||
|
|
||||||
// stack_overflow();
|
|
||||||
|
|
||||||
sloop()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// called by arch specific timers to tick up all kernel related functions
|
pub fn graphics_pipe_test() {
|
||||||
pub fn tick() {
|
let mut graphics_pipe = SimpleSock::grab_socket("YCompositor".to_string()).unwrap();
|
||||||
let mut data = TICK.lock();
|
|
||||||
*data += 1;
|
|
||||||
RAND_HANDLE.lock().seed_entropy_timer(*data);
|
|
||||||
|
|
||||||
// println!("{}", *data);
|
let version = Version {
|
||||||
crate::kernel_state::KERNEL_STATE.lock().update_state();
|
major: 13,
|
||||||
}
|
minor: 123,
|
||||||
|
patch: 0,
|
||||||
pub fn key_entropy(key: u8) {
|
|
||||||
RAND_HANDLE.lock().seed_entropy_keyboard(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn test_threads() {
|
|
||||||
let mut a_thread = Thread::new();
|
|
||||||
|
|
||||||
a_thread.new_task(test_fn);
|
|
||||||
a_thread.new_task(test_fn);
|
|
||||||
THREAD_LIST.lock().push(a_thread);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn draw_filled_circle(cx: i32, cy: i32, radius: usize, color: Color16) {
|
|
||||||
let vga = VGAE.lock();
|
|
||||||
|
|
||||||
let r = radius as i32 * 2;
|
|
||||||
for y in 0..640 {
|
|
||||||
for x in 0..480 {
|
|
||||||
let dx = cx - x as i32 * 2 - 1;
|
|
||||||
let dy = cy - y as i32 * 2 - 1;
|
|
||||||
|
|
||||||
if dx * dx + dy * dy <= r * r {
|
|
||||||
vga.set_pixel(x, y, color);
|
|
||||||
};
|
};
|
||||||
}
|
use rkyv::ser::Serializer;
|
||||||
|
let mut serializer = AllocSerializer::<0>::default();
|
||||||
|
serializer.serialize_value(&version).unwrap();
|
||||||
|
// let bytes = serializer.into_serializer().into_inner();
|
||||||
|
|
||||||
|
// info!("{:?}", bytes);
|
||||||
|
let bytes = serializer.into_serializer().into_inner();
|
||||||
|
graphics_pipe.write(bytes.into_vec());
|
||||||
|
unsafe {
|
||||||
|
let the_bytes = graphics_pipe.read(3).unwrap();
|
||||||
|
let archived = rkyv::archived_root::<Version>(&the_bytes);
|
||||||
|
let deserialized: Version = archived.deserialize(&mut rkyv::Infallible).unwrap();
|
||||||
|
trace!("{:?}", deserialized);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn log_version_data() {
|
pub fn graphics_pipe_startup() {
|
||||||
info!("{} v{}", RELEASE_TYPE, KERNEL_VERSION);
|
let mut graphics_pipe = SimpleSock::new();
|
||||||
info!(
|
|
||||||
"Brand String: {:?}",
|
graphics_pipe.register_protocol("YCompositor".to_string());
|
||||||
master().unwrap().brand_string().unwrap()
|
}
|
||||||
);
|
|
||||||
|
pub fn graphics_api_demo() {
|
||||||
|
let mut abcde = SCREEN_BUFFER.lock();
|
||||||
|
abcde.force_redraw();
|
||||||
|
|
||||||
|
abcde.draw_filled_circle(100, 100, 300, 0x0000ff00);
|
||||||
|
abcde.draw_unfilled_rect(100, 100, 400, 200, 0xff000000);
|
||||||
|
abcde.draw_filled_rect(300, 300, 400, 400, 0xff000000);
|
||||||
|
abcde.draw_line(100, 100, 400, 200, 0xff000000);
|
||||||
|
abcde.copy_to_buffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn shader_tests() {
|
||||||
|
let mut graphics = SCREEN_BUFFER.lock();
|
||||||
|
|
||||||
|
graphics.clear();
|
||||||
|
graphics.force_redraw();
|
||||||
|
graphics.draw_filled_rect(25, 25, 50, 50, 0xff000000);
|
||||||
|
graphics.set_pixel(50, 50, 0xffffff00);
|
||||||
|
graphics.shade();
|
||||||
|
|
||||||
|
graphics.copy_to_buffer();
|
||||||
|
|
||||||
|
// drop(graphics)
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ pub mod print;
|
||||||
pub extern crate log;
|
pub extern crate log;
|
||||||
|
|
||||||
pub mod allocator;
|
pub mod allocator;
|
||||||
|
pub mod boot_conf;
|
||||||
pub mod driver_traits;
|
pub mod driver_traits;
|
||||||
pub mod experiments;
|
pub mod experiments;
|
||||||
pub mod graphics;
|
pub mod graphics;
|
||||||
|
@ -40,10 +41,9 @@ pub mod keyboard;
|
||||||
pub mod kmain;
|
pub mod kmain;
|
||||||
pub mod logger;
|
pub mod logger;
|
||||||
pub mod panic;
|
pub mod panic;
|
||||||
|
pub mod proc;
|
||||||
pub mod relib;
|
pub mod relib;
|
||||||
pub mod scheduler;
|
pub mod scheduler;
|
||||||
pub mod wasm;
|
|
||||||
|
|
||||||
mod unicode_utils;
|
mod unicode_utils;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
|
|
||||||
|
|
|
@ -21,13 +21,14 @@ impl log::Log for SimpleLogger {
|
||||||
log::Level::Debug => color = (Fg::Blue, "$BLUE$"),
|
log::Level::Debug => color = (Fg::Blue, "$BLUE$"),
|
||||||
log::Level::Trace => color = (Fg::Yellow, "$YELLOW$"),
|
log::Level::Trace => color = (Fg::Yellow, "$YELLOW$"),
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
println!(
|
println!(
|
||||||
"[{}{}$RESET$][$GREEN$FakeTempTime$RESET$] {}",
|
"[{}{}$RESET$][$GREEN$FakeTempTime$RESET$] {}",
|
||||||
color.1,
|
color.1,
|
||||||
record.level(),
|
record.level(),
|
||||||
record.args()
|
record.args()
|
||||||
);
|
);
|
||||||
|
*/
|
||||||
serial_println!(
|
serial_println!(
|
||||||
"[{}{}{}][{}FakeTempTime{}] {}",
|
"[{}{}{}][{}FakeTempTime{}] {}",
|
||||||
color.0,
|
color.0,
|
||||||
|
|
5
ableos/src/proc.rs
Normal file
5
ableos/src/proc.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::relib::clparse::Command;
|
||||||
|
|
||||||
|
pub struct ProccessStart {
|
||||||
|
command: Command,
|
||||||
|
}
|
6
ableos/src/relib/encoding/bin.rs
Normal file
6
ableos/src/relib/encoding/bin.rs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
use alloc::{boxed::Box, vec::Vec};
|
||||||
|
use core::result;
|
||||||
|
|
||||||
|
pub struct BinCodeWriter {
|
||||||
|
pub stream: Box<u8>,
|
||||||
|
}
|
|
@ -1 +1,2 @@
|
||||||
|
pub mod bin;
|
||||||
pub mod rle;
|
pub mod rle;
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,11 +1,25 @@
|
||||||
|
use alloc::string::String;
|
||||||
use alloc::vec;
|
use alloc::vec;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
|
|
||||||
pub type Stream = Vec<u8>;
|
pub type Stream = Vec<u8>;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct SocketID {
|
pub struct SocketID {
|
||||||
pub id: usize,
|
pub id: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl SocketID {
|
||||||
|
pub fn protocol(self) -> Option<String> {
|
||||||
|
let x = SOCKETS.lock()[self.id].protocol.clone();
|
||||||
|
|
||||||
|
match x {
|
||||||
|
Some(protocol_name) => Some(protocol_name),
|
||||||
|
None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Socket for SocketID {
|
impl Socket for SocketID {
|
||||||
fn peek(&mut self) -> SocketReturns {
|
fn peek(&mut self) -> SocketReturns {
|
||||||
SOCKETS.lock()[self.id].peek()
|
SOCKETS.lock()[self.id].peek()
|
||||||
|
@ -18,6 +32,13 @@ impl Socket for SocketID {
|
||||||
fn write(&mut self, stream: Stream) -> SocketReturns {
|
fn write(&mut self, stream: Stream) -> SocketReturns {
|
||||||
SOCKETS.lock()[self.id].write(stream)
|
SOCKETS.lock()[self.id].write(stream)
|
||||||
}
|
}
|
||||||
|
fn register_protocol(&mut self, protocol_name: String) {
|
||||||
|
SOCKETS.lock()[self.id].protocol = Some(protocol_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_protocol(&mut self, protocol_name: String) -> bool {
|
||||||
|
SOCKETS.lock()[self.id].check_protocol(protocol_name)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type SocketState = Vec<SimpleSock>;
|
pub type SocketState = Vec<SimpleSock>;
|
||||||
|
@ -25,7 +46,6 @@ pub type SocketState = Vec<SimpleSock>;
|
||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
pub static ref SOCKETS: spin::Mutex<SocketState> = spin::Mutex::new(vec![]);
|
pub static ref SOCKETS: spin::Mutex<SocketState> = spin::Mutex::new(vec![]);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait Socket {
|
pub trait Socket {
|
||||||
fn peek(&mut self) -> SocketReturns;
|
fn peek(&mut self) -> SocketReturns;
|
||||||
|
|
||||||
|
@ -33,6 +53,9 @@ pub trait Socket {
|
||||||
fn read(&mut self, length: usize) -> SocketReturns;
|
fn read(&mut self, length: usize) -> SocketReturns;
|
||||||
|
|
||||||
fn write(&mut self, stream: Stream) -> SocketReturns;
|
fn write(&mut self, stream: Stream) -> SocketReturns;
|
||||||
|
fn register_protocol(&mut self, protocol_name: String);
|
||||||
|
fn check_protocol(&mut self, protocol_name: String) -> bool;
|
||||||
|
|
||||||
fn close(&mut self) {}
|
fn close(&mut self) {}
|
||||||
}
|
}
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -54,11 +77,15 @@ impl SocketReturns {
|
||||||
|
|
||||||
pub struct SimpleSock {
|
pub struct SimpleSock {
|
||||||
stream: Vec<u8>,
|
stream: Vec<u8>,
|
||||||
|
protocol: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SimpleSock {
|
impl SimpleSock {
|
||||||
pub fn new() -> SocketID {
|
pub fn new() -> SocketID {
|
||||||
let sock = SimpleSock { stream: vec![] };
|
let sock = SimpleSock {
|
||||||
|
stream: vec![],
|
||||||
|
protocol: None,
|
||||||
|
};
|
||||||
let mut sock_lock = SOCKETS.lock();
|
let mut sock_lock = SOCKETS.lock();
|
||||||
sock_lock.push(sock);
|
sock_lock.push(sock);
|
||||||
|
|
||||||
|
@ -69,6 +96,23 @@ impl SimpleSock {
|
||||||
pub fn regrab_sock(id: usize) -> SocketID {
|
pub fn regrab_sock(id: usize) -> SocketID {
|
||||||
SocketID { id }
|
SocketID { id }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn grab_socket(protocol_name: String) -> Option<SocketID> {
|
||||||
|
let socket_handle = SOCKETS.lock();
|
||||||
|
let socket_count = socket_handle.len();
|
||||||
|
drop(socket_handle);
|
||||||
|
|
||||||
|
let return_sock = None;
|
||||||
|
for socket_id in 0..socket_count {
|
||||||
|
let mut id = SimpleSock::regrab_sock(socket_id);
|
||||||
|
|
||||||
|
if id.check_protocol(protocol_name.clone()) {
|
||||||
|
return Some(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return_sock
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Socket for SimpleSock {
|
impl Socket for SimpleSock {
|
||||||
|
@ -92,6 +136,16 @@ impl Socket for SimpleSock {
|
||||||
SocketReturns::ReadOk(return_vec)
|
SocketReturns::ReadOk(return_vec)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fn register_protocol(&mut self, protocol_name: String) {
|
||||||
|
self.protocol = Some(protocol_name);
|
||||||
|
}
|
||||||
|
fn check_protocol(&mut self, protocol_name: String) -> bool {
|
||||||
|
if self.protocol == Some(protocol_name) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
fn write(&mut self, stream: Stream) -> SocketReturns {
|
fn write(&mut self, stream: Stream) -> SocketReturns {
|
||||||
for byte in stream {
|
for byte in stream {
|
||||||
self.stream.push(byte);
|
self.stream.push(byte);
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
use alloc::string::ToString;
|
|
||||||
use unicode_width::UnicodeWidthStr;
|
|
||||||
|
|
||||||
use {
|
use {
|
||||||
ab_glyph::{Font, FontRef, Glyph},
|
ab_glyph::{Font, FontRef, Glyph},
|
||||||
vga::{
|
vga::{
|
||||||
|
@ -19,10 +16,6 @@ lazy_static::lazy_static! {
|
||||||
pub static ref VGAE_BUFF_OFFSET_Y: spin::Mutex<u8> = spin::Mutex::new(0);
|
pub static ref VGAE_BUFF_OFFSET_Y: spin::Mutex<u8> = spin::Mutex::new(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait GraphicsAPI {
|
|
||||||
fn add_shader() {}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn draw_char(previous_character: Option<char>, character: char, _offset: usize) {
|
pub fn draw_char(previous_character: Option<char>, character: char, _offset: usize) {
|
||||||
let mode = *VGAE.lock();
|
let mode = *VGAE.lock();
|
||||||
let mut offset_x = VGAE_BUFF_OFFSET_X.lock();
|
let mut offset_x = VGAE_BUFF_OFFSET_X.lock();
|
||||||
|
@ -82,7 +75,7 @@ pub fn draw_char(previous_character: Option<char>, character: char, _offset: usi
|
||||||
{
|
{
|
||||||
// figure it our latter bruh
|
// figure it our latter bruh
|
||||||
let spacing = used_font.kern_unscaled(previous_glyph.id, q_glyph.id);
|
let spacing = used_font.kern_unscaled(previous_glyph.id, q_glyph.id);
|
||||||
info!("{spacing} {:?} {:?}", previous_glyph.id, q_glyph.id);
|
// info!("{spacing} {:?} {:?}", previous_glyph.id, q_glyph.id);
|
||||||
q_glyph.position.x += spacing * font_scale;
|
q_glyph.position.x += spacing * font_scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,117 +0,0 @@
|
||||||
use alloc::string::String;
|
|
||||||
|
|
||||||
use {
|
|
||||||
alloc::format,
|
|
||||||
wasm_sys::SysCall,
|
|
||||||
wasmi::{
|
|
||||||
Error, Externals, FuncInstance, FuncRef, ImportsBuilder, ModuleImportResolver,
|
|
||||||
ModuleInstance, RuntimeArgs, RuntimeValue, Signature, Trap, TrapKind, ValueType,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
mod wasm_sys;
|
|
||||||
struct HostFunctions;
|
|
||||||
impl HostFunctions {
|
|
||||||
fn check_signature(&self, index: usize, signature: &Signature) -> bool {
|
|
||||||
let (params, ret_ty): (&[ValueType], Option<ValueType>) = match index.into() {
|
|
||||||
SysCall::KILL => (&[], None),
|
|
||||||
SysCall::EMPTY => (&[], None),
|
|
||||||
_ => return false,
|
|
||||||
};
|
|
||||||
signature.params() == params && signature.return_type() == ret_ty
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl Externals for HostFunctions {
|
|
||||||
fn invoke_index(
|
|
||||||
&mut self,
|
|
||||||
index: usize,
|
|
||||||
args: RuntimeArgs,
|
|
||||||
) -> Result<Option<RuntimeValue>, Trap> {
|
|
||||||
match index.into() {
|
|
||||||
// Take in one arg discard the rest
|
|
||||||
SysCall::KILL => {
|
|
||||||
info!("Program run at runtime called a system call");
|
|
||||||
debug!("Runtime arguments: {:?}", args);
|
|
||||||
Ok(None)
|
|
||||||
}
|
|
||||||
// Do nothing
|
|
||||||
SysCall::EMPTY => Ok(None),
|
|
||||||
SysCall::EXIT => Ok(None),
|
|
||||||
SysCall::CONSOLE_RESET => Ok(None),
|
|
||||||
SysCall::CONSOLE_IN => {
|
|
||||||
info!("In");
|
|
||||||
Ok(None)
|
|
||||||
}
|
|
||||||
|
|
||||||
SysCall::CONSOLE_OUT => {
|
|
||||||
// Eventually change this to 2- ptr and len
|
|
||||||
if args.len() != 1 {
|
|
||||||
return Err(Trap::new(TrapKind::UnexpectedSignature));
|
|
||||||
}
|
|
||||||
let arg: u64 = args.nth(0);
|
|
||||||
let buf = unsafe { String::from_utf8_unchecked(arg.to_le_bytes().to_vec()) };
|
|
||||||
println!["{}", buf];
|
|
||||||
Ok(None)
|
|
||||||
}
|
|
||||||
SysCall::CONSOLE_GET_TITLE => Ok(None),
|
|
||||||
SysCall::CONSOLE_SET_TITLE => Ok(None),
|
|
||||||
_ => panic!("Unimplemented function at {}", index),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl ModuleImportResolver for HostFunctions {
|
|
||||||
fn resolve_func(&self, field_name: &str, signature: &Signature) -> Result<FuncRef, Error> {
|
|
||||||
let index = match field_name {
|
|
||||||
"kill" => SysCall::KILL as usize,
|
|
||||||
"empty" => SysCall::EMPTY as usize,
|
|
||||||
"exit" => SysCall::EXIT as usize,
|
|
||||||
"console_out" => SysCall::CONSOLE_OUT as usize,
|
|
||||||
_ => {
|
|
||||||
return Err(Error::Instantiation(format!(
|
|
||||||
"Export {} not found",
|
|
||||||
field_name
|
|
||||||
)))
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if !self.check_signature(index, signature) {
|
|
||||||
return Err(Error::Instantiation(format!(
|
|
||||||
"Export {} has a bad signature",
|
|
||||||
field_name
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(FuncInstance::alloc_host(
|
|
||||||
Signature::new(&[][..], None),
|
|
||||||
index,
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn evaluate() {
|
|
||||||
// let wasm_binary = include_bytes!("bin/console_out_test.wasm");
|
|
||||||
let wasm_binary = include_bytes!("bin/rust.wasm");
|
|
||||||
|
|
||||||
// Load wasm binary and prepare it for instantiation.
|
|
||||||
let module = wasmi::Module::from_buffer(&wasm_binary).expect("failed to load wasm");
|
|
||||||
|
|
||||||
let imports = ImportsBuilder::new().with_resolver("env", &HostFunctions);
|
|
||||||
|
|
||||||
// Instantiate a module with empty imports and
|
|
||||||
// assert that there is no `start` function.
|
|
||||||
let instance = ModuleInstance::new(&module, &imports)
|
|
||||||
// .expect("failed to instantiate wasm module")
|
|
||||||
.unwrap()
|
|
||||||
.assert_no_start();
|
|
||||||
|
|
||||||
// Finally, invoke the exported function "test" with no parameters
|
|
||||||
// and empty external function executor.
|
|
||||||
let result: i32 = instance
|
|
||||||
.invoke_export("_start", &[], &mut HostFunctions)
|
|
||||||
.expect("failed to execute export")
|
|
||||||
.unwrap()
|
|
||||||
.try_into()
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
println!("{:?}", result);
|
|
||||||
}
|
|
|
@ -1,94 +0,0 @@
|
||||||
#![allow(non_camel_case_types)]
|
|
||||||
|
|
||||||
macro_rules! syscall_enum {
|
|
||||||
() => {};
|
|
||||||
(@get_last $Variant:ident) => {
|
|
||||||
Self::$Variant
|
|
||||||
};
|
|
||||||
(@get_last $Variant:ident, $($VariantTail:ident),*) => {
|
|
||||||
syscall_enum![@get_last $($VariantTail),*]
|
|
||||||
};
|
|
||||||
($($Variant:ident=$Value:expr,)*) => {
|
|
||||||
#[allow(clippy::upper_case_acronyms)]
|
|
||||||
#[repr(usize)]
|
|
||||||
pub enum SysCall {
|
|
||||||
$($Variant = $Value),*
|
|
||||||
}
|
|
||||||
|
|
||||||
impl core::convert::From<usize> for SysCall {
|
|
||||||
fn from(n: usize) -> Self {
|
|
||||||
match n {
|
|
||||||
$($Value => Self::$Variant),*,
|
|
||||||
_ => syscall_enum![@get_last $($Variant),*]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
($($Variant:ident=$Value:expr),* ) => {
|
|
||||||
syscall_enum!($($Variant=$Value,)* );
|
|
||||||
};
|
|
||||||
}
|
|
||||||
syscall_enum! {
|
|
||||||
KILL=0, // Provide a PID
|
|
||||||
CONSOLE_RESET=1, // Reset the console
|
|
||||||
CONSOLE_IN=2, // Console Input
|
|
||||||
CONSOLE_OUT=3, // Console output
|
|
||||||
CONSOLE_GET_TITLE=4, // Get the console title
|
|
||||||
CONSOLE_SET_TITLE=5, // Set the console title
|
|
||||||
CONSOLE_GET_BAR=6,
|
|
||||||
CONSOLE_SET_BAR=7,
|
|
||||||
|
|
||||||
//
|
|
||||||
GET_HOSTNAME=10,
|
|
||||||
SET_HOSTNAME=11,
|
|
||||||
|
|
||||||
|
|
||||||
NEW_THREAD=12,
|
|
||||||
NEW_TASK=13,
|
|
||||||
KILL_THREAD=14,
|
|
||||||
KILL_TASK=15,
|
|
||||||
GET_THREAD=16,
|
|
||||||
GET_TASK=17,
|
|
||||||
SEND= 18,
|
|
||||||
RECEIVE = 19,
|
|
||||||
RESPOND = 20,
|
|
||||||
|
|
||||||
//File Related syscalls
|
|
||||||
//
|
|
||||||
MAKE_DIRECTORY=22, //
|
|
||||||
DELETE_DIRECTORY=23, //
|
|
||||||
RENAME_DIRECTORY=24, //
|
|
||||||
SET_DIRECTORY_ACCESS=25, //
|
|
||||||
//
|
|
||||||
MAKE_FILE=26, //
|
|
||||||
DELETE_FILE=27, //
|
|
||||||
RENAME_FILE=28, //
|
|
||||||
SET_FILE_ACCESS=29, //
|
|
||||||
|
|
||||||
FILE_READ=30,
|
|
||||||
FILE_WRITE=31,
|
|
||||||
|
|
||||||
SLEEP=32, // Sleep in milliseconds
|
|
||||||
SLEEP_UNTIL=33, // Sleep until this time in milliseconds (if this is below the current time return)
|
|
||||||
NANOSLEEP=34, // Sleep in nanoseconds
|
|
||||||
NANOSLEEP_UNTIL=35, // Sleep until this time nanoseconds (if this is below the current time return)
|
|
||||||
GET_TIME=36, // Gets the system time (some derivitive of seconds)
|
|
||||||
SET_TIME=37, // Sets the system time (some derivitive of seconds)
|
|
||||||
|
|
||||||
// Socket SysCall
|
|
||||||
SOCKET_BIND=39, // Used by servers to lock a port
|
|
||||||
SOCKET_CONNECT=40,
|
|
||||||
SOCKET_DISCONNECT=41,
|
|
||||||
SOCKET_SEND=42,
|
|
||||||
SOCKET_RECEIVE=43,
|
|
||||||
|
|
||||||
|
|
||||||
GET_PID=44, // Get the proccess ID
|
|
||||||
PROCESS_INFO=45, // Get information about the process
|
|
||||||
//scheduler Related Syscals
|
|
||||||
GET_PRIORITY=46, // Get scheduler priority
|
|
||||||
SET_PRIORITY=47, // Set scheduler priority
|
|
||||||
|
|
||||||
EXIT=50,
|
|
||||||
EMPTY=0xFFFF,
|
|
||||||
}
|
|
10
shadeable/Cargo.lock
generated
10
shadeable/Cargo.lock
generated
|
@ -143,6 +143,15 @@ dependencies = [
|
||||||
"scopeguard",
|
"scopeguard",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "log"
|
||||||
|
version = "0.4.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "no-std-compat"
|
name = "no-std-compat"
|
||||||
version = "0.4.1"
|
version = "0.4.1"
|
||||||
|
@ -228,6 +237,7 @@ name = "shadeable"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libm",
|
"libm",
|
||||||
|
"log",
|
||||||
"rhai",
|
"rhai",
|
||||||
"vga",
|
"vga",
|
||||||
]
|
]
|
||||||
|
|
|
@ -9,6 +9,7 @@ edition = "2021"
|
||||||
|
|
||||||
vga = "*"
|
vga = "*"
|
||||||
libm = "*"
|
libm = "*"
|
||||||
|
log ="*"
|
||||||
|
|
||||||
[dependencies.rhai]
|
[dependencies.rhai]
|
||||||
version = "*"
|
version = "*"
|
||||||
|
|
|
@ -2,10 +2,17 @@ const VERSION = 0.5;
|
||||||
|
|
||||||
|
|
||||||
fn main(){
|
fn main(){
|
||||||
let abcd = RGBA(0, 33, 0, 0);
|
let abcd = RGBA(255, 255, 0, 0);
|
||||||
|
//print("hi");
|
||||||
// print(rand_float());
|
|
||||||
|
|
||||||
|
//debug("hi part 2");
|
||||||
|
|
||||||
|
if PIXEL_X == 30 {
|
||||||
PIXEL_RGBA;
|
PIXEL_RGBA;
|
||||||
|
}
|
||||||
|
else if PIXEL_X == 10 {
|
||||||
|
RGBA(0, 0, 0, 0);
|
||||||
|
} else {
|
||||||
|
abcd;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,18 +1,58 @@
|
||||||
use crate::pixel_format::{rgba_add, rgba_div, rgba_mult, rgba_sub, RGBA};
|
use crate::pixel_format::{get_a, get_b, get_g, get_r, set_a, set_b, set_g, set_r};
|
||||||
|
use crate::pixel_format::{new_rgba64, rgba_div, Rgba64};
|
||||||
|
|
||||||
|
use log::{debug, info};
|
||||||
use rhai::Engine;
|
use rhai::Engine;
|
||||||
|
|
||||||
pub fn engine_startup() -> Engine {
|
pub fn engine_startup() -> Engine {
|
||||||
let mut engine = Engine::new();
|
let mut engine = Engine::new();
|
||||||
|
|
||||||
|
// engine.on_print(|x| info!("PRINTED FROM SHADER: {}", x));
|
||||||
|
|
||||||
|
// Any function or closure that takes a '&str', an 'Option<&str>' and a 'Position' argument
|
||||||
|
// can be used to override 'debug'.
|
||||||
|
engine.on_debug(|x, src, pos| {
|
||||||
|
let src = src.unwrap_or("unknown");
|
||||||
|
// debug!("SHADER DEBUG of {} at {:?}: {}", src, pos, x)
|
||||||
|
});
|
||||||
|
|
||||||
engine
|
engine
|
||||||
.register_type::<RGBA>()
|
.register_type::<Rgba64>()
|
||||||
.register_fn("RGBA", RGBA::new)
|
.register_fn("RGBA", get_rgba_rhai)
|
||||||
.register_fn("*", rgba_mult)
|
.register_fn("RGBA", get_rgba_from_int)
|
||||||
|
.register_fn("RGBA", get_rgba_from_int)
|
||||||
.register_fn("/", rgba_div)
|
.register_fn("/", rgba_div)
|
||||||
.register_fn("+", rgba_add)
|
// .register_fn("*", rgba_mult)
|
||||||
.register_fn("-", rgba_sub);
|
// .register_fn("+", rgba_add)
|
||||||
|
// .register_fn("-", rgba_sub)
|
||||||
|
;
|
||||||
|
|
||||||
// engine.register_global_module(RandomPackage::new().as_shared_module());
|
// engine.register_global_module(RandomPackage::new().as_shared_module());
|
||||||
|
|
||||||
engine
|
engine
|
||||||
}
|
}
|
||||||
|
use rhai::INT;
|
||||||
|
pub fn get_rgba_rhai(r: INT, g: INT, b: INT, a: INT) -> Rgba64 {
|
||||||
|
let mut pixel = 0;
|
||||||
|
|
||||||
|
pixel |= set_r(pixel, r as u8);
|
||||||
|
pixel |= set_g(pixel, g as u8);
|
||||||
|
pixel |= set_b(pixel, b as u8);
|
||||||
|
pixel |= set_a(pixel, a as u8);
|
||||||
|
pixel
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_rgba_from_int(pixel: INT) -> Rgba64 {
|
||||||
|
let mut pixel = pixel as u64;
|
||||||
|
|
||||||
|
let r = get_r(pixel.try_into().unwrap());
|
||||||
|
let g = get_g(pixel.try_into().unwrap());
|
||||||
|
let b = get_b(pixel.try_into().unwrap());
|
||||||
|
let a = get_a(pixel.try_into().unwrap());
|
||||||
|
|
||||||
|
pixel |= set_r(pixel, r as u8);
|
||||||
|
pixel |= set_g(pixel, g as u8);
|
||||||
|
pixel |= set_b(pixel, b as u8);
|
||||||
|
pixel |= set_a(pixel, a as u8);
|
||||||
|
pixel
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#![no_std]
|
#![no_std]
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
use alloc::{boxed::Box, vec, vec::Vec};
|
use alloc::boxed::Box;
|
||||||
use engine_internals::engine_startup;
|
use engine_internals::engine_startup;
|
||||||
use pixel_format::{Rgba64, RGBA};
|
use pixel_format::Rgba64;
|
||||||
// use core::fmt::Result;
|
// use core::fmt::Result;
|
||||||
use core::result::Result;
|
use core::result::Result;
|
||||||
use rhai::{EvalAltResult, Scope};
|
use rhai::{EvalAltResult, Scope};
|
||||||
|
@ -12,70 +12,17 @@ pub mod pixel_format;
|
||||||
|
|
||||||
pub const SHADER: &str = include_str!("../shaders/simple.shade");
|
pub const SHADER: &str = include_str!("../shaders/simple.shade");
|
||||||
|
|
||||||
pub fn rhai_test() -> Result<Vec<RGBA>, Box<EvalAltResult>>
|
pub fn evaluate_shader(x: usize, y: usize, pixel: Rgba64) -> Result<Rgba64, Box<EvalAltResult>> {
|
||||||
// ^^^^^^^^^^^^^^^^^^
|
|
||||||
// Rhai API error type
|
|
||||||
{
|
|
||||||
// Create an 'Engine'
|
|
||||||
|
|
||||||
let engine = engine_startup();
|
|
||||||
|
|
||||||
let ast = engine.compile(SHADER)?;
|
|
||||||
let mut scope = Scope::new();
|
|
||||||
|
|
||||||
let a = vec![
|
|
||||||
RGBA {
|
|
||||||
r: 255,
|
|
||||||
g: 0,
|
|
||||||
b: 0,
|
|
||||||
a: 0,
|
|
||||||
},
|
|
||||||
RGBA {
|
|
||||||
r: 0,
|
|
||||||
g: 255,
|
|
||||||
b: 0,
|
|
||||||
a: 0,
|
|
||||||
},
|
|
||||||
RGBA {
|
|
||||||
r: 0,
|
|
||||||
g: 0,
|
|
||||||
b: 255,
|
|
||||||
a: 0,
|
|
||||||
},
|
|
||||||
RGBA {
|
|
||||||
r: 0,
|
|
||||||
g: 0,
|
|
||||||
b: 0,
|
|
||||||
a: 255,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut result_rgba = vec![];
|
|
||||||
|
|
||||||
for pixel in a {
|
|
||||||
/*
|
|
||||||
scope.push("PIXEL_X", 0);
|
|
||||||
scope.push("PIXEL_Y", index);
|
|
||||||
*/
|
|
||||||
scope.push("PIXEL_RGBA", pixel);
|
|
||||||
|
|
||||||
let result: RGBA = engine.call_fn(&mut scope, &ast, "main", ())?;
|
|
||||||
result_rgba.push(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Done!
|
|
||||||
Ok(result_rgba)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn evaluate_shader(pixel: u8) -> Result<Rgba64, Box<EvalAltResult>> {
|
|
||||||
let engine = engine_startup();
|
let engine = engine_startup();
|
||||||
|
|
||||||
let ast = engine.compile(SHADER)?;
|
let ast = engine.compile(SHADER)?;
|
||||||
let mut scope = Scope::new();
|
let mut scope = Scope::new();
|
||||||
|
|
||||||
scope.push("PIXEL_RGBA", pixel);
|
scope.push("PIXEL_RGBA", pixel);
|
||||||
|
scope.push("PIXEL_X", x);
|
||||||
|
scope.push("PIXEL_Y", y);
|
||||||
|
|
||||||
let result: RGBA = engine.call_fn(&mut scope, &ast, "main", ())?;
|
let result: Rgba64 = engine.call_fn(&mut scope, &ast, "main", ())?;
|
||||||
|
|
||||||
Ok(8)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#![feature(exclusive_range_pattern)]
|
#![feature(exclusive_range_pattern)]
|
||||||
|
use log::*;
|
||||||
use rhai::INT;
|
use rhai::INT;
|
||||||
use vga::colors::Color16;
|
use vga::colors::Color16;
|
||||||
pub type Rgba64 = u64;
|
pub type Rgba64 = u64;
|
||||||
|
@ -57,27 +57,14 @@ pub fn set_a(rgba: Rgba64, a: u8) -> Rgba64 {
|
||||||
return z | y;
|
return z | y;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub struct RGBA {
|
|
||||||
pub r: INT,
|
|
||||||
pub g: INT,
|
|
||||||
pub b: INT,
|
|
||||||
pub a: INT,
|
|
||||||
}
|
|
||||||
impl RGBA {
|
|
||||||
pub fn new(r: INT, g: INT, b: INT, a: INT) -> Self {
|
|
||||||
Self { r, g, b, a }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn rgba_div(a: Rgba64, b: Rgba64) -> Rgba64 {
|
pub fn rgba_div(a: Rgba64, b: Rgba64) -> Rgba64 {
|
||||||
let mut fin: Rgba64 = 0;
|
let mut fin: Rgba64 = 0;
|
||||||
|
|
||||||
// println!("{}", fin);
|
// println!("{}", fin);
|
||||||
fin = set_r(fin, get_r(a) / get_r(b));
|
fin |= set_r(fin, get_r(a) / get_r(b));
|
||||||
// println!("{}", fin);
|
// println!("{}", fin);
|
||||||
|
|
||||||
fin = set_g(fin, get_g(a) / get_g(b));
|
fin |= set_g(fin, get_g(a) / get_g(b));
|
||||||
/*
|
/*
|
||||||
|
|
||||||
get_b(a) / get_b(b);
|
get_b(a) / get_b(b);
|
||||||
|
@ -87,31 +74,6 @@ pub fn rgba_div(a: Rgba64, b: Rgba64) -> Rgba64 {
|
||||||
|
|
||||||
return fin;
|
return fin;
|
||||||
}
|
}
|
||||||
pub fn rgba_mult(a: RGBA, b: RGBA) -> RGBA {
|
|
||||||
RGBA {
|
|
||||||
r: a.r * b.r,
|
|
||||||
g: a.g * b.g,
|
|
||||||
b: a.b * b.b,
|
|
||||||
a: a.a * b.a,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pub fn rgba_add(a: RGBA, b: RGBA) -> RGBA {
|
|
||||||
RGBA {
|
|
||||||
r: a.r + b.r,
|
|
||||||
g: a.g + b.g,
|
|
||||||
b: a.b + b.b,
|
|
||||||
a: a.a + b.a,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pub fn rgba_sub(a: RGBA, b: RGBA) -> RGBA {
|
|
||||||
RGBA {
|
|
||||||
r: a.r - b.r,
|
|
||||||
g: a.g - b.g,
|
|
||||||
b: a.b - b.b,
|
|
||||||
a: a.a - b.a,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
|
|
||||||
pub fn new_rgba64(r: u8, g: u8, b: u8, a: u8) -> Rgba64 {
|
pub fn new_rgba64(r: u8, g: u8, b: u8, a: u8) -> Rgba64 {
|
||||||
let mut x = 0;
|
let mut x = 0;
|
||||||
|
@ -141,6 +103,9 @@ pub fn into_vga_16(rgba_64: Rgba64) -> Color16 {
|
||||||
171..=255 => 0b1001,
|
171..=255 => 0b1001,
|
||||||
_ => 0,
|
_ => 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// trace!("{}", fourbit);
|
||||||
|
|
||||||
use Color16::*;
|
use Color16::*;
|
||||||
match fourbit {
|
match fourbit {
|
||||||
0 => Black,
|
0 => Black,
|
||||||
|
|
Loading…
Reference in a new issue