summaryrefslogtreecommitdiffstats
path: root/third_party/rust/naga/src/front/spv/null.rs
blob: 42cccca80a07e0c4e9c6811f86c68c178878d8a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use super::Error;
use crate::arena::{Arena, Handle};

/// Create a default value for an output built-in.
pub fn generate_default_built_in(
    built_in: Option<crate::BuiltIn>,
    ty: Handle<crate::Type>,
    const_expressions: &mut Arena<crate::Expression>,
    span: crate::Span,
) -> Result<Handle<crate::Expression>, Error> {
    let expr = match built_in {
        Some(crate::BuiltIn::Position { .. }) => {
            let zero = const_expressions
                .append(crate::Expression::Literal(crate::Literal::F32(0.0)), span);
            let one = const_expressions
                .append(crate::Expression::Literal(crate::Literal::F32(1.0)), span);
            crate::Expression::Compose {
                ty,
                components: vec![zero, zero, zero, one],
            }
        }
        Some(crate::BuiltIn::PointSize) => crate::Expression::Literal(crate::Literal::F32(1.0)),
        Some(crate::BuiltIn::FragDepth) => crate::Expression::Literal(crate::Literal::F32(0.0)),
        Some(crate::BuiltIn::SampleMask) => {
            crate::Expression::Literal(crate::Literal::U32(u32::MAX))
        }
        // Note: `crate::BuiltIn::ClipDistance` is intentionally left for the default path
        _ => crate::Expression::ZeroValue(ty),
    };
    Ok(const_expressions.append(expr, span))
}