cli: add pack
command to create a preset pack
This commit is contained in:
parent
828464c351
commit
75b70cc0e6
63
CLI.md
63
CLI.md
|
@ -233,7 +233,7 @@ will output the following JSON
|
||||||
"shaders": [
|
"shaders": [
|
||||||
{
|
{
|
||||||
"id": 0,
|
"id": 0,
|
||||||
"name": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-first-pass-linearize-crt-gamma-bob-fields.slang",
|
"path": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-first-pass-linearize-crt-gamma-bob-fields.slang",
|
||||||
"alias": "ORIG_LINEARIZED",
|
"alias": "ORIG_LINEARIZED",
|
||||||
"filter": "Nearest",
|
"filter": "Nearest",
|
||||||
"wrap_mode": "ClampToBorder",
|
"wrap_mode": "ClampToBorder",
|
||||||
|
@ -259,7 +259,7 @@ will output the following JSON
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"name": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-scanlines-vertical-interlacing.slang",
|
"path": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-scanlines-vertical-interlacing.slang",
|
||||||
"alias": "VERTICAL_SCANLINES",
|
"alias": "VERTICAL_SCANLINES",
|
||||||
"filter": "Linear",
|
"filter": "Linear",
|
||||||
"wrap_mode": "ClampToBorder",
|
"wrap_mode": "ClampToBorder",
|
||||||
|
@ -285,7 +285,7 @@ will output the following JSON
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"name": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-bloom-approx.slang",
|
"path": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-bloom-approx.slang",
|
||||||
"alias": "BLOOM_APPROX",
|
"alias": "BLOOM_APPROX",
|
||||||
"filter": "Linear",
|
"filter": "Linear",
|
||||||
"wrap_mode": "ClampToBorder",
|
"wrap_mode": "ClampToBorder",
|
||||||
|
@ -311,7 +311,7 @@ will output the following JSON
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
"name": "/tmp/shaders_slang/blurs/shaders/royale/blur9fast-vertical.slang",
|
"path": "/tmp/shaders_slang/blurs/shaders/royale/blur9fast-vertical.slang",
|
||||||
"alias": null,
|
"alias": null,
|
||||||
"filter": "Linear",
|
"filter": "Linear",
|
||||||
"wrap_mode": "ClampToBorder",
|
"wrap_mode": "ClampToBorder",
|
||||||
|
@ -337,7 +337,7 @@ will output the following JSON
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 4,
|
"id": 4,
|
||||||
"name": "/tmp/shaders_slang/blurs/shaders/royale/blur9fast-horizontal.slang",
|
"path": "/tmp/shaders_slang/blurs/shaders/royale/blur9fast-horizontal.slang",
|
||||||
"alias": "HALATION_BLUR",
|
"alias": "HALATION_BLUR",
|
||||||
"filter": "Linear",
|
"filter": "Linear",
|
||||||
"wrap_mode": "ClampToBorder",
|
"wrap_mode": "ClampToBorder",
|
||||||
|
@ -363,7 +363,7 @@ will output the following JSON
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 5,
|
"id": 5,
|
||||||
"name": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-mask-resize-vertical.slang",
|
"path": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-mask-resize-vertical.slang",
|
||||||
"alias": null,
|
"alias": null,
|
||||||
"filter": "Linear",
|
"filter": "Linear",
|
||||||
"wrap_mode": "ClampToBorder",
|
"wrap_mode": "ClampToBorder",
|
||||||
|
@ -389,7 +389,7 @@ will output the following JSON
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 6,
|
"id": 6,
|
||||||
"name": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-mask-resize-horizontal.slang",
|
"path": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-mask-resize-horizontal.slang",
|
||||||
"alias": "MASK_RESIZE",
|
"alias": "MASK_RESIZE",
|
||||||
"filter": "Nearest",
|
"filter": "Nearest",
|
||||||
"wrap_mode": "ClampToBorder",
|
"wrap_mode": "ClampToBorder",
|
||||||
|
@ -415,7 +415,7 @@ will output the following JSON
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 7,
|
"id": 7,
|
||||||
"name": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-scanlines-horizontal-apply-mask.slang",
|
"path": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-scanlines-horizontal-apply-mask.slang",
|
||||||
"alias": "MASKED_SCANLINES",
|
"alias": "MASKED_SCANLINES",
|
||||||
"filter": "Linear",
|
"filter": "Linear",
|
||||||
"wrap_mode": "ClampToBorder",
|
"wrap_mode": "ClampToBorder",
|
||||||
|
@ -441,7 +441,7 @@ will output the following JSON
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 8,
|
"id": 8,
|
||||||
"name": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-brightpass.slang",
|
"path": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-brightpass.slang",
|
||||||
"alias": "BRIGHTPASS",
|
"alias": "BRIGHTPASS",
|
||||||
"filter": "Linear",
|
"filter": "Linear",
|
||||||
"wrap_mode": "ClampToBorder",
|
"wrap_mode": "ClampToBorder",
|
||||||
|
@ -467,7 +467,7 @@ will output the following JSON
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 9,
|
"id": 9,
|
||||||
"name": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-bloom-vertical.slang",
|
"path": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-bloom-vertical.slang",
|
||||||
"alias": null,
|
"alias": null,
|
||||||
"filter": "Linear",
|
"filter": "Linear",
|
||||||
"wrap_mode": "ClampToBorder",
|
"wrap_mode": "ClampToBorder",
|
||||||
|
@ -493,7 +493,7 @@ will output the following JSON
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 10,
|
"id": 10,
|
||||||
"name": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-bloom-horizontal-reconstitute.slang",
|
"path": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-bloom-horizontal-reconstitute.slang",
|
||||||
"alias": null,
|
"alias": null,
|
||||||
"filter": "Linear",
|
"filter": "Linear",
|
||||||
"wrap_mode": "ClampToBorder",
|
"wrap_mode": "ClampToBorder",
|
||||||
|
@ -519,7 +519,7 @@ will output the following JSON
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 11,
|
"id": 11,
|
||||||
"name": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-geometry-aa-last-pass.slang",
|
"path": "/tmp/shaders_slang/crt/shaders/crt-royale/src/crt-royale-geometry-aa-last-pass.slang",
|
||||||
"alias": null,
|
"alias": null,
|
||||||
"filter": "Linear",
|
"filter": "Linear",
|
||||||
"wrap_mode": "ClampToEdge",
|
"wrap_mode": "ClampToEdge",
|
||||||
|
@ -955,3 +955,42 @@ The above command will output the following JSON
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## Serializing a preset pack to a single file
|
||||||
|
|
||||||
|
```
|
||||||
|
Create a serialized preset pack from a shader preset
|
||||||
|
|
||||||
|
Usage: librashader-cli pack [OPTIONS] --preset <PRESET> --out <OUT> --format <FORMAT>
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-p, --preset <PRESET>
|
||||||
|
The path to the shader preset to load
|
||||||
|
|
||||||
|
-w, --wildcards <WILDCARDS>...
|
||||||
|
Additional wildcard options, comma separated with equals signs. The PRESET and PRESET_DIR wildcards are always added to the preset parsing context.
|
||||||
|
|
||||||
|
For example, CONTENT-DIR=MyVerticalGames,GAME=mspacman
|
||||||
|
|
||||||
|
-o, --out <OUT>
|
||||||
|
The path to write the output
|
||||||
|
|
||||||
|
If `-`, writes the output to stdout
|
||||||
|
|
||||||
|
-f, --format <FORMAT>
|
||||||
|
The file format to output
|
||||||
|
|
||||||
|
[possible values: json, msgpack]
|
||||||
|
|
||||||
|
-h, --help
|
||||||
|
Print help (see a summary with '-h')
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
The `pack` command can be used to create a "preset pack", a format to store an entire shader preset, including files and preprocessed source code,
|
||||||
|
into a JSON or MessagePack representation where it can be loaded into memory without filesystem access.
|
||||||
|
|
||||||
|
This file format is experimental, and may be used in the future as a way to cache shader presets, or for usages in environments without a filesystem,
|
||||||
|
such as on the web. Note that packs are only supported by the librashader Rust API, and are not portable across other implementations of "slang" shaders.
|
||||||
|
|
||||||
|
It is unlikely that the librashader C API will ever support loading shader packs.
|
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1606,6 +1606,7 @@ dependencies = [
|
||||||
"objc2-metal",
|
"objc2-metal",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"pollster",
|
"pollster",
|
||||||
|
"rmp-serde",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"spq-spvasm",
|
"spq-spvasm",
|
||||||
|
|
|
@ -35,6 +35,8 @@ serde = "1.0"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
spq-spvasm = "0.1.4"
|
spq-spvasm = "0.1.4"
|
||||||
|
|
||||||
|
rmp-serde = "1.3.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["full"]
|
default = ["full"]
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ use anyhow::anyhow;
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
use image::codecs::png::PngEncoder;
|
use image::codecs::png::PngEncoder;
|
||||||
use librashader::presets::context::ContextItem;
|
use librashader::presets::context::ContextItem;
|
||||||
use librashader::presets::{ShaderPreset, WildcardContext};
|
use librashader::presets::{ShaderPreset, ShaderPresetPack, WildcardContext};
|
||||||
use librashader::reflect::cross::{GlslVersion, HlslShaderModel, MslVersion, SpirvCross};
|
use librashader::reflect::cross::{GlslVersion, HlslShaderModel, MslVersion, SpirvCross};
|
||||||
use librashader::reflect::naga::{Naga, NagaLoweringOptions};
|
use librashader::reflect::naga::{Naga, NagaLoweringOptions};
|
||||||
use librashader::reflect::semantics::ShaderSemantics;
|
use librashader::reflect::semantics::ShaderSemantics;
|
||||||
|
@ -10,6 +10,8 @@ use librashader::reflect::{CompileShader, FromCompilation, ReflectShader, SpirvC
|
||||||
use librashader::{FastHashMap, ShortString};
|
use librashader::{FastHashMap, ShortString};
|
||||||
use librashader_runtime::parameters::RuntimeParameters;
|
use librashader_runtime::parameters::RuntimeParameters;
|
||||||
use librashader_test::render::{CommonFrameOptions, RenderTest};
|
use librashader_test::render::{CommonFrameOptions, RenderTest};
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::Write;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
/// Helpers and utilities to reflect and debug 'slang' shaders and presets.
|
/// Helpers and utilities to reflect and debug 'slang' shaders and presets.
|
||||||
|
@ -126,6 +128,19 @@ enum Commands {
|
||||||
#[clap(flatten)]
|
#[clap(flatten)]
|
||||||
preset: PresetArgs,
|
preset: PresetArgs,
|
||||||
},
|
},
|
||||||
|
/// Create a serialized preset pack from a shader preset.
|
||||||
|
Pack {
|
||||||
|
#[clap(flatten)]
|
||||||
|
preset: PresetArgs,
|
||||||
|
/// The path to write the output
|
||||||
|
///
|
||||||
|
/// If `-`, writes the output to stdout
|
||||||
|
#[arg(short, long)]
|
||||||
|
out: PathBuf,
|
||||||
|
/// The file format to output.
|
||||||
|
#[arg(value_enum, short, long)]
|
||||||
|
format: PackFormat,
|
||||||
|
},
|
||||||
/// Get the raw GLSL output of a preprocessed shader.
|
/// Get the raw GLSL output of a preprocessed shader.
|
||||||
Preprocess {
|
Preprocess {
|
||||||
/// The path to the slang shader.
|
/// The path to the slang shader.
|
||||||
|
@ -213,6 +228,14 @@ enum TranspileFormat {
|
||||||
SPIRV,
|
SPIRV,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(clap::ValueEnum, Clone, Debug)]
|
||||||
|
enum PackFormat {
|
||||||
|
#[clap(name = "json")]
|
||||||
|
JSON,
|
||||||
|
#[clap(name = "msgpack")]
|
||||||
|
MsgPack,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(clap::ValueEnum, Clone, Debug)]
|
#[derive(clap::ValueEnum, Clone, Debug)]
|
||||||
enum Runtime {
|
enum Runtime {
|
||||||
#[cfg(feature = "opengl")]
|
#[cfg(feature = "opengl")]
|
||||||
|
@ -517,6 +540,27 @@ pub fn main() -> Result<(), anyhow::Error> {
|
||||||
|
|
||||||
print!("{}", serde_json::to_string_pretty(&reflection)?);
|
print!("{}", serde_json::to_string_pretty(&reflection)?);
|
||||||
}
|
}
|
||||||
|
Commands::Pack {
|
||||||
|
preset,
|
||||||
|
out,
|
||||||
|
format,
|
||||||
|
} => {
|
||||||
|
let PresetArgs { preset, wildcards } = preset;
|
||||||
|
let preset = get_shader_preset(preset, wildcards)?;
|
||||||
|
let preset = ShaderPresetPack::load_from_preset::<anyhow::Error>(preset)?;
|
||||||
|
let output_bytes = match format {
|
||||||
|
PackFormat::JSON => serde_json::to_vec_pretty(&preset)?,
|
||||||
|
PackFormat::MsgPack => rmp_serde::to_vec(&preset)?,
|
||||||
|
};
|
||||||
|
|
||||||
|
if out.as_path() == Path::new("-") {
|
||||||
|
let mut out = std::io::stdout();
|
||||||
|
out.write_all(output_bytes.as_slice())?;
|
||||||
|
} else {
|
||||||
|
let mut file = File::create(out.as_path())?;
|
||||||
|
file.write_all(output_bytes.as_slice())?;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
Loading…
Reference in a new issue