rend3_routine/common/
shaders.rs

1use std::borrow::Cow;
2
3use rend3::RendererProfile;
4use wgpu::{Device, ShaderModule, ShaderModuleDescriptor, ShaderModuleDescriptorSpirV, ShaderSource};
5
6use crate::shaders::{SPIRV_SHADERS, WGSL_SHADERS};
7
8/// When CpuDriven, creates a checked wgsl shader, when CpuDriven creates a
9/// passthrough SPIRV shader.
10///
11/// # Safety
12///
13/// The shader must be valid, match all the respective definitions, and
14/// otherwise meet wgpu's validation requirements
15pub unsafe fn profile_safe_shader(
16    device: &Device,
17    profile: RendererProfile,
18    label: &str,
19    cpu_source: &str,
20    gpu_source: &str,
21) -> ShaderModule {
22    let shader_dir = match profile {
23        RendererProfile::CpuDriven => &WGSL_SHADERS,
24        RendererProfile::GpuDriven => &SPIRV_SHADERS,
25    };
26
27    let source = shader_dir
28        .get_file(match profile {
29            RendererProfile::CpuDriven => cpu_source,
30            RendererProfile::GpuDriven => gpu_source,
31        })
32        .unwrap()
33        .contents();
34
35    let use_unsafe = profile == RendererProfile::GpuDriven;
36
37    match use_unsafe {
38        false => device.create_shader_module(&ShaderModuleDescriptor {
39            label: Some(label),
40            source: ShaderSource::Wgsl(Cow::Borrowed(std::str::from_utf8(source).unwrap())),
41        }),
42        true => device.create_shader_module_spirv(&ShaderModuleDescriptorSpirV {
43            label: Some(label),
44            source: wgpu::util::make_spirv_raw(source),
45        }),
46    }
47}