naga/front/wgsl/parse/directive/
enable_extension.rs1use crate::front::wgsl::{Error, Result};
6use crate::Span;
7
8use alloc::boxed::Box;
9
10#[derive(Clone, Debug, Eq, PartialEq)]
12pub struct EnableExtensions {
13 dual_source_blending: bool,
14 f16: bool,
16 clip_distances: bool,
17}
18
19impl EnableExtensions {
20 pub(crate) const fn empty() -> Self {
21 Self {
22 f16: false,
23 dual_source_blending: false,
24 clip_distances: false,
25 }
26 }
27
28 pub(crate) fn add(&mut self, ext: ImplementedEnableExtension) {
30 let field = match ext {
31 ImplementedEnableExtension::DualSourceBlending => &mut self.dual_source_blending,
32 ImplementedEnableExtension::F16 => &mut self.f16,
33 ImplementedEnableExtension::ClipDistances => &mut self.clip_distances,
34 };
35 *field = true;
36 }
37
38 pub(crate) const fn contains(&self, ext: ImplementedEnableExtension) -> bool {
40 match ext {
41 ImplementedEnableExtension::DualSourceBlending => self.dual_source_blending,
42 ImplementedEnableExtension::F16 => self.f16,
43 ImplementedEnableExtension::ClipDistances => self.clip_distances,
44 }
45 }
46}
47
48impl Default for EnableExtensions {
49 fn default() -> Self {
50 Self::empty()
51 }
52}
53
54#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
58pub enum EnableExtension {
59 Implemented(ImplementedEnableExtension),
60 Unimplemented(UnimplementedEnableExtension),
61}
62
63impl From<ImplementedEnableExtension> for EnableExtension {
64 fn from(value: ImplementedEnableExtension) -> Self {
65 Self::Implemented(value)
66 }
67}
68
69impl EnableExtension {
70 const F16: &'static str = "f16";
71 const CLIP_DISTANCES: &'static str = "clip_distances";
72 const DUAL_SOURCE_BLENDING: &'static str = "dual_source_blending";
73 const SUBGROUPS: &'static str = "subgroups";
74 const PRIMITIVE_INDEX: &'static str = "primitive_index";
75
76 pub(crate) fn from_ident(word: &str, span: Span) -> Result<'_, Self> {
78 Ok(match word {
79 Self::F16 => Self::Implemented(ImplementedEnableExtension::F16),
80 Self::CLIP_DISTANCES => Self::Implemented(ImplementedEnableExtension::ClipDistances),
81 Self::DUAL_SOURCE_BLENDING => {
82 Self::Implemented(ImplementedEnableExtension::DualSourceBlending)
83 }
84 Self::SUBGROUPS => Self::Unimplemented(UnimplementedEnableExtension::Subgroups),
85 Self::PRIMITIVE_INDEX => {
86 Self::Unimplemented(UnimplementedEnableExtension::PrimitiveIndex)
87 }
88 _ => return Err(Box::new(Error::UnknownEnableExtension(span, word))),
89 })
90 }
91
92 pub const fn to_ident(self) -> &'static str {
94 match self {
95 Self::Implemented(kind) => match kind {
96 ImplementedEnableExtension::DualSourceBlending => Self::DUAL_SOURCE_BLENDING,
97 ImplementedEnableExtension::F16 => Self::F16,
98 ImplementedEnableExtension::ClipDistances => Self::CLIP_DISTANCES,
99 },
100 Self::Unimplemented(kind) => match kind {
101 UnimplementedEnableExtension::Subgroups => Self::SUBGROUPS,
102 UnimplementedEnableExtension::PrimitiveIndex => Self::PRIMITIVE_INDEX,
103 },
104 }
105 }
106}
107
108#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
110pub enum ImplementedEnableExtension {
111 F16,
117 DualSourceBlending,
123 ClipDistances,
129}
130
131#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
133pub enum UnimplementedEnableExtension {
134 Subgroups,
140 PrimitiveIndex,
146}
147
148impl UnimplementedEnableExtension {
149 pub(crate) const fn tracking_issue_num(self) -> u16 {
150 match self {
151 Self::Subgroups => 5555,
152 Self::PrimitiveIndex => 8236,
153 }
154 }
155}