extern crate spirv_headers as spirv; pub mod back; pub mod front; mod storage; use crate::storage::{Storage, Token}; use std::{ collections::HashMap, hash::BuildHasherDefault, }; type FastHashMap = HashMap>; #[derive(Debug)] pub struct Header { pub version: (u8, u8, u8), pub generator: u32, } pub type Bytes = u8; #[repr(u8)] #[derive(Clone, Copy, Debug, PartialEq)] pub enum VectorSize { Bi = 2, Tri = 3, Quad = 4, } #[repr(u8)] #[derive(Clone, Copy, Debug, PartialEq)] pub enum ScalarKind { Sint, Uint, Float, } #[derive(Debug)] pub struct PointerDeclaration { pub base: Type, pub length: u32, } #[derive(Debug)] pub struct StructMember { pub name: Option, pub ty: Type, } #[derive(Debug)] pub struct StructDeclaration { pub name: Option, pub members: Vec, } #[derive(Clone, Debug)] pub enum Type { Void, Scalar { kind: ScalarKind, width: Bytes }, Vector { size: VectorSize, kind: ScalarKind, width: Bytes }, Matrix { columns: VectorSize, rows: VectorSize, kind: ScalarKind, width: Bytes }, Pointer { base: Box, class: spirv::StorageClass }, Array { base: Box, length: u32 }, Struct(Token), } #[derive(Clone, Debug)] pub enum Constant { Sint(i64), Uint(u64), Float(f64), } #[derive(Clone, Debug)] pub struct GlobalVariable { pub name: Option, pub class: spirv::StorageClass, pub ty: Type, } #[derive(Clone, Debug)] pub enum Expression { Access { base: Token, index: Token, //int }, AccessIndex { base: Token, index: u32, }, Constant(Constant), Compose { components: Vec>, }, FunctionParameter(u32), GlobalVariable(Token), Load { pointer: Token, }, MatrixTimesVector { matrix: Token, vector: Token, }, } pub type Block = Vec; #[derive(Debug)] pub struct FallThrough; #[derive(Debug)] pub enum Statement { Block(Block), If { condition: Token, //bool accept: Block, reject: Block, }, Switch { selector: Token, //int cases: FastHashMap)>, default: Block, }, Return { value: Option>, }, Kill, Store { pointer: Token, value: Token, }, } #[derive(Debug)] pub struct Function { pub name: Option, pub control: spirv::FunctionControl, pub parameter_types: Vec, pub return_type: Type, pub expressions: Storage, pub body: Block, } #[derive(Debug)] pub struct EntryPoint { pub exec_model: spirv::ExecutionModel, pub name: String, pub inputs: Vec>, pub outputs: Vec>, pub function: Token, } #[derive(Debug)] pub struct Module { pub header: Header, pub struct_declarations: Storage, pub global_variables: Storage, pub functions: Storage, pub entry_points: Vec, }