Skip to content

Commit 7b6b9ff

Browse files
committed
shader-nodes feature: put shader nodes behind feature gate
1 parent 5fc62fc commit 7b6b9ff

File tree

4 files changed

+30
-22
lines changed

4 files changed

+30
-22
lines changed

node-graph/graster-nodes/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pub mod cubic_spline;
77
pub mod fullscreen_vertex;
88

99
/// required by shader macro
10-
#[cfg(feature = "std")]
10+
#[cfg(feature = "shader-nodes")]
1111
pub use graphene_raster_nodes_shaders::WGSL_SHADER;
1212

1313
#[cfg(feature = "std")]

node-graph/node-macro/src/codegen.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
295295

296296
let cfg = crate::shader_nodes::modify_cfg(attributes);
297297
let node_input_accessor = generate_node_input_references(parsed, fn_generics, &field_idents, &graphene_core, &identifier, &cfg);
298-
let ShaderTokens { shader_entry_point, gpu_node } = attributes.shader_node.as_ref().map(|n| n.codegen(parsed, &cfg)).unwrap_or(Ok(ShaderTokens::default()))?;
298+
let ShaderTokens { shader_entry_point, gpu_node } = attributes.shader_node.as_ref().map(|n| n.codegen(parsed)).unwrap_or(Ok(ShaderTokens::default()))?;
299299

300300
Ok(quote! {
301301
/// Underlying implementation for [#struct_name]

node-graph/node-macro/src/shader_nodes/mod.rs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,60 @@ use crate::shader_nodes::per_pixel_adjust::PerPixelAdjust;
33
use proc_macro2::{Ident, TokenStream};
44
use quote::quote;
55
use strum::VariantNames;
6-
use syn::Error;
76
use syn::parse::{Parse, ParseStream};
7+
use syn::punctuated::Punctuated;
8+
use syn::{Error, Token};
89

910
pub mod per_pixel_adjust;
1011

1112
pub const STD_FEATURE_GATE: &str = "std";
13+
pub const SHADER_NODES_FEATURE_GATE: &str = "shader-nodes";
1214

1315
pub fn modify_cfg(attributes: &NodeFnAttributes) -> TokenStream {
14-
match (&attributes.cfg, &attributes.shader_node) {
15-
(Some(cfg), Some(_)) => quote!(#[cfg(all(#cfg, feature = #STD_FEATURE_GATE))]),
16-
(Some(cfg), None) => quote!(#[cfg(#cfg)]),
17-
(None, Some(_)) => quote!(#[cfg(feature = #STD_FEATURE_GATE)]),
18-
(None, None) => quote!(),
19-
}
16+
let feature_gate = match &attributes.shader_node {
17+
// shader node cfg is done on the mod
18+
Some(ShaderNodeType::ShaderNode) => quote!(),
19+
Some(_) => quote!(feature = #STD_FEATURE_GATE),
20+
None => quote!(),
21+
};
22+
let cfgs: Punctuated<_, Token![,]> = match &attributes.cfg {
23+
None => [&feature_gate].into_iter().collect(),
24+
Some(cfg) => [cfg, &feature_gate].into_iter().collect(),
25+
};
26+
quote!(#[cfg(all(#cfgs))])
2027
}
2128

2229
#[derive(Debug, Clone, VariantNames)]
2330
pub(crate) enum ShaderNodeType {
31+
/// Marker for this node being in a gpu node crate, but not having a gpu implementation. This is distinct from not
32+
/// declaring `shader_node` at all, as it will wrap the CPU node with a `#[cfg(feature = "std")]` feature gate.
33+
None,
2434
/// Marker for this node being a generated gpu node implementation, that should not emit anything to prevent
2535
/// recursively generating more gpu nodes. But it still counts as a gpu node and will get the
2636
/// `#[cfg(feature = "std")]` feature gate around it's impl.
27-
GpuNode,
37+
ShaderNode,
2838
PerPixelAdjust(PerPixelAdjust),
2939
}
3040

3141
impl Parse for ShaderNodeType {
3242
fn parse(input: ParseStream) -> syn::Result<Self> {
3343
let ident: Ident = input.parse()?;
3444
Ok(match ident.to_string().as_str() {
45+
"None" => ShaderNodeType::None,
3546
"PerPixelAdjust" => ShaderNodeType::PerPixelAdjust(PerPixelAdjust::parse(input)?),
3647
_ => return Err(Error::new_spanned(&ident, format!("attr 'shader_node' must be one of {:?}", Self::VARIANTS))),
3748
})
3849
}
3950
}
4051

4152
pub trait ShaderCodegen {
42-
fn codegen(&self, parsed: &ParsedNodeFn, node_cfg: &TokenStream) -> syn::Result<ShaderTokens>;
53+
fn codegen(&self, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens>;
4354
}
4455

4556
impl ShaderCodegen for ShaderNodeType {
46-
fn codegen(&self, parsed: &ParsedNodeFn, node_cfg: &TokenStream) -> syn::Result<ShaderTokens> {
57+
fn codegen(&self, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens> {
4758
match self {
48-
ShaderNodeType::GpuNode => (),
59+
ShaderNodeType::None | ShaderNodeType::ShaderNode => (),
4960
_ => {
5061
if parsed.is_async {
5162
return Err(Error::new_spanned(&parsed.fn_name, "Shader nodes must not be async"));
@@ -54,8 +65,8 @@ impl ShaderCodegen for ShaderNodeType {
5465
}
5566

5667
match self {
57-
ShaderNodeType::GpuNode => Ok(ShaderTokens::default()),
58-
ShaderNodeType::PerPixelAdjust(x) => x.codegen(parsed, node_cfg),
68+
ShaderNodeType::None | ShaderNodeType::ShaderNode => Ok(ShaderTokens::default()),
69+
ShaderNodeType::PerPixelAdjust(x) => x.codegen(parsed),
5970
}
6071
}
6172
}

node-graph/node-macro/src/shader_nodes/per_pixel_adjust.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedFieldType, ParsedNodeFn, RegularParsedField};
2-
use crate::shader_nodes::{ShaderCodegen, ShaderNodeType, ShaderTokens};
2+
use crate::shader_nodes::{SHADER_NODES_FEATURE_GATE, ShaderCodegen, ShaderNodeType, ShaderTokens};
33
use convert_case::{Case, Casing};
44
use proc_macro_crate::FoundCrate;
55
use proc_macro2::{Ident, TokenStream};
@@ -19,7 +19,7 @@ impl Parse for PerPixelAdjust {
1919
}
2020

2121
impl ShaderCodegen for PerPixelAdjust {
22-
fn codegen(&self, parsed: &ParsedNodeFn, node_cfg: &TokenStream) -> syn::Result<ShaderTokens> {
22+
fn codegen(&self, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens> {
2323
let fn_name = &parsed.fn_name;
2424

2525
let mut params;
@@ -75,7 +75,6 @@ impl ShaderCodegen for PerPixelAdjust {
7575

7676
let codegen = PerPixelAdjustCodegen {
7777
parsed,
78-
node_cfg,
7978
params,
8079
has_uniform,
8180
entry_point_mod,
@@ -95,7 +94,6 @@ impl ShaderCodegen for PerPixelAdjust {
9594

9695
pub struct PerPixelAdjustCodegen<'a> {
9796
parsed: &'a ParsedNodeFn,
98-
node_cfg: &'a TokenStream,
9997
params: Vec<Param<'a>>,
10098
has_uniform: bool,
10199
entry_point_mod: Ident,
@@ -285,7 +283,7 @@ impl PerPixelAdjustCodegen<'_> {
285283
let mut parsed_node_fn = ParsedNodeFn {
286284
vis: self.parsed.vis.clone(),
287285
attributes: NodeFnAttributes {
288-
shader_node: Some(ShaderNodeType::GpuNode),
286+
shader_node: Some(ShaderNodeType::ShaderNode),
289287
..self.parsed.attributes.clone()
290288
},
291289
fn_name: self.gpu_node_mod.clone(),
@@ -309,10 +307,9 @@ impl PerPixelAdjustCodegen<'_> {
309307
let gpu_node_impl = crate::codegen::generate_node_code(&parsed_node_fn)?;
310308

311309
// wrap node in `mod #gpu_node_mod`
312-
let node_cfg = self.node_cfg;
313310
let gpu_node_mod = &self.gpu_node_mod;
314311
Ok(quote! {
315-
#node_cfg
312+
#[cfg(feature = #SHADER_NODES_FEATURE_GATE)]
316313
mod #gpu_node_mod {
317314
use super::*;
318315
use wgpu_executor::WgpuExecutor;

0 commit comments

Comments
 (0)