use crate::{AddrSpace, OrdAssertEq, Type};
use std::collections::BTreeMap;
use std::num::NonZeroU32;
use std::ops::Range;
use std::rc::Rc;
pub mod analyze;
mod layout;
pub mod lift;
pub mod lower;
pub mod shapes;
pub use layout::LayoutConfig;
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum QPtrAttr {
ToSpvPtrInput { input_idx: u32, pointee: OrdAssertEq<Type> },
FromSpvPtrOutput {
addr_space: OrdAssertEq<AddrSpace>,
pointee: OrdAssertEq<Type>,
},
Usage(OrdAssertEq<QPtrUsage>),
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub enum QPtrUsage {
Handles(shapes::Handle<QPtrMemUsage>),
Memory(QPtrMemUsage),
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct QPtrMemUsage {
pub max_size: Option<u32>,
pub kind: QPtrMemUsageKind,
}
impl QPtrMemUsage {
pub const UNUSED: Self = Self { max_size: Some(0), kind: QPtrMemUsageKind::Unused };
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub enum QPtrMemUsageKind {
Unused,
StrictlyTyped(Type),
DirectAccess(Type),
OffsetBase(Rc<BTreeMap<u32, QPtrMemUsage>>),
DynOffsetBase {
element: Rc<QPtrMemUsage>,
stride: NonZeroU32,
},
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub enum QPtrOp {
FuncLocalVar(shapes::MemLayout),
HandleArrayIndex,
BufferData,
BufferDynLen {
fixed_base_size: u32,
dyn_unit_stride: NonZeroU32,
},
Offset(i32),
DynOffset {
stride: NonZeroU32,
index_bounds: Option<Range<i32>>,
},
Load,
Store,
}