@@ -42,6 +42,32 @@ fn set_codegen_spirv_location(dylib_path: std::path::PathBuf) {
4242 std:: env:: set_var ( env_var, path) ;
4343}
4444
45+ fn handle_compile_result ( result : & CompileResult , args : & args:: AllArgs ) {
46+ log:: debug!( "found entry points: {:#?}" , result. entry_points) ;
47+
48+ let dir = & args. build . output_dir ;
49+ let mut shaders = vec ! [ ] ;
50+ match & result. module {
51+ ModuleResult :: MultiModule ( modules) => {
52+ assert ! ( !modules. is_empty( ) , "No shader modules to compile" ) ;
53+ for ( entry, filepath) in modules. clone ( ) . into_iter ( ) {
54+ log:: debug!( "compiled {entry} {}" , filepath. display( ) ) ;
55+ shaders. push ( ShaderModule :: new ( entry, filepath) ) ;
56+ }
57+ }
58+ ModuleResult :: SingleModule ( filepath) => {
59+ for entry in result. entry_points . clone ( ) {
60+ shaders. push ( ShaderModule :: new ( entry, filepath. clone ( ) ) ) ;
61+ }
62+ }
63+ }
64+
65+ use std:: io:: Write ;
66+ let mut file = std:: fs:: File :: create ( dir. join ( "spirv-manifest.json" ) ) . unwrap ( ) ;
67+ file. write_all ( & serde_json:: to_vec ( & shaders) . unwrap ( ) )
68+ . unwrap ( ) ;
69+ }
70+
4571pub fn main ( ) {
4672 env_logger:: builder ( ) . init ( ) ;
4773
@@ -54,84 +80,67 @@ pub fn main() {
5480 ) ;
5581 log:: debug!( "with args: {args:#?}" ) ;
5682 let args: args:: AllArgs = serde_json:: from_str ( & args[ 1 ] ) . unwrap ( ) ;
83+ let args_for_result = args. clone ( ) ;
5784
5885 let spirv_metadata = match args. build . spirv_metadata {
5986 args:: SpirvMetadata :: None => spirv_builder:: SpirvMetadata :: None ,
6087 args:: SpirvMetadata :: NameVariables => spirv_builder:: SpirvMetadata :: NameVariables ,
6188 args:: SpirvMetadata :: Full => spirv_builder:: SpirvMetadata :: Full ,
6289 } ;
6390
64- let CompileResult {
65- entry_points,
66- module,
67- } = {
68- let mut builder = SpirvBuilder :: new ( args. install . shader_crate , & args. build . target )
69- . deny_warnings ( args. build . deny_warnings )
70- . release ( !args. build . debug )
71- . multimodule ( args. build . multimodule )
72- . spirv_metadata ( spirv_metadata)
73- . relax_struct_store ( args. build . relax_struct_store )
74- . relax_logical_pointer ( args. build . relax_logical_pointer )
75- . relax_block_layout ( args. build . relax_block_layout )
76- . uniform_buffer_standard_layout ( args. build . uniform_buffer_standard_layout )
77- . scalar_block_layout ( args. build . scalar_block_layout )
78- . skip_block_layout ( args. build . skip_block_layout )
79- . preserve_bindings ( args. build . preserve_bindings )
80- . print_metadata ( spirv_builder:: MetadataPrintout :: None ) ;
81-
82- for capability in & args. build . capability {
83- builder = builder. capability ( * capability) ;
84- }
85-
86- for extension in & args. build . extension {
87- builder = builder. extension ( extension) ;
88- }
89-
90- #[ cfg( feature = "spirv-builder-pre-cli" ) ]
91- {
92- set_codegen_spirv_location ( args. install . dylib_path ) ;
93- }
91+ let mut builder = SpirvBuilder :: new ( args. install . shader_crate , & args. build . target )
92+ . deny_warnings ( args. build . deny_warnings )
93+ . release ( !args. build . debug )
94+ . multimodule ( args. build . multimodule )
95+ . spirv_metadata ( spirv_metadata)
96+ . relax_struct_store ( args. build . relax_struct_store )
97+ . relax_logical_pointer ( args. build . relax_logical_pointer )
98+ . relax_block_layout ( args. build . relax_block_layout )
99+ . uniform_buffer_standard_layout ( args. build . uniform_buffer_standard_layout )
100+ . scalar_block_layout ( args. build . scalar_block_layout )
101+ . skip_block_layout ( args. build . skip_block_layout )
102+ . preserve_bindings ( args. build . preserve_bindings )
103+ . print_metadata ( spirv_builder:: MetadataPrintout :: None ) ;
104+
105+ for capability in & args. build . capability {
106+ builder = builder. capability ( * capability) ;
107+ }
94108
95- #[ cfg( feature = "spirv-builder-0_10" ) ]
96- {
97- builder = builder
98- . rustc_codegen_spirv_location ( args. install . dylib_path )
99- . target_spec ( args. build . shader_target ) ;
109+ for extension in & args. build . extension {
110+ builder = builder. extension ( extension) ;
111+ }
100112
101- if args. build . no_default_features {
102- log:: info!( "setting cargo --no-default-features" ) ;
103- builder = builder. shader_crate_default_features ( false ) ;
104- }
105- if !args. build . features . is_empty ( ) {
106- log:: info!( "setting --features {:?}" , args. build. features) ;
107- builder = builder. shader_crate_features ( args. build . features ) ;
108- }
109- }
113+ #[ cfg( feature = "spirv-builder-pre-cli" ) ]
114+ {
115+ set_codegen_spirv_location ( args. install . dylib_path ) ;
116+ }
110117
111- log:: debug!( "Calling `rust-gpu`'s `spirv-builder` library" ) ;
112- builder. build ( ) . unwrap ( )
113- } ;
114- log:: debug!( "found entry points: {entry_points:#?}" ) ;
118+ #[ cfg( feature = "spirv-builder-0_10" ) ]
119+ {
120+ builder = builder
121+ . rustc_codegen_spirv_location ( args. install . dylib_path )
122+ . target_spec ( args. build . shader_target ) ;
115123
116- let dir = args. build . output_dir ;
117- let mut shaders = vec ! [ ] ;
118- match module {
119- ModuleResult :: MultiModule ( modules) => {
120- assert ! ( !modules. is_empty( ) , "No shader modules to compile" ) ;
121- for ( entry, filepath) in modules. into_iter ( ) {
122- log:: debug!( "compiled {entry} {}" , filepath. display( ) ) ;
123- shaders. push ( ShaderModule :: new ( entry, filepath) ) ;
124- }
124+ if args. build . no_default_features {
125+ log:: info!( "setting cargo --no-default-features" ) ;
126+ builder = builder. shader_crate_default_features ( false ) ;
125127 }
126- ModuleResult :: SingleModule ( filepath) => {
127- for entry in entry_points {
128- shaders. push ( ShaderModule :: new ( entry, filepath. clone ( ) ) ) ;
129- }
128+ if !args. build . features . is_empty ( ) {
129+ log:: info!( "setting --features {:?}" , args. build. features) ;
130+ builder = builder. shader_crate_features ( args. build . features ) ;
130131 }
131132 }
132133
133- use std:: io:: Write ;
134- let mut file = std:: fs:: File :: create ( dir. join ( "spirv-manifest.json" ) ) . unwrap ( ) ;
135- file. write_all ( & serde_json:: to_vec ( & shaders) . unwrap ( ) )
136- . unwrap ( ) ;
134+ log:: debug!( "Calling `rust-gpu`'s `spirv-builder` library" ) ;
135+
136+ if args. build . watch {
137+ println ! ( "🦀 Watching and recompiling shader on changes..." ) ;
138+ builder. watch ( move |compile_result| {
139+ handle_compile_result ( & compile_result, & args_for_result) ;
140+ } ) ;
141+ std:: thread:: park ( ) ;
142+ } else {
143+ let result = builder. build ( ) . unwrap ( ) ;
144+ handle_compile_result ( & result, & args_for_result) ;
145+ }
137146}
0 commit comments