naga/back/wgsl/
mod.rs
mod polyfill;
mod writer;
use alloc::format;
use alloc::string::String;
use thiserror::Error;
pub use writer::{Writer, WriterFlags};
use crate::common::wgsl;
#[derive(Error, Debug)]
pub enum Error {
#[error(transparent)]
FmtError(#[from] core::fmt::Error),
#[error("{0}")]
Custom(String),
#[error("{0}")]
Unimplemented(String), #[error("Unsupported relational function: {0:?}")]
UnsupportedRelationalFunction(crate::RelationalFunction),
#[error("Unsupported {kind}: {value}")]
Unsupported {
kind: &'static str,
value: String,
},
}
impl Error {
fn unsupported<T: core::fmt::Debug>(kind: &'static str, value: T) -> Error {
Error::Unsupported {
kind,
value: format!("{value:?}"),
}
}
}
trait ToWgslIfImplemented {
fn to_wgsl_if_implemented(self) -> Result<&'static str, Error>;
}
impl<T> ToWgslIfImplemented for T
where
T: wgsl::TryToWgsl + core::fmt::Debug + Copy,
{
fn to_wgsl_if_implemented(self) -> Result<&'static str, Error> {
self.try_to_wgsl()
.ok_or_else(|| Error::unsupported(T::DESCRIPTION, self))
}
}
pub fn write_string(
module: &crate::Module,
info: &crate::valid::ModuleInfo,
flags: WriterFlags,
) -> Result<String, Error> {
let mut w = Writer::new(String::new(), flags);
w.write(module, info)?;
let output = w.finish();
Ok(output)
}
impl crate::AtomicFunction {
const fn to_wgsl(self) -> &'static str {
match self {
Self::Add => "Add",
Self::Subtract => "Sub",
Self::And => "And",
Self::InclusiveOr => "Or",
Self::ExclusiveOr => "Xor",
Self::Min => "Min",
Self::Max => "Max",
Self::Exchange { compare: None } => "Exchange",
Self::Exchange { .. } => "CompareExchangeWeak",
}
}
}