Skip to content

Commit

Permalink
Shader crate cargo features (#13)
Browse files Browse the repository at this point in the history
* feat: allow shader crate cargo features to be passed through spirv-builder

---------

Co-authored-by: Schell Carl Scivally <[email protected]>
Co-authored-by: Firestar99 <[email protected]>
  • Loading branch information
3 people authored Sep 22, 2024
1 parent de7ba8e commit 4c9718f
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Signed for loops like `for _ in 0..4i32 {}` no longer compile. We recommend switching to unsigned for loops and casting back to signed integers in the meanwhile.

### Changed 🛠
- [PR#13](https://github.com/Rust-GPU/rust-gpu/pull/13) allow cargo features to be passed to the shader crate
- [PR#12](https://github.com/rust-gpu/rust-gpu/pull/12) updated toolchain to `nightly-2024-04-24`
- [PR#9](https://github.com/Rust-GPU/rust-gpu/pull/9) relaxed `glam` version requirements (`>=0.22, <=0.29`)
- [PR#1127](https://github.com/EmbarkStudios/rust-gpu/pull/1127) updated `spirv-tools` to `0.10.0`, which follows `vulkan-sdk-1.3.275`
Expand Down
35 changes: 35 additions & 0 deletions crates/spirv-builder/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -282,11 +282,19 @@ pub enum ShaderPanicStrategy {
UNSOUND_DO_NOT_USE_UndefinedBehaviorViaUnreachable,
}

/// Cargo features specification for building the shader crate.
#[derive(Default)]
struct ShaderCrateFeatures {
default_features: Option<bool>,
features: Vec<String>,
}

pub struct SpirvBuilder {
path_to_crate: PathBuf,
print_metadata: MetadataPrintout,
release: bool,
target: String,
shader_crate_features: ShaderCrateFeatures,
deny_warnings: bool,
multimodule: bool,
spirv_metadata: SpirvMetadata,
Expand Down Expand Up @@ -333,6 +341,7 @@ impl SpirvBuilder {
skip_block_layout: false,

preserve_bindings: false,
shader_crate_features: ShaderCrateFeatures::default(),
}
}

Expand Down Expand Up @@ -459,6 +468,20 @@ impl SpirvBuilder {
self
}

/// Set --default-features for the target shader crate.
#[must_use]
pub fn shader_crate_default_features(mut self, default_features: bool) -> Self {
self.shader_crate_features.default_features = Some(default_features);
self
}

/// Set --features for the target shader crate.
#[must_use]
pub fn shader_crate_features(mut self, features: impl IntoIterator<Item = String>) -> Self {
self.shader_crate_features.features = features.into_iter().collect();
self
}

/// Builds the module. If `print_metadata` is [`MetadataPrintout::Full`], you usually don't have to inspect the path
/// in the result, as the environment variable for the path to the module will already be set.
pub fn build(mut self) -> Result<CompileResult, SpirvBuilderError> {
Expand Down Expand Up @@ -755,6 +778,18 @@ fn invoke_rustc(builder: &SpirvBuilder) -> Result<PathBuf, SpirvBuilderError> {
.join(format!("{}.json", builder.target)),
);

if let Some(default_features) = builder.shader_crate_features.default_features {
if !default_features {
cargo.arg("--no-default-features");
}
}

if !builder.shader_crate_features.features.is_empty() {
cargo
.arg("--features")
.arg(builder.shader_crate_features.features.join(","));
}

// NOTE(eddyb) see above how this is computed and why it might be missing.
if let Some(target_dir) = target_dir {
cargo.arg("--target-dir").arg(target_dir);
Expand Down

0 comments on commit 4c9718f

Please sign in to comment.