wgcore/
utils.rs

1//! Utilities for creating a ComputePipeline from source or from a naga module.
2
3use wgpu::naga::Module;
4use wgpu::{ComputePipeline, ComputePipelineDescriptor, Device};
5
6/// Creates a compute pipeline from the shader sources `content` and the name of its `entry_point`.
7pub fn load_shader(device: &Device, entry_point: &str, content: &str) -> ComputePipeline {
8    let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
9        label: None,
10        source: wgpu::ShaderSource::Wgsl(std::borrow::Cow::Borrowed(content)),
11    });
12    device.create_compute_pipeline(&ComputePipelineDescriptor {
13        label: Some(entry_point),
14        layout: None,
15        module: &shader,
16        entry_point: Some(entry_point),
17        compilation_options: Default::default(),
18        cache: None,
19    })
20}
21
22/// Creates a compute pipeline from the shader `module` and the name of its `entry_point`.
23pub fn load_module(device: &Device, entry_point: &str, module: Module) -> ComputePipeline {
24    let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
25        label: None,
26        source: wgpu::ShaderSource::Naga(std::borrow::Cow::Owned(module)),
27    });
28    device.create_compute_pipeline(&ComputePipelineDescriptor {
29        label: Some(entry_point),
30        layout: None,
31        module: &shader,
32        entry_point: Some(entry_point),
33        compilation_options: Default::default(),
34        cache: None,
35    })
36}
37
38/// Convents a naga module to its WGSL string representation.
39pub fn naga_module_to_wgsl(module: &Module) -> String {
40    use wgpu::naga;
41
42    let mut validator = naga::valid::Validator::new(naga::valid::ValidationFlags::all(), Default::default());
43    let info = validator
44        .validate(module)
45        .unwrap();
46
47    naga::back::wgsl::write_string(
48        module,
49        &info,
50        naga::back::wgsl::WriterFlags::EXPLICIT_TYPES,
51    ).unwrap()
52}