use crate::{format, IndexType};
pub type Location = u32;
pub type BufferIndex = u32;
pub type ElemOffset = u32;
pub type ElemStride = u32;
pub type InstanceRate = u8;
pub type PatchSize = u8;
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum VertexInputRate {
Vertex,
Instance(InstanceRate),
}
impl VertexInputRate {
pub fn as_uint(&self) -> u8 {
match *self {
VertexInputRate::Vertex => 0,
VertexInputRate::Instance(divisor) => divisor,
}
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Element<F> {
pub format: F,
pub offset: ElemOffset,
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct VertexBufferDesc {
pub binding: BufferIndex,
pub stride: ElemStride,
pub rate: VertexInputRate,
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct AttributeDesc {
pub location: Location,
pub binding: BufferIndex,
pub element: Element<format::Format>,
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[repr(u8)]
pub enum Primitive {
PointList,
LineList,
LineStrip,
TriangleList,
TriangleStrip,
PatchList(PatchSize),
}
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct InputAssemblerDesc {
pub primitive: Primitive,
pub with_adjacency: bool,
pub restart_index: Option<IndexType>,
}
impl InputAssemblerDesc {
pub fn new(primitive: Primitive) -> Self {
InputAssemblerDesc {
primitive,
with_adjacency: false,
restart_index: None,
}
}
}