11use crate :: { CompiledShaderModules , Options , maybe_watch} ;
2- use wgpu:: ShaderModuleDescriptorPassthrough ;
2+ use std:: borrow:: Cow ;
3+ use wgpu:: { ExperimentalFeatures , ShaderModuleDescriptor , ShaderSource } ;
34
45use shared:: ShaderConstants ;
56use std:: slice;
@@ -77,7 +78,7 @@ async fn run(
7778
7879 let mut required_features = wgpu:: Features :: PUSH_CONSTANTS ;
7980 if options. force_spirv_passthru {
80- required_features |= wgpu:: Features :: SPIRV_SHADER_PASSTHROUGH ;
81+ required_features |= wgpu:: Features :: EXPERIMENTAL_PASSTHROUGH_SHADERS ;
8182 }
8283 let required_limits = wgpu:: Limits {
8384 max_push_constant_size : 128 ,
@@ -90,6 +91,11 @@ async fn run(
9091 label : None ,
9192 required_features,
9293 required_limits,
94+ experimental_features : if options. force_spirv_passthru {
95+ unsafe { ExperimentalFeatures :: enabled ( ) }
96+ } else {
97+ ExperimentalFeatures :: disabled ( )
98+ } ,
9399 memory_hints : wgpu:: MemoryHints :: Performance ,
94100 trace : Default :: default ( ) ,
95101 } )
@@ -438,8 +444,12 @@ fn create_pipeline(
438444 if options. emulate_push_constants_with_storage_buffer {
439445 let ( ds, b) = ( 0 , 0 ) ;
440446
441- for ( _, shader_module_descr) in & mut compiled_shader_modules. named_spv_modules {
442- let w = shader_module_descr. source . to_mut ( ) ;
447+ for ( _, module) in & mut compiled_shader_modules. named_spv_modules {
448+ let spirv = match & mut module. source {
449+ ShaderSource :: SpirV ( spirv) => spirv,
450+ _ => unreachable ! ( ) ,
451+ } ;
452+ let w = spirv. to_mut ( ) ;
443453 assert_eq ! ( ( w[ 0 ] , w[ 4 ] ) , ( 0x07230203 , 0 ) ) ;
444454 let mut last_op_decorate_start = None ;
445455 let mut i = 5 ;
@@ -467,39 +477,30 @@ fn create_pipeline(
467477 }
468478
469479 // FIXME(eddyb) automate this decision by default.
470- let create_module = |module| {
480+ let create_module = |module : ShaderModuleDescriptor < ' _ > | {
471481 if options. force_spirv_passthru {
472482 unsafe {
473- device. create_shader_module_passthrough ( ShaderModuleDescriptorPassthrough :: SpirV (
474- module,
475- ) )
483+ let spirv = match & module. source {
484+ ShaderSource :: SpirV ( spirv) => spirv,
485+ _ => unreachable ! ( ) ,
486+ } ;
487+ device. create_shader_module_passthrough ( wgpu:: ShaderModuleDescriptorPassthrough {
488+ label : module. label ,
489+ spirv : Some ( Cow :: Borrowed ( spirv) ) ,
490+ ..Default :: default ( )
491+ } )
476492 }
477493 } else {
478- let wgpu:: ShaderModuleDescriptorSpirV { label, source } = module;
479- device. create_shader_module ( wgpu:: ShaderModuleDescriptor {
480- label,
481- source : wgpu:: ShaderSource :: SpirV ( source) ,
482- } )
494+ device. create_shader_module ( module)
483495 }
484496 } ;
485497
486498 let vs_entry_point = shaders:: main_vs;
487499 let fs_entry_point = shaders:: main_fs;
488-
489500 let vs_module_descr = compiled_shader_modules. spv_module_for_entry_point ( vs_entry_point) ;
490501 let fs_module_descr = compiled_shader_modules. spv_module_for_entry_point ( fs_entry_point) ;
491-
492- // HACK(eddyb) avoid calling `device.create_shader_module` twice unnecessarily.
493- let vs_fs_same_module = std:: ptr:: eq ( & vs_module_descr. source [ ..] , & fs_module_descr. source [ ..] ) ;
494-
495502 let vs_module = & create_module ( vs_module_descr) ;
496- let fs_module;
497- let fs_module = if vs_fs_same_module {
498- vs_module
499- } else {
500- fs_module = create_module ( fs_module_descr) ;
501- & fs_module
502- } ;
503+ let fs_module = & create_module ( fs_module_descr) ;
503504
504505 device. create_render_pipeline ( & wgpu:: RenderPipelineDescriptor {
505506 cache : None ,
0 commit comments