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 wgpu_mesh_shader: bool,
14 wgpu_ray_query: bool,
15 wgpu_ray_query_vertex_return: bool,
16 dual_source_blending: bool,
17 f16: bool,
19 clip_distances: bool,
20 wgpu_cooperative_matrix: bool,
21}
22
23impl EnableExtensions {
24 pub(crate) const fn empty() -> Self {
25 Self {
26 wgpu_mesh_shader: false,
27 wgpu_ray_query: false,
28 wgpu_ray_query_vertex_return: false,
29 f16: false,
30 dual_source_blending: false,
31 clip_distances: false,
32 wgpu_cooperative_matrix: false,
33 }
34 }
35
36 pub(crate) fn add(&mut self, ext: ImplementedEnableExtension) {
38 let field = match ext {
39 ImplementedEnableExtension::WgpuMeshShader => &mut self.wgpu_mesh_shader,
40 ImplementedEnableExtension::WgpuRayQuery => &mut self.wgpu_ray_query,
41 ImplementedEnableExtension::WgpuRayQueryVertexReturn => {
42 &mut self.wgpu_ray_query_vertex_return
43 }
44 ImplementedEnableExtension::DualSourceBlending => &mut self.dual_source_blending,
45 ImplementedEnableExtension::F16 => &mut self.f16,
46 ImplementedEnableExtension::ClipDistances => &mut self.clip_distances,
47 ImplementedEnableExtension::WgpuCooperativeMatrix => &mut self.wgpu_cooperative_matrix,
48 };
49 *field = true;
50 }
51
52 pub(crate) const fn contains(&self, ext: ImplementedEnableExtension) -> bool {
54 match ext {
55 ImplementedEnableExtension::WgpuMeshShader => self.wgpu_mesh_shader,
56 ImplementedEnableExtension::WgpuRayQuery => self.wgpu_ray_query,
57 ImplementedEnableExtension::WgpuRayQueryVertexReturn => {
58 self.wgpu_ray_query_vertex_return
59 }
60 ImplementedEnableExtension::DualSourceBlending => self.dual_source_blending,
61 ImplementedEnableExtension::F16 => self.f16,
62 ImplementedEnableExtension::ClipDistances => self.clip_distances,
63 ImplementedEnableExtension::WgpuCooperativeMatrix => self.wgpu_cooperative_matrix,
64 }
65 }
66}
67
68impl Default for EnableExtensions {
69 fn default() -> Self {
70 Self::empty()
71 }
72}
73
74#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
78pub enum EnableExtension {
79 Implemented(ImplementedEnableExtension),
80 Unimplemented(UnimplementedEnableExtension),
81}
82
83impl From<ImplementedEnableExtension> for EnableExtension {
84 fn from(value: ImplementedEnableExtension) -> Self {
85 Self::Implemented(value)
86 }
87}
88
89impl EnableExtension {
90 const F16: &'static str = "f16";
91 const CLIP_DISTANCES: &'static str = "clip_distances";
92 const DUAL_SOURCE_BLENDING: &'static str = "dual_source_blending";
93 const MESH_SHADER: &'static str = "wgpu_mesh_shader";
94 const RAY_QUERY: &'static str = "wgpu_ray_query";
95 const RAY_QUERY_VERTEX_RETURN: &'static str = "wgpu_ray_query_vertex_return";
96 const COOPERATIVE_MATRIX: &'static str = "wgpu_cooperative_matrix";
97 const SUBGROUPS: &'static str = "subgroups";
98 const PRIMITIVE_INDEX: &'static str = "primitive_index";
99
100 pub(crate) fn from_ident(word: &str, span: Span) -> Result<'_, Self> {
102 Ok(match word {
103 Self::F16 => Self::Implemented(ImplementedEnableExtension::F16),
104 Self::CLIP_DISTANCES => Self::Implemented(ImplementedEnableExtension::ClipDistances),
105 Self::DUAL_SOURCE_BLENDING => {
106 Self::Implemented(ImplementedEnableExtension::DualSourceBlending)
107 }
108 Self::MESH_SHADER => Self::Implemented(ImplementedEnableExtension::WgpuMeshShader),
109 Self::RAY_QUERY => Self::Implemented(ImplementedEnableExtension::WgpuRayQuery),
110 Self::RAY_QUERY_VERTEX_RETURN => {
111 Self::Implemented(ImplementedEnableExtension::WgpuRayQueryVertexReturn)
112 }
113 Self::COOPERATIVE_MATRIX => {
114 Self::Implemented(ImplementedEnableExtension::WgpuCooperativeMatrix)
115 }
116 Self::SUBGROUPS => Self::Unimplemented(UnimplementedEnableExtension::Subgroups),
117 Self::PRIMITIVE_INDEX => {
118 Self::Unimplemented(UnimplementedEnableExtension::PrimitiveIndex)
119 }
120 _ => return Err(Box::new(Error::UnknownEnableExtension(span, word))),
121 })
122 }
123
124 pub const fn to_ident(self) -> &'static str {
126 match self {
127 Self::Implemented(kind) => match kind {
128 ImplementedEnableExtension::WgpuMeshShader => Self::MESH_SHADER,
129 ImplementedEnableExtension::WgpuRayQuery => Self::RAY_QUERY,
130 ImplementedEnableExtension::WgpuRayQueryVertexReturn => {
131 Self::RAY_QUERY_VERTEX_RETURN
132 }
133 ImplementedEnableExtension::WgpuCooperativeMatrix => Self::COOPERATIVE_MATRIX,
134 ImplementedEnableExtension::DualSourceBlending => Self::DUAL_SOURCE_BLENDING,
135 ImplementedEnableExtension::F16 => Self::F16,
136 ImplementedEnableExtension::ClipDistances => Self::CLIP_DISTANCES,
137 },
138 Self::Unimplemented(kind) => match kind {
139 UnimplementedEnableExtension::Subgroups => Self::SUBGROUPS,
140 UnimplementedEnableExtension::PrimitiveIndex => Self::PRIMITIVE_INDEX,
141 },
142 }
143 }
144}
145
146#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
148pub enum ImplementedEnableExtension {
149 F16,
155 DualSourceBlending,
161 ClipDistances,
167 WgpuMeshShader,
169 WgpuRayQuery,
171 WgpuRayQueryVertexReturn,
173 WgpuCooperativeMatrix,
175}
176
177#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
179pub enum UnimplementedEnableExtension {
180 Subgroups,
186 PrimitiveIndex,
192}
193
194impl UnimplementedEnableExtension {
195 pub(crate) const fn tracking_issue_num(self) -> u16 {
196 match self {
197 Self::Subgroups => 5555,
198 Self::PrimitiveIndex => 8236,
199 }
200 }
201}