Skip to content

Commit b0b2882

Browse files
committed
shader-rt: fix recursion when generating shader node
1 parent fa90210 commit b0b2882

2 files changed

Lines changed: 31 additions & 10 deletions

File tree

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ pub fn modify_cfg(attributes: &NodeFnAttributes) -> TokenStream {
2121

2222
#[derive(Debug, Clone, VariantNames)]
2323
pub(crate) enum ShaderNodeType {
24+
/// Marker for this node being a generated gpu node implementation, that should not emit anything to prevent
25+
/// recursively generating more gpu nodes. But it still counts as a gpu node and will get the
26+
/// `#[cfg(feature = "std")]` feature gate around it's impl.
27+
GpuNode,
2428
PerPixelAdjust(PerPixelAdjust),
2529
}
2630

@@ -41,17 +45,24 @@ pub trait CodegenShaderEntryPoint {
4145

4246
impl CodegenShaderEntryPoint for ShaderNodeType {
4347
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
44-
if parsed.is_async {
45-
return Err(Error::new_spanned(&parsed.fn_name, "Shader nodes must not be async"));
48+
match self {
49+
ShaderNodeType::GpuNode => (),
50+
_ => {
51+
if parsed.is_async {
52+
return Err(Error::new_spanned(&parsed.fn_name, "Shader nodes must not be async"));
53+
}
54+
}
4655
}
4756

4857
match self {
58+
ShaderNodeType::GpuNode => Ok(TokenStream::new()),
4959
ShaderNodeType::PerPixelAdjust(x) => x.codegen_shader_entry_point(parsed),
5060
}
5161
}
5262

5363
fn codegen_gpu_node(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
5464
match self {
65+
ShaderNodeType::GpuNode => Ok(TokenStream::new()),
5566
ShaderNodeType::PerPixelAdjust(x) => x.codegen_gpu_node(parsed),
5667
}
5768
}

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedFieldType, ParsedNodeFn, RegularParsedField};
2-
use crate::shader_nodes::CodegenShaderEntryPoint;
2+
use crate::shader_nodes::{CodegenShaderEntryPoint, ShaderNodeType};
33
use convert_case::{Case, Casing};
4-
use proc_macro2::{Ident, TokenStream};
4+
use proc_macro2::{Ident, Span, TokenStream};
55
use quote::{ToTokens, format_ident, quote};
66
use std::borrow::Cow;
77
use syn::parse::{Parse, ParseStream};
8-
use syn::{Path, Type, TypePath};
8+
use syn::punctuated::Punctuated;
9+
use syn::{Path, Token, TraitBound, TraitBoundModifier, Type, TypeImplTrait, TypeParamBound};
910

1011
#[derive(Debug, Clone)]
1112
pub struct PerPixelAdjust {}
@@ -115,12 +116,16 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
115116
ParsedFieldType::Node { .. } => Err(syn::Error::new_spanned(&f.pat_ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics")),
116117
})
117118
.collect::<syn::Result<_>>()?;
118-
let body = quote! {};
119+
let body = quote! {
120+
{
121+
122+
}
123+
};
119124

120125
crate::codegen::generate_node_code(&ParsedNodeFn {
121126
vis: parsed.vis.clone(),
122127
attributes: NodeFnAttributes {
123-
shader_node: None,
128+
shader_node: Some(ShaderNodeType::GpuNode),
124129
..parsed.attributes.clone()
125130
},
126131
fn_name,
@@ -130,9 +135,14 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
130135
where_clause: None,
131136
input: Input {
132137
pat_ident: parsed.input.pat_ident.clone(),
133-
ty: Type::Path(TypePath {
134-
path: Path::from(format_ident!("Ctx")),
135-
qself: None,
138+
ty: Type::ImplTrait(TypeImplTrait {
139+
impl_token: Token![impl](Span::call_site()),
140+
bounds: Punctuated::from_iter([TypeParamBound::Trait(TraitBound {
141+
paren_token: None,
142+
modifier: TraitBoundModifier::None,
143+
lifetimes: None,
144+
path: Path::from(format_ident!("Ctx")),
145+
})]),
136146
}),
137147
implementations: Default::default(),
138148
},

0 commit comments

Comments
 (0)