use crate::front::wgsl::{Error, Result};
use crate::Span;
use alloc::boxed::Box;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct EnableExtensions {
wgpu_mesh_shader: bool,
wgpu_ray_query: bool,
wgpu_ray_query_vertex_return: bool,
dual_source_blending: bool,
f16: bool,
clip_distances: bool,
}
impl EnableExtensions {
pub(crate) const fn empty() -> Self {
Self {
wgpu_mesh_shader: false,
wgpu_ray_query: false,
wgpu_ray_query_vertex_return: false,
f16: false,
dual_source_blending: false,
clip_distances: false,
}
}
pub(crate) fn add(&mut self, ext: ImplementedEnableExtension) {
let field = match ext {
ImplementedEnableExtension::WgpuMeshShader => &mut self.wgpu_mesh_shader,
ImplementedEnableExtension::WgpuRayQuery => &mut self.wgpu_ray_query,
ImplementedEnableExtension::WgpuRayQueryVertexReturn => {
&mut self.wgpu_ray_query_vertex_return
}
ImplementedEnableExtension::DualSourceBlending => &mut self.dual_source_blending,
ImplementedEnableExtension::F16 => &mut self.f16,
ImplementedEnableExtension::ClipDistances => &mut self.clip_distances,
};
*field = true;
}
pub(crate) const fn contains(&self, ext: ImplementedEnableExtension) -> bool {
match ext {
ImplementedEnableExtension::WgpuMeshShader => self.wgpu_mesh_shader,
ImplementedEnableExtension::WgpuRayQuery => self.wgpu_ray_query,
ImplementedEnableExtension::WgpuRayQueryVertexReturn => {
self.wgpu_ray_query_vertex_return
}
ImplementedEnableExtension::DualSourceBlending => self.dual_source_blending,
ImplementedEnableExtension::F16 => self.f16,
ImplementedEnableExtension::ClipDistances => self.clip_distances,
}
}
}
impl Default for EnableExtensions {
fn default() -> Self {
Self::empty()
}
}
#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
pub enum EnableExtension {
Implemented(ImplementedEnableExtension),
Unimplemented(UnimplementedEnableExtension),
}
impl From<ImplementedEnableExtension> for EnableExtension {
fn from(value: ImplementedEnableExtension) -> Self {
Self::Implemented(value)
}
}
impl EnableExtension {
const F16: &'static str = "f16";
const CLIP_DISTANCES: &'static str = "clip_distances";
const DUAL_SOURCE_BLENDING: &'static str = "dual_source_blending";
const MESH_SHADER: &'static str = "wgpu_mesh_shader";
const RAY_QUERY: &'static str = "wgpu_ray_query";
const RAY_QUERY_VERTEX_RETURN: &'static str = "wgpu_ray_query_vertex_return";
const SUBGROUPS: &'static str = "subgroups";
const PRIMITIVE_INDEX: &'static str = "primitive_index";
pub(crate) fn from_ident(word: &str, span: Span) -> Result<'_, Self> {
Ok(match word {
Self::F16 => Self::Implemented(ImplementedEnableExtension::F16),
Self::CLIP_DISTANCES => Self::Implemented(ImplementedEnableExtension::ClipDistances),
Self::DUAL_SOURCE_BLENDING => {
Self::Implemented(ImplementedEnableExtension::DualSourceBlending)
}
Self::MESH_SHADER => Self::Implemented(ImplementedEnableExtension::WgpuMeshShader),
Self::RAY_QUERY => Self::Implemented(ImplementedEnableExtension::WgpuRayQuery),
Self::RAY_QUERY_VERTEX_RETURN => {
Self::Implemented(ImplementedEnableExtension::WgpuRayQueryVertexReturn)
}
Self::SUBGROUPS => Self::Unimplemented(UnimplementedEnableExtension::Subgroups),
Self::PRIMITIVE_INDEX => {
Self::Unimplemented(UnimplementedEnableExtension::PrimitiveIndex)
}
_ => return Err(Box::new(Error::UnknownEnableExtension(span, word))),
})
}
pub const fn to_ident(self) -> &'static str {
match self {
Self::Implemented(kind) => match kind {
ImplementedEnableExtension::WgpuMeshShader => Self::MESH_SHADER,
ImplementedEnableExtension::WgpuRayQuery => Self::RAY_QUERY,
ImplementedEnableExtension::WgpuRayQueryVertexReturn => {
Self::RAY_QUERY_VERTEX_RETURN
}
ImplementedEnableExtension::DualSourceBlending => Self::DUAL_SOURCE_BLENDING,
ImplementedEnableExtension::F16 => Self::F16,
ImplementedEnableExtension::ClipDistances => Self::CLIP_DISTANCES,
},
Self::Unimplemented(kind) => match kind {
UnimplementedEnableExtension::Subgroups => Self::SUBGROUPS,
UnimplementedEnableExtension::PrimitiveIndex => Self::PRIMITIVE_INDEX,
},
}
}
}
#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
pub enum ImplementedEnableExtension {
F16,
DualSourceBlending,
ClipDistances,
WgpuMeshShader,
WgpuRayQuery,
WgpuRayQueryVertexReturn,
}
#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
pub enum UnimplementedEnableExtension {
Subgroups,
PrimitiveIndex,
}
impl UnimplementedEnableExtension {
pub(crate) const fn tracking_issue_num(self) -> u16 {
match self {
Self::Subgroups => 5555,
Self::PrimitiveIndex => 8236,
}
}
}