summaryrefslogtreecommitdiffstats
path: root/third_party/rust/naga/src/front/wgsl/conv.rs
blob: 6fdea89e7ac6bb6d7024b2f1311751cd576a52a2 (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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
use super::Error;

pub fn map_storage_class(word: &str) -> Result<crate::StorageClass, Error<'_>> {
    match word {
        "in" => Ok(crate::StorageClass::Input),
        "out" => Ok(crate::StorageClass::Output),
        "private" => Ok(crate::StorageClass::Private),
        "uniform" => Ok(crate::StorageClass::Uniform),
        "storage" => Ok(crate::StorageClass::Storage),
        _ => Err(Error::UnknownStorageClass(word)),
    }
}

pub fn map_built_in(word: &str) -> Result<crate::BuiltIn, Error<'_>> {
    Ok(match word {
        // vertex
        "position" => crate::BuiltIn::Position,
        "vertex_idx" => crate::BuiltIn::VertexIndex,
        "instance_idx" => crate::BuiltIn::InstanceIndex,
        // fragment
        "front_facing" => crate::BuiltIn::FrontFacing,
        "frag_coord" => crate::BuiltIn::FragCoord,
        "frag_depth" => crate::BuiltIn::FragDepth,
        // compute
        "global_invocation_id" => crate::BuiltIn::GlobalInvocationId,
        "local_invocation_id" => crate::BuiltIn::LocalInvocationId,
        "local_invocation_idx" => crate::BuiltIn::LocalInvocationIndex,
        _ => return Err(Error::UnknownBuiltin(word)),
    })
}

pub fn map_shader_stage(word: &str) -> Result<crate::ShaderStage, Error<'_>> {
    match word {
        "vertex" => Ok(crate::ShaderStage::Vertex),
        "fragment" => Ok(crate::ShaderStage::Fragment),
        "compute" => Ok(crate::ShaderStage::Compute),
        _ => Err(Error::UnknownShaderStage(word)),
    }
}

pub fn map_interpolation(word: &str) -> Result<crate::Interpolation, Error<'_>> {
    match word {
        "linear" => Ok(crate::Interpolation::Linear),
        "flat" => Ok(crate::Interpolation::Flat),
        "centroid" => Ok(crate::Interpolation::Centroid),
        "sample" => Ok(crate::Interpolation::Sample),
        "perspective" => Ok(crate::Interpolation::Perspective),
        _ => Err(Error::UnknownDecoration(word)),
    }
}

pub fn map_storage_format(word: &str) -> Result<crate::StorageFormat, Error<'_>> {
    use crate::StorageFormat as Sf;
    Ok(match word {
        "r8unorm" => Sf::R8Unorm,
        "r8snorm" => Sf::R8Snorm,
        "r8uint" => Sf::R8Uint,
        "r8sint" => Sf::R8Sint,
        "r16uint" => Sf::R16Uint,
        "r16sint" => Sf::R16Sint,
        "r16float" => Sf::R16Float,
        "rg8unorm" => Sf::Rg8Unorm,
        "rg8snorm" => Sf::Rg8Snorm,
        "rg8uint" => Sf::Rg8Uint,
        "rg8sint" => Sf::Rg8Sint,
        "r32uint" => Sf::R32Uint,
        "r32sint" => Sf::R32Sint,
        "r32float" => Sf::R32Float,
        "rg16uint" => Sf::Rg16Uint,
        "rg16sint" => Sf::Rg16Sint,
        "rg16float" => Sf::Rg16Float,
        "rgba8unorm" => Sf::Rgba8Unorm,
        "rgba8snorm" => Sf::Rgba8Snorm,
        "rgba8uint" => Sf::Rgba8Uint,
        "rgba8sint" => Sf::Rgba8Sint,
        "rgb10a2unorm" => Sf::Rgb10a2Unorm,
        "rg11b10float" => Sf::Rg11b10Float,
        "rg32uint" => Sf::Rg32Uint,
        "rg32sint" => Sf::Rg32Sint,
        "rg32float" => Sf::Rg32Float,
        "rgba16uint" => Sf::Rgba16Uint,
        "rgba16sint" => Sf::Rgba16Sint,
        "rgba16float" => Sf::Rgba16Float,
        "rgba32uint" => Sf::Rgba32Uint,
        "rgba32sint" => Sf::Rgba32Sint,
        "rgba32float" => Sf::Rgba32Float,
        _ => return Err(Error::UnknownStorageFormat(word)),
    })
}

pub fn get_scalar_type(word: &str) -> Option<(crate::ScalarKind, crate::Bytes)> {
    match word {
        "f32" => Some((crate::ScalarKind::Float, 4)),
        "i32" => Some((crate::ScalarKind::Sint, 4)),
        "u32" => Some((crate::ScalarKind::Uint, 4)),
        _ => None,
    }
}

pub fn get_intrinsic(word: &str) -> Option<crate::IntrinsicFunction> {
    match word {
        "any" => Some(crate::IntrinsicFunction::Any),
        "all" => Some(crate::IntrinsicFunction::All),
        "is_nan" => Some(crate::IntrinsicFunction::IsNan),
        "is_inf" => Some(crate::IntrinsicFunction::IsInf),
        "is_normal" => Some(crate::IntrinsicFunction::IsNormal),
        _ => None,
    }
}
pub fn get_derivative(word: &str) -> Option<crate::DerivativeAxis> {
    match word {
        "dpdx" => Some(crate::DerivativeAxis::X),
        "dpdy" => Some(crate::DerivativeAxis::Y),
        "dwidth" => Some(crate::DerivativeAxis::Width),
        _ => None,
    }
}