#![allow(missing_docs)]
use super::shade::BaseType;
pub type Count = u8;
pub type Offset = u32;
pub type Stride = u8;
pub type InstanceRate = u8;
#[derive(Eq, Ord, PartialEq, PartialOrd, Hash, Copy, Clone, Debug)]
#[repr(u8)]
pub enum SignFlag {
Signed,
Unsigned,
}
#[derive(Eq, Ord, PartialEq, PartialOrd, Hash, Copy, Clone, Debug)]
#[repr(u8)]
pub enum IntSubType {
Raw, Normalized, AsFloat, }
#[derive(Eq, Ord, PartialEq, PartialOrd, Hash, Copy, Clone, Debug)]
#[repr(u8)]
pub enum IntSize {
U8,
U16,
U32,
}
#[derive(Eq, Ord, PartialEq, PartialOrd, Hash, Copy, Clone, Debug)]
#[repr(u8)]
pub enum FloatSubType {
Default, Precision, }
#[derive(Eq, Ord, PartialEq, PartialOrd, Hash, Copy, Clone, Debug)]
#[repr(u8)]
pub enum FloatSize {
F16,
F32,
F64,
}
#[derive(Eq, Ord, PartialEq, PartialOrd, Hash, Copy, Clone, Debug)]
pub enum Type {
Int(IntSubType, IntSize, SignFlag),
Float(FloatSubType, FloatSize),
Special,
}
impl Type {
pub fn is_compatible(&self, bt: BaseType) -> Result<(), ()> {
match (*self, bt) {
(Type::Int(IntSubType::Raw, _, _), BaseType::I32) => Ok(()),
(Type::Int(IntSubType::Raw, _, SignFlag::Unsigned), BaseType::U32) => Ok(()),
(Type::Int(IntSubType::Raw, _, _), _) => Err(()),
(Type::Int(_, _, _), BaseType::F32) => Ok(()),
(Type::Int(_, _, _), _) => Err(()),
(Type::Float(_, _), BaseType::F32) => Ok(()),
(Type::Float(FloatSubType::Precision, FloatSize::F64), BaseType::F64) => Ok(()),
(Type::Float(_, _), _) => Err(()),
(_, BaseType::F64) => Err(()),
(_, BaseType::Bool) => Err(()),
_ => Err(()),
}
}
pub fn get_size(&self) -> u8 {
match *self {
Type::Int(_, IntSize::U8, _) => 1,
Type::Int(_, IntSize::U16, _) => 2,
Type::Int(_, IntSize::U32, _) => 4,
Type::Float(_, FloatSize::F16) => 2,
Type::Float(_, FloatSize::F32) => 4,
Type::Float(_, FloatSize::F64) => 8,
Type::Special => 0,
}
}
}
#[derive(Eq, Ord, PartialEq, PartialOrd, Hash, Copy, Clone, Debug)]
pub struct Format {
pub elem_count: Count,
pub elem_type: Type,
pub offset: Offset,
pub stride: Stride,
pub instance_rate: InstanceRate,
}