mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-08-27 16:34:05 +00:00
shader-rt: fix recursion when generating shader node
This commit is contained in:
parent
5a34d62048
commit
802db70d5b
2 changed files with 31 additions and 10 deletions
|
@ -21,6 +21,10 @@ pub fn modify_cfg(attributes: &NodeFnAttributes) -> TokenStream {
|
||||||
|
|
||||||
#[derive(Debug, Clone, VariantNames)]
|
#[derive(Debug, Clone, VariantNames)]
|
||||||
pub(crate) enum ShaderNodeType {
|
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),
|
PerPixelAdjust(PerPixelAdjust),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,17 +45,24 @@ pub trait CodegenShaderEntryPoint {
|
||||||
|
|
||||||
impl CodegenShaderEntryPoint for ShaderNodeType {
|
impl CodegenShaderEntryPoint for ShaderNodeType {
|
||||||
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
|
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
|
||||||
if parsed.is_async {
|
match self {
|
||||||
return Err(Error::new_spanned(&parsed.fn_name, "Shader nodes must not be async"));
|
ShaderNodeType::GpuNode => (),
|
||||||
|
_ => {
|
||||||
|
if parsed.is_async {
|
||||||
|
return Err(Error::new_spanned(&parsed.fn_name, "Shader nodes must not be async"));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
match self {
|
match self {
|
||||||
|
ShaderNodeType::GpuNode => Ok(TokenStream::new()),
|
||||||
ShaderNodeType::PerPixelAdjust(x) => x.codegen_shader_entry_point(parsed),
|
ShaderNodeType::PerPixelAdjust(x) => x.codegen_shader_entry_point(parsed),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn codegen_gpu_node(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
|
fn codegen_gpu_node(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
|
||||||
match self {
|
match self {
|
||||||
|
ShaderNodeType::GpuNode => Ok(TokenStream::new()),
|
||||||
ShaderNodeType::PerPixelAdjust(x) => x.codegen_gpu_node(parsed),
|
ShaderNodeType::PerPixelAdjust(x) => x.codegen_gpu_node(parsed),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedFieldType, ParsedNodeFn, RegularParsedField};
|
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 convert_case::{Case, Casing};
|
||||||
use proc_macro2::{Ident, TokenStream};
|
use proc_macro2::{Ident, Span, TokenStream};
|
||||||
use quote::{ToTokens, format_ident, quote};
|
use quote::{ToTokens, format_ident, quote};
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use syn::parse::{Parse, ParseStream};
|
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)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct PerPixelAdjust {}
|
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")),
|
ParsedFieldType::Node { .. } => Err(syn::Error::new_spanned(&f.pat_ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics")),
|
||||||
})
|
})
|
||||||
.collect::<syn::Result<_>>()?;
|
.collect::<syn::Result<_>>()?;
|
||||||
let body = quote! {};
|
let body = quote! {
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
crate::codegen::generate_node_code(&ParsedNodeFn {
|
crate::codegen::generate_node_code(&ParsedNodeFn {
|
||||||
vis: parsed.vis.clone(),
|
vis: parsed.vis.clone(),
|
||||||
attributes: NodeFnAttributes {
|
attributes: NodeFnAttributes {
|
||||||
shader_node: None,
|
shader_node: Some(ShaderNodeType::GpuNode),
|
||||||
..parsed.attributes.clone()
|
..parsed.attributes.clone()
|
||||||
},
|
},
|
||||||
fn_name,
|
fn_name,
|
||||||
|
@ -130,9 +135,14 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
|
||||||
where_clause: None,
|
where_clause: None,
|
||||||
input: Input {
|
input: Input {
|
||||||
pat_ident: parsed.input.pat_ident.clone(),
|
pat_ident: parsed.input.pat_ident.clone(),
|
||||||
ty: Type::Path(TypePath {
|
ty: Type::ImplTrait(TypeImplTrait {
|
||||||
path: Path::from(format_ident!("Ctx")),
|
impl_token: Token),
|
||||||
qself: None,
|
bounds: Punctuated::from_iter([TypeParamBound::Trait(TraitBound {
|
||||||
|
paren_token: None,
|
||||||
|
modifier: TraitBoundModifier::None,
|
||||||
|
lifetimes: None,
|
||||||
|
path: Path::from(format_ident!("Ctx")),
|
||||||
|
})]),
|
||||||
}),
|
}),
|
||||||
implementations: Default::default(),
|
implementations: Default::default(),
|
||||||
},
|
},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue