use iridia::ResourceId;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Element {
pub id: ResourceId,
pub index: u32,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Dim {
D1,
D2,
D3,
Cube,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum ImageLod {
Implicit,
Bias(f32),
Level(f32),
Gradients([[f32; 3]; 2]),
GradientsBias([[f32; 3]; 2], f32),
}
#[derive(Clone, Copy, Debug)]
pub struct ImageSample<R> {
pub texture: R,
pub sampler: R,
pub dim: Dim,
pub coord: [f32; 3],
pub layer: Option<f32>,
pub lod: ImageLod,
pub offset: [i32; 3],
pub gather: Option<u8>,
pub depth_ref: Option<f32>,
pub depth: bool,
}
#[derive(Clone, Copy, Debug)]
pub struct ImageLoad<R> {
pub texture: R,
pub dim: Dim,
pub storage: bool,
pub texel: [i32; 3],
pub layer: Option<i32>,
pub sample: Option<i32>,
pub mip: Option<i32>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum QueryKind {
Size,
Levels,
Layers,
Samples,
}
#[derive(Clone, Copy, Debug)]
pub struct ImageQuery<R> {
pub texture: R,
pub dim: Dim,
pub kind: QueryKind,
pub level: Option<u32>,
}
#[derive(Clone, Copy, Debug)]
pub struct ImageStore<R> {
pub view: R,
pub index: u32,
pub dim: Dim,
pub texel: [u32; 3],
pub layer: Option<u32>,
pub value: [u32; 4],
pub lanes: u8,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ImageAtomicOp {
Add,
Sub,
And,
Or,
Xor,
Min,
Max,
Exchange,
}
#[derive(Clone, Copy, Debug)]
pub struct ImageAtomic<R> {
pub view: R,
pub index: u32,
pub dim: Dim,
pub texel: [u32; 3],
pub layer: Option<u32>,
pub op: ImageAtomicOp,
pub signed: bool,
pub value: u32,
}
#[derive(Debug)]
pub struct TraceRay<'a> {
pub scene: ResourceId,
pub flags: u32,
pub mask: u32,
pub hit_group_offset: u32,
pub hit_group_stride: u32,
pub miss_index: u32,
pub origin: [f32; 3],
pub t_min: f32,
pub direction: [f32; 3],
pub t_max: f32,
pub payload: &'a mut [u32],
}
#[derive(Debug)]
pub struct ReportHit<'a> {
pub t: f32,
pub hit_kind: u32,
pub attributes: &'a mut [u32],
}
#[derive(Debug)]
pub struct CallShader<'a> {
pub index: u32,
pub parameter: &'a mut [u32],
}
pub trait Backend {
fn sample(&mut self, request: ImageSample<Element>) -> Result<[f32; 4], String>;
fn load(&mut self, request: ImageLoad<Element>) -> Result<[u32; 4], String> {
Err(format!("resource {}: no loads given", request.texture.id.0))
}
fn query(&mut self, request: ImageQuery<Element>) -> Result<[u32; 4], String> {
Err(format!("resource {}: no queries given", request.texture.id.0))
}
fn store_image(&mut self, request: ImageStore<ResourceId>) -> Result<(), String> {
Err(format!("resource {}: no stores given", request.view.0))
}
fn trace_ray(&mut self, request: TraceRay<'_>) -> Result<(), String> {
let _ = request;
Err("no ray tracing pipeline given".into())
}
fn report_hit(&mut self, request: ReportHit<'_>) -> Result<bool, String> {
let _ = request;
Err("no ray tracing pipeline given".into())
}
fn call_shader(&mut self, request: CallShader<'_>) -> Result<(), String> {
let _ = request;
Err("no ray tracing pipeline given".into())
}
fn atomic_image(&mut self, request: ImageAtomic<ResourceId>) -> Result<u32, String> {
Err(format!("resource {}: no image atomics given", request.view.0))
}
fn store_buffer(&mut self, view: ResourceId, word: u32, value: [u32; 4], mask: u8) -> Result<(), String> {
let _ = (word, value, mask);
Err(format!("resource {}: no stores given", view.0))
}
fn read_buffer(&mut self, view: ResourceId, word: u32, count: u8) -> Result<[u32; 4], String> {
let _ = (word, count);
Err(format!("resource {}: no buffer given", view.0))
}
fn buffer_words(&mut self, view: ResourceId) -> Result<u32, String> {
Err(format!("resource {}: no buffer given", view.0))
}
fn atomic_add(&mut self, view: ResourceId, word: u32, value: u32) -> Result<u32, String> {
let _ = (word, value);
Err(format!("resource {}: no atomics given", view.0))
}
}