mod pipeline;
pub use pipeline::{ClipVaryings, Pipeline, Written, wgsl_for};
use crate::{Program, ProgramError as Error};
pub fn wgsl(program: &Program) -> Result<String, Error> {
writable(program)?;
wgsl_functions(program)
}
fn writable(program: &Program) -> Result<(), Error> {
if crate::stage_functions(&program.interface)
.map_err(Error::Invalid)?
.is_some()
{
return Err(Error::Unsupported {
writer: "wgsl",
detail: format!(
"a {:?} program{} has no WGSL stage: it is functions, not an entry point",
program.stage,
if program.stage == crate::Stage::Vertex {
" that feeds a tessellator"
} else {
""
}
),
});
}
if program.stage.is_ray_tracing() {
return Err(ray_tracing(program));
}
Ok(())
}
fn ray_tracing(program: &Program) -> Error {
Error::Unsupported {
writer: "wgsl",
detail: format!(
"a {:?} program has no WGSL form: WebGPU has no ray tracing pipeline, and the program's operations \
({}) are the pipeline's",
program.stage,
crate::rt::OPERATIONS.join(", ")
),
}
}
pub fn wgsl_functions(program: &Program) -> Result<String, Error> {
if program.stage.is_ray_tracing() {
return Err(ray_tracing(program));
}
module_text(program)
}
pub(crate) fn module_text(program: &Program) -> Result<String, Error> {
let info = program.validated()?;
naga::back::wgsl::write_string(&program.module, &info, naga::back::wgsl::WriterFlags::empty()).map_err(
|e| Error::Unsupported {
writer: "wgsl",
detail: e.to_string(),
},
)
}