@@ -42,6 +42,32 @@ fn set_codegen_spirv_location(dylib_path: std::path::PathBuf) {
42
42
std:: env:: set_var ( env_var, path) ;
43
43
}
44
44
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
+
45
71
pub fn main ( ) {
46
72
env_logger:: builder ( ) . init ( ) ;
47
73
@@ -54,84 +80,67 @@ pub fn main() {
54
80
) ;
55
81
log:: debug!( "with args: {args:#?}" ) ;
56
82
let args: args:: AllArgs = serde_json:: from_str ( & args[ 1 ] ) . unwrap ( ) ;
83
+ let args_for_result = args. clone ( ) ;
57
84
58
85
let spirv_metadata = match args. build . spirv_metadata {
59
86
args:: SpirvMetadata :: None => spirv_builder:: SpirvMetadata :: None ,
60
87
args:: SpirvMetadata :: NameVariables => spirv_builder:: SpirvMetadata :: NameVariables ,
61
88
args:: SpirvMetadata :: Full => spirv_builder:: SpirvMetadata :: Full ,
62
89
} ;
63
90
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
+ }
94
108
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
+ }
100
112
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
+ }
110
117
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 ) ;
115
123
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 ) ;
125
127
}
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 ) ;
130
131
}
131
132
}
132
133
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
+ }
137
146
}
0 commit comments