shader-rt: fix recursion when generating shader node

This commit is contained in:
firestar99 2025-08-19 12:41:56 +02:00
parent 5a34d62048
commit 802db70d5b
2 changed files with 31 additions and 10 deletions

View file

@ -21,6 +21,10 @@ pub fn modify_cfg(attributes: &NodeFnAttributes) -> TokenStream {
#[derive(Debug, Clone, VariantNames)]
pub(crate) enum ShaderNodeType {
/// Marker for this node being a generated gpu node implementation, that should not emit anything to prevent
/// recursively generating more gpu nodes. But it still counts as a gpu node and will get the
/// `#[cfg(feature = "std")]` feature gate around it's impl.
GpuNode,
PerPixelAdjust(PerPixelAdjust),
}
@ -41,17 +45,24 @@ pub trait CodegenShaderEntryPoint {
impl CodegenShaderEntryPoint for ShaderNodeType {
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
if parsed.is_async {
return Err(Error::new_spanned(&parsed.fn_name, "Shader nodes must not be async"));
match self {
ShaderNodeType::GpuNode => (),
_ => {
if parsed.is_async {
return Err(Error::new_spanned(&parsed.fn_name, "Shader nodes must not be async"));
}
}
}
match self {
ShaderNodeType::GpuNode => Ok(TokenStream::new()),
ShaderNodeType::PerPixelAdjust(x) => x.codegen_shader_entry_point(parsed),
}
}
fn codegen_gpu_node(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
match self {
ShaderNodeType::GpuNode => Ok(TokenStream::new()),
ShaderNodeType::PerPixelAdjust(x) => x.codegen_gpu_node(parsed),
}
}

View file

@ -1,11 +1,12 @@
use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedFieldType, ParsedNodeFn, RegularParsedField};
use crate::shader_nodes::CodegenShaderEntryPoint;
use crate::shader_nodes::{CodegenShaderEntryPoint, ShaderNodeType};
use convert_case::{Case, Casing};
use proc_macro2::{Ident, TokenStream};
use proc_macro2::{Ident, Span, TokenStream};
use quote::{ToTokens, format_ident, quote};
use std::borrow::Cow;
use syn::parse::{Parse, ParseStream};
use syn::{Path, Type, TypePath};
use syn::punctuated::Punctuated;
use syn::{Path, Token, TraitBound, TraitBoundModifier, Type, TypeImplTrait, TypeParamBound};
#[derive(Debug, Clone)]
pub struct PerPixelAdjust {}
@ -115,12 +116,16 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
ParsedFieldType::Node { .. } => Err(syn::Error::new_spanned(&f.pat_ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics")),
})
.collect::<syn::Result<_>>()?;
let body = quote! {};
let body = quote! {
{
}
};
crate::codegen::generate_node_code(&ParsedNodeFn {
vis: parsed.vis.clone(),
attributes: NodeFnAttributes {
shader_node: None,
shader_node: Some(ShaderNodeType::GpuNode),
..parsed.attributes.clone()
},
fn_name,
@ -130,9 +135,14 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
where_clause: None,
input: Input {
pat_ident: parsed.input.pat_ident.clone(),
ty: Type::Path(TypePath {
path: Path::from(format_ident!("Ctx")),
qself: None,
ty: Type::ImplTrait(TypeImplTrait {
impl_token: Token![impl](Span::call_site()),
bounds: Punctuated::from_iter([TypeParamBound::Trait(TraitBound {
paren_token: None,
modifier: TraitBoundModifier::None,
lifetimes: None,
path: Path::from(format_ident!("Ctx")),
})]),
}),
implementations: Default::default(),
},