rend3_routine/common/
shaders.rs1use std::borrow::Cow;
2
3use rend3::RendererProfile;
4use wgpu::{Device, ShaderModule, ShaderModuleDescriptor, ShaderModuleDescriptorSpirV, ShaderSource};
5
6use crate::shaders::{SPIRV_SHADERS, WGSL_SHADERS};
7
8pub 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}