2024-01-01 07:30:04 +01:00
|
|
|
use rpl::instructions::Instruction;
|
|
|
|
use value::DynamicValue;
|
|
|
|
|
|
|
|
mod debug;
|
|
|
|
mod value;
|
|
|
|
|
|
|
|
/// The available executors
|
|
|
|
/// unused in early dev.
|
|
|
|
#[derive(Debug, Clone, Copy, clap::ValueEnum)]
|
|
|
|
pub enum Executors {
|
|
|
|
/// the debug executor is single threaded and really, *really* slow. And unstable. Don't use. Unless you're a dev working on this.
|
|
|
|
Debug,
|
|
|
|
/// the CPU executor primarily uses the CPU. Most likely most feature complete, and the fallback.
|
|
|
|
Cpu,
|
|
|
|
/// the Vulkan executor (obviously) uses vulkan. there's a good chance this isn't implemented yet as you're reading this.
|
|
|
|
Vulkan,
|
2023-12-13 18:13:43 +01:00
|
|
|
}
|
|
|
|
|
2024-01-01 07:30:04 +01:00
|
|
|
trait Executor {
|
|
|
|
fn execute(instruction: Instruction, input: Option<DynamicValue>) -> Option<DynamicValue>;
|
|
|
|
}
|
2023-12-13 18:13:43 +01:00
|
|
|
|
2024-01-01 07:30:04 +01:00
|
|
|
pub fn execute_all(instructions: Vec<Instruction>) {
|
|
|
|
let mut tmp = None;
|
|
|
|
|
|
|
|
for instruction in instructions {
|
|
|
|
tmp = debug::DebugExecutor::execute(instruction, tmp);
|
2023-12-13 18:13:43 +01:00
|
|
|
}
|
|
|
|
}
|
2024-01-01 07:30:04 +01:00
|
|
|
|
|
|
|
// scratchpad lol:
|
|
|
|
// execution structure:
|
|
|
|
// 1. take in rpl
|
|
|
|
// 2. analyse/validate structure against allowed executors
|
|
|
|
// 3. assign executors to instructions
|
|
|
|
// 4. optimize
|
|
|
|
// 5. prepare memory management patterns
|
|
|
|
// 6. run
|