Skip to content

Commit 0e8b42f

Browse files
committed
cli: add options to handle new shader features
1 parent 104234a commit 0e8b42f

File tree

4 files changed

+165
-27
lines changed

4 files changed

+165
-27
lines changed

CLI.md

+38
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,15 @@ Options:
8989
The current sub frame. Default is 1
9090
9191
[default: 1]
92+
93+
--aspect-ratio <ASPECT_RATIO>
94+
The aspect ratio of the source. The default is 0, which will infer the ratio from the input
95+
96+
--frames-per-second <FRAMES_PER_SECOND>
97+
Frames per second of the source. The default is 1
98+
99+
--frametime-delta <FRAMETIME_DELTA>
100+
The time between the previous and current frame. The default is 0
92101
93102
-o, --out <OUT>
94103
The path to the output image
@@ -178,6 +187,15 @@ Options:
178187
The current sub frame. Default is 1
179188
180189
[default: 1]
190+
191+
--aspect-ratio <ASPECT_RATIO>
192+
The aspect ratio of the source. The default is 0, which will infer the ratio from the input
193+
194+
--frames-per-second <FRAMES_PER_SECOND>
195+
Frames per second of the source. The default is 1
196+
197+
--frametime-delta <FRAMETIME_DELTA>
198+
The time between the previous and current frame. The default is 0
181199
182200
-l, --left <LEFT>
183201
The runtime to compare against
@@ -622,7 +640,12 @@ Options:
622640
`json` will print a JSON representation of the preprocessed shader.
623641
624642
[possible values: fragment, vertex, params, passformat, json]
643+
644+
-d, --features <FEATURES>
645+
Enable `_HAS_ORIGINALASPECT_UNIFORMS` define
625646
647+
[possible values: originalaspect-uniforms, frametime-uniforms]
648+
626649
-h, --help
627650
Print help (see a summary with '-h')
628651
```
@@ -687,6 +710,11 @@ Options:
687710
688711
For MSL, this is the shader language version as an integer in format <MMmmpp>(30100), or a version in the format MAJ_MIN (3_1), or MAJ.MIN (3.1).
689712
713+
-d, --features <FEATURES>
714+
Enable the defines for certain shader features.
715+
716+
[possible values: originalaspect-uniforms, frametime-uniforms]
717+
690718
-h, --help
691719
Print help (see a summary with '-h')
692720
```
@@ -723,7 +751,12 @@ Options:
723751
-b, --backend <BACKEND>
724752
[default: cross]
725753
[possible values: cross, naga]
754+
755+
-d, --features <FEATURES>
756+
Enable the defines for certain shader features.
726757
758+
[possible values: originalaspect-uniforms, frametime-uniforms]
759+
727760
-h, --help
728761
Print help (see a summary with '-h')
729762
```
@@ -993,6 +1026,11 @@ Options:
9931026
9941027
[possible values: json, msgpack]
9951028
1029+
-d, --features <FEATURES>
1030+
Enable the defines for certain shader features.
1031+
1032+
[possible values: originalaspect-uniforms, frametime-uniforms]
1033+
9961034
-h, --help
9971035
Print help (see a summary with '-h')
9981036

librashader-cli/src/cli/main.rs

+118-20
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ struct PresetArgs {
3636
wildcards: Option<Vec<String>>,
3737
}
3838

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+
3951
#[derive(clap::Args, Debug)]
4052
struct RenderArgs {
4153
/// The frame to render.
@@ -73,10 +85,27 @@ impl From<FrameOptionsArgs> for CommonFrameOptions {
7385
rotation: value.rotation,
7486
total_subframes: value.total_subframes,
7587
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+
}
79106
}
107+
108+
features
80109
}
81110
}
82111

@@ -95,6 +124,15 @@ struct FrameOptionsArgs {
95124
/// The current sub frame. Default is 1.
96125
#[arg(long, default_value_t = 1)]
97126
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>,
98136
}
99137

100138
#[derive(Subcommand, Debug)]
@@ -137,11 +175,15 @@ enum Commands {
137175
Parse {
138176
#[clap(flatten)]
139177
preset: PresetArgs,
178+
#[clap(flatten)]
179+
flags: ShaderFeatureArgs,
140180
},
141181
/// Create a serialized preset pack from a shader preset.
142182
Pack {
143183
#[clap(flatten)]
144184
preset: PresetArgs,
185+
#[clap(flatten)]
186+
flags: ShaderFeatureArgs,
145187
/// The path to write the output
146188
///
147189
/// If `-`, writes the output to stdout
@@ -161,6 +203,8 @@ enum Commands {
161203
/// `json` will print a JSON representation of the preprocessed shader.
162204
#[arg(value_enum, short, long)]
163205
output: PreprocessOutput,
206+
#[clap(flatten)]
207+
flags: ShaderFeatureArgs,
164208
},
165209
/// Transpile a shader to the given format.
166210
Transpile {
@@ -188,12 +232,17 @@ enum Commands {
188232
/// For SPIR-V, if this is the string "raw-id", then shows raw ID values instead of friendly names.
189233
#[arg(short, long)]
190234
version: Option<String>,
235+
#[clap(flatten)]
236+
flags: ShaderFeatureArgs,
191237
},
192238
/// Reflect the shader relative to a preset, giving information about semantics used in a slang shader.
193239
Reflect {
194240
#[clap(flatten)]
195241
preset: PresetArgs,
196242

243+
#[clap(flatten)]
244+
flags: ShaderFeatureArgs,
245+
197246
/// The pass index to use.
198247
#[arg(short, long)]
199248
index: usize,
@@ -275,6 +324,14 @@ enum Runtime {
275324
Metal,
276325
}
277326

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+
278335
#[derive(clap::ValueEnum, Clone, Debug)]
279336
enum ReflectionBackend {
280337
#[clap(name = "cross")]
@@ -333,7 +390,26 @@ pub fn main() -> Result<(), anyhow::Error> {
333390

334391
let test: &mut dyn RenderTest = get_runtime!(runtime, image);
335392
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)?;
337413
let params = parse_params(params)?;
338414

339415
let image = test.render_with_preset_and_params(
@@ -371,10 +447,28 @@ pub fn main() -> Result<(), anyhow::Error> {
371447
let left: &mut dyn RenderTest = get_runtime!(left, image);
372448
let right: &mut dyn RenderTest = get_runtime!(right, image);
373449

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+
374468
let dimensions = parse_dimension(dimensions, left.image_size())?;
375469
let params = parse_params(params)?;
376470

377-
let left_preset = get_shader_preset(preset.clone(), wildcards.clone())?;
471+
let left_preset = get_shader_preset(preset.clone(), wildcards.clone(), features)?;
378472
let left_image = left.render_with_preset_and_params(
379473
left_preset,
380474
frame,
@@ -383,7 +477,7 @@ pub fn main() -> Result<(), anyhow::Error> {
383477
None,
384478
)?;
385479

386-
let right_preset = get_shader_preset(preset.clone(), wildcards.clone())?;
480+
let right_preset = get_shader_preset(preset.clone(), wildcards.clone(), features)?;
387481
let right_image = right.render_with_preset_and_params(
388482
right_preset,
389483
frame,
@@ -405,18 +499,20 @@ pub fn main() -> Result<(), anyhow::Error> {
405499
}
406500
}
407501
}
408-
Commands::Parse { preset } => {
502+
Commands::Parse { preset, flags } => {
409503
let PresetArgs { preset, wildcards } = preset;
410504

411-
let preset = get_shader_preset(preset, wildcards)?;
505+
let preset = get_shader_preset(preset, wildcards, flags.into())?;
412506
let out = serde_json::to_string_pretty(&preset)?;
413507
print!("{out:}");
414508
}
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())?;
420516
match output {
421517
PreprocessOutput::Fragment => print!("{}", source.fragment),
422518
PreprocessOutput::Vertex => print!("{}", source.vertex),
@@ -432,11 +528,10 @@ pub fn main() -> Result<(), anyhow::Error> {
432528
stage,
433529
format,
434530
version,
531+
flags,
435532
} => {
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())?;
440535
let compilation = SpirvCompilation::try_from(&source)?;
441536
let output = match format {
442537
TranspileFormat::GLSL => {
@@ -527,12 +622,13 @@ pub fn main() -> Result<(), anyhow::Error> {
527622
}
528623
Commands::Reflect {
529624
preset,
625+
flags,
530626
index,
531627
backend,
532628
} => {
533629
let PresetArgs { preset, wildcards } = preset;
534630

535-
let preset = get_shader_preset(preset, wildcards)?;
631+
let preset = get_shader_preset(preset, wildcards, flags.into())?;
536632
let Some(shader) = preset.passes.get(index) else {
537633
return Err(anyhow!("Invalid pass index for the preset"));
538634
};
@@ -569,11 +665,12 @@ pub fn main() -> Result<(), anyhow::Error> {
569665
}
570666
Commands::Pack {
571667
preset,
668+
flags,
572669
out,
573670
format,
574671
} => {
575672
let PresetArgs { preset, wildcards } = preset;
576-
let preset = get_shader_preset(preset, wildcards)?;
673+
let preset = get_shader_preset(preset, wildcards, flags.into())?;
577674
let preset = ShaderPresetPack::load_from_preset::<anyhow::Error>(preset)?;
578675
let output_bytes = match format {
579676
PackFormat::JSON => serde_json::to_vec_pretty(&preset)?,
@@ -601,6 +698,7 @@ struct TranspileOutput {
601698
fn get_shader_preset(
602699
preset: PathBuf,
603700
wildcards: Option<Vec<String>>,
701+
flags: ShaderFeatures,
604702
) -> anyhow::Result<ShaderPreset> {
605703
let mut context = WildcardContext::new();
606704
context.add_path_defaults(preset.as_path());
@@ -616,7 +714,7 @@ fn get_shader_preset(
616714
))
617715
}
618716
}
619-
let preset = ShaderPreset::try_parse_with_context(preset, ShaderFeatures::NONE, context)?;
717+
let preset = ShaderPreset::try_parse_with_context(preset, flags, context)?;
620718
Ok(preset)
621719
}
622720

0 commit comments

Comments
 (0)