use wgpu::naga::Module;
use wgpu::{ComputePipeline, ComputePipelineDescriptor, Device};
pub fn load_shader(device: &Device, entry_point: &str, content: &str) -> ComputePipeline {
let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
label: None,
source: wgpu::ShaderSource::Wgsl(std::borrow::Cow::Borrowed(content)),
});
device.create_compute_pipeline(&ComputePipelineDescriptor {
label: Some(entry_point),
layout: None,
module: &shader,
entry_point: Some(entry_point),
compilation_options: Default::default(),
cache: None,
})
}
pub fn load_module(device: &Device, entry_point: &str, module: Module) -> ComputePipeline {
let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor {
label: None,
source: wgpu::ShaderSource::Naga(std::borrow::Cow::Owned(module)),
});
device.create_compute_pipeline(&ComputePipelineDescriptor {
label: Some(entry_point),
layout: None,
module: &shader,
entry_point: Some(entry_point),
compilation_options: Default::default(),
cache: None,
})
}
pub fn naga_module_to_wgsl(module: &Module) -> String {
use wgpu::naga;
let mut validator = naga::valid::Validator::new(naga::valid::ValidationFlags::all(), Default::default());
let info = validator
.validate(module)
.unwrap();
naga::back::wgsl::write_string(
module,
&info,
naga::back::wgsl::WriterFlags::EXPLICIT_TYPES,
).unwrap()
}