use alloc::{string::String, vec::Vec};
use crate::{
Function,
interface::{InstructionCount, Interface, ShaderFormat, Stage},
};
#[derive(Clone, Copy, Debug, PartialEq, Eq, serde::Serialize)]
pub enum ClipDepth {
ZeroToOne,
MinusOneToOne,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, serde::Serialize)]
pub enum Corner {
TopLeft,
BottomLeft,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, serde::Serialize)]
pub struct Conventions {
pub clip_depth: ClipDepth,
pub fragment_origin: Corner,
pub texture_origin: Corner,
}
impl Conventions {
pub const D3D: Self = Self {
clip_depth: ClipDepth::ZeroToOne,
fragment_origin: Corner::TopLeft,
texture_origin: Corner::TopLeft,
};
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, serde::Serialize)]
pub enum Denormals {
#[default]
Any,
Preserve,
Flush,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, serde::Serialize)]
pub struct FloatEnv {
pub f16: Denormals,
pub f32: Denormals,
pub f64: Denormals,
}
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize)]
pub struct Provenance {
pub format: ShaderFormat,
pub target: String,
pub lifter: String,
pub lifter_version: u32,
pub source_hash: Option<String>,
pub instruction_count: Option<InstructionCount>,
pub policies: Vec<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize)]
pub struct Program {
pub stage: Stage,
pub entry: Function,
pub interface: Interface,
pub conventions: Conventions,
pub float: FloatEnv,
pub provenance: Provenance,
pub notes: Vec<String>,
}