@@ -36,6 +36,18 @@ struct PresetArgs {
36
36
wildcards : Option < Vec < String > > ,
37
37
}
38
38
39
+ #[ derive( clap:: Args , Debug ) ]
40
+ struct ShaderFeatureArgs {
41
+ /// Enable the defines for certain shader features.
42
+ ///
43
+ /// `originalaspect-uniforms` defines `_HAS_ORIGINALASPECT_UNIFORMS`.
44
+ /// `frametime-uniforms` defines `_HAS_FRAMETIME_UNIFORMS`.
45
+ ///
46
+ /// Note that defines will disappear in the final output, and are only passed for reflection.
47
+ #[ arg( long, short='d' ) ]
48
+ features : Vec < ShaderDefinesEnums > ,
49
+ }
50
+
39
51
#[ derive( clap:: Args , Debug ) ]
40
52
struct RenderArgs {
41
53
/// The frame to render.
@@ -73,10 +85,27 @@ impl From<FrameOptionsArgs> for CommonFrameOptions {
73
85
rotation : value. rotation ,
74
86
total_subframes : value. total_subframes ,
75
87
current_subframe : value. current_subframe ,
76
- aspect_ratio : f32:: MAX ,
77
- frametime_delta : 0 ,
78
- frames_per_second : 1.0 ,
88
+ aspect_ratio : value. aspect_ratio . unwrap_or ( 0.0 ) ,
89
+ frametime_delta : value. frametime_delta . unwrap_or ( 0 ) ,
90
+ frames_per_second : value. frames_per_second . unwrap_or ( 1.0 ) ,
91
+ }
92
+ }
93
+ }
94
+
95
+ impl From < ShaderFeatureArgs > for ShaderFeatures {
96
+ fn from ( value : ShaderFeatureArgs ) -> Self {
97
+ let mut features = ShaderFeatures :: NONE ;
98
+
99
+ for feature in value. features {
100
+ if matches ! ( feature, ShaderDefinesEnums :: FrametimeUniforms ) {
101
+ features |= ShaderFeatures :: FRAMETIME_UNIFORMS ;
102
+ }
103
+ if matches ! ( feature, ShaderDefinesEnums :: OriginalAspectUniforms ) {
104
+ features |= ShaderFeatures :: ORIGINAL_ASPECT_UNIFORMS ;
105
+ }
79
106
}
107
+
108
+ features
80
109
}
81
110
}
82
111
@@ -95,6 +124,15 @@ struct FrameOptionsArgs {
95
124
/// The current sub frame. Default is 1.
96
125
#[ arg( long, default_value_t = 1 ) ]
97
126
pub current_subframe : u32 ,
127
+ /// The aspect ratio of the source. The default is 0, which will infer the ratio from the input.
128
+ #[ arg( long) ]
129
+ pub aspect_ratio : Option < f32 > ,
130
+ /// Frames per second of the source. The default is 1.
131
+ #[ arg( long) ]
132
+ pub frames_per_second : Option < f32 > ,
133
+ /// The time between the previous and current frame. The default is 0.
134
+ #[ arg( long) ]
135
+ pub frametime_delta : Option < u32 > ,
98
136
}
99
137
100
138
#[ derive( Subcommand , Debug ) ]
@@ -137,11 +175,15 @@ enum Commands {
137
175
Parse {
138
176
#[ clap( flatten) ]
139
177
preset : PresetArgs ,
178
+ #[ clap( flatten) ]
179
+ flags : ShaderFeatureArgs ,
140
180
} ,
141
181
/// Create a serialized preset pack from a shader preset.
142
182
Pack {
143
183
#[ clap( flatten) ]
144
184
preset : PresetArgs ,
185
+ #[ clap( flatten) ]
186
+ flags : ShaderFeatureArgs ,
145
187
/// The path to write the output
146
188
///
147
189
/// If `-`, writes the output to stdout
@@ -161,6 +203,8 @@ enum Commands {
161
203
/// `json` will print a JSON representation of the preprocessed shader.
162
204
#[ arg( value_enum, short, long) ]
163
205
output : PreprocessOutput ,
206
+ #[ clap( flatten) ]
207
+ flags : ShaderFeatureArgs ,
164
208
} ,
165
209
/// Transpile a shader to the given format.
166
210
Transpile {
@@ -188,12 +232,17 @@ enum Commands {
188
232
/// For SPIR-V, if this is the string "raw-id", then shows raw ID values instead of friendly names.
189
233
#[ arg( short, long) ]
190
234
version : Option < String > ,
235
+ #[ clap( flatten) ]
236
+ flags : ShaderFeatureArgs ,
191
237
} ,
192
238
/// Reflect the shader relative to a preset, giving information about semantics used in a slang shader.
193
239
Reflect {
194
240
#[ clap( flatten) ]
195
241
preset : PresetArgs ,
196
242
243
+ #[ clap( flatten) ]
244
+ flags : ShaderFeatureArgs ,
245
+
197
246
/// The pass index to use.
198
247
#[ arg( short, long) ]
199
248
index : usize ,
@@ -275,6 +324,14 @@ enum Runtime {
275
324
Metal ,
276
325
}
277
326
327
+ #[ derive( clap:: ValueEnum , Clone , Debug ) ]
328
+ enum ShaderDefinesEnums {
329
+ #[ clap( name = "originalaspect-uniforms" ) ]
330
+ OriginalAspectUniforms ,
331
+ #[ clap( name = "frametime-uniforms" ) ]
332
+ FrametimeUniforms ,
333
+ }
334
+
278
335
#[ derive( clap:: ValueEnum , Clone , Debug ) ]
279
336
enum ReflectionBackend {
280
337
#[ clap( name = "cross" ) ]
@@ -333,7 +390,26 @@ pub fn main() -> Result<(), anyhow::Error> {
333
390
334
391
let test: & mut dyn RenderTest = get_runtime ! ( runtime, image) ;
335
392
let dimensions = parse_dimension ( dimensions, test. image_size ( ) ) ?;
336
- let preset = get_shader_preset ( preset, wildcards) ?;
393
+
394
+ let mut features = ShaderFeatures :: NONE ;
395
+ if options
396
+ . as_ref ( )
397
+ . is_some_and ( |args| args. aspect_ratio . is_some ( ) )
398
+ {
399
+ features |= ShaderFeatures :: ORIGINAL_ASPECT_UNIFORMS ;
400
+ }
401
+
402
+ if options
403
+ . as_ref ( )
404
+ . is_some_and ( |args| args. frames_per_second . is_some ( ) )
405
+ || options
406
+ . as_ref ( )
407
+ . is_some_and ( |args| args. frametime_delta . is_some ( ) )
408
+ {
409
+ features |= ShaderFeatures :: FRAMETIME_UNIFORMS ;
410
+ }
411
+
412
+ let preset = get_shader_preset ( preset, wildcards, features) ?;
337
413
let params = parse_params ( params) ?;
338
414
339
415
let image = test. render_with_preset_and_params (
@@ -371,10 +447,28 @@ pub fn main() -> Result<(), anyhow::Error> {
371
447
let left: & mut dyn RenderTest = get_runtime ! ( left, image) ;
372
448
let right: & mut dyn RenderTest = get_runtime ! ( right, image) ;
373
449
450
+ let mut features = ShaderFeatures :: NONE ;
451
+ if options
452
+ . as_ref ( )
453
+ . is_some_and ( |args| args. aspect_ratio . is_some ( ) )
454
+ {
455
+ features |= ShaderFeatures :: ORIGINAL_ASPECT_UNIFORMS ;
456
+ }
457
+
458
+ if options
459
+ . as_ref ( )
460
+ . is_some_and ( |args| args. frames_per_second . is_some ( ) )
461
+ || options
462
+ . as_ref ( )
463
+ . is_some_and ( |args| args. frametime_delta . is_some ( ) )
464
+ {
465
+ features |= ShaderFeatures :: FRAMETIME_UNIFORMS ;
466
+ }
467
+
374
468
let dimensions = parse_dimension ( dimensions, left. image_size ( ) ) ?;
375
469
let params = parse_params ( params) ?;
376
470
377
- let left_preset = get_shader_preset ( preset. clone ( ) , wildcards. clone ( ) ) ?;
471
+ let left_preset = get_shader_preset ( preset. clone ( ) , wildcards. clone ( ) , features ) ?;
378
472
let left_image = left. render_with_preset_and_params (
379
473
left_preset,
380
474
frame,
@@ -383,7 +477,7 @@ pub fn main() -> Result<(), anyhow::Error> {
383
477
None ,
384
478
) ?;
385
479
386
- let right_preset = get_shader_preset ( preset. clone ( ) , wildcards. clone ( ) ) ?;
480
+ let right_preset = get_shader_preset ( preset. clone ( ) , wildcards. clone ( ) , features ) ?;
387
481
let right_image = right. render_with_preset_and_params (
388
482
right_preset,
389
483
frame,
@@ -405,18 +499,20 @@ pub fn main() -> Result<(), anyhow::Error> {
405
499
}
406
500
}
407
501
}
408
- Commands :: Parse { preset } => {
502
+ Commands :: Parse { preset, flags } => {
409
503
let PresetArgs { preset, wildcards } = preset;
410
504
411
- let preset = get_shader_preset ( preset, wildcards) ?;
505
+ let preset = get_shader_preset ( preset, wildcards, flags . into ( ) ) ?;
412
506
let out = serde_json:: to_string_pretty ( & preset) ?;
413
507
print ! ( "{out:}" ) ;
414
508
}
415
- Commands :: Preprocess { shader, output } => {
416
- let source = librashader:: preprocess:: ShaderSource :: load (
417
- shader. as_path ( ) ,
418
- ShaderFeatures :: NONE ,
419
- ) ?;
509
+ Commands :: Preprocess {
510
+ shader,
511
+ output,
512
+ flags,
513
+ } => {
514
+ let source =
515
+ librashader:: preprocess:: ShaderSource :: load ( shader. as_path ( ) , flags. into ( ) ) ?;
420
516
match output {
421
517
PreprocessOutput :: Fragment => print ! ( "{}" , source. fragment) ,
422
518
PreprocessOutput :: Vertex => print ! ( "{}" , source. vertex) ,
@@ -432,11 +528,10 @@ pub fn main() -> Result<(), anyhow::Error> {
432
528
stage,
433
529
format,
434
530
version,
531
+ flags,
435
532
} => {
436
- let source = librashader:: preprocess:: ShaderSource :: load (
437
- shader. as_path ( ) ,
438
- ShaderFeatures :: NONE ,
439
- ) ?;
533
+ let source =
534
+ librashader:: preprocess:: ShaderSource :: load ( shader. as_path ( ) , flags. into ( ) ) ?;
440
535
let compilation = SpirvCompilation :: try_from ( & source) ?;
441
536
let output = match format {
442
537
TranspileFormat :: GLSL => {
@@ -527,12 +622,13 @@ pub fn main() -> Result<(), anyhow::Error> {
527
622
}
528
623
Commands :: Reflect {
529
624
preset,
625
+ flags,
530
626
index,
531
627
backend,
532
628
} => {
533
629
let PresetArgs { preset, wildcards } = preset;
534
630
535
- let preset = get_shader_preset ( preset, wildcards) ?;
631
+ let preset = get_shader_preset ( preset, wildcards, flags . into ( ) ) ?;
536
632
let Some ( shader) = preset. passes . get ( index) else {
537
633
return Err ( anyhow ! ( "Invalid pass index for the preset" ) ) ;
538
634
} ;
@@ -569,11 +665,12 @@ pub fn main() -> Result<(), anyhow::Error> {
569
665
}
570
666
Commands :: Pack {
571
667
preset,
668
+ flags,
572
669
out,
573
670
format,
574
671
} => {
575
672
let PresetArgs { preset, wildcards } = preset;
576
- let preset = get_shader_preset ( preset, wildcards) ?;
673
+ let preset = get_shader_preset ( preset, wildcards, flags . into ( ) ) ?;
577
674
let preset = ShaderPresetPack :: load_from_preset :: < anyhow:: Error > ( preset) ?;
578
675
let output_bytes = match format {
579
676
PackFormat :: JSON => serde_json:: to_vec_pretty ( & preset) ?,
@@ -601,6 +698,7 @@ struct TranspileOutput {
601
698
fn get_shader_preset (
602
699
preset : PathBuf ,
603
700
wildcards : Option < Vec < String > > ,
701
+ flags : ShaderFeatures ,
604
702
) -> anyhow:: Result < ShaderPreset > {
605
703
let mut context = WildcardContext :: new ( ) ;
606
704
context. add_path_defaults ( preset. as_path ( ) ) ;
@@ -616,7 +714,7 @@ fn get_shader_preset(
616
714
) )
617
715
}
618
716
}
619
- let preset = ShaderPreset :: try_parse_with_context ( preset, ShaderFeatures :: NONE , context) ?;
717
+ let preset = ShaderPreset :: try_parse_with_context ( preset, flags , context) ?;
620
718
Ok ( preset)
621
719
}
622
720
0 commit comments