Skip to content

Commit ce24755

Browse files
committed
WIP10: properly cfg out the gpu node
1 parent 5a53c4a commit ce24755

File tree

3 files changed

+42
-29
lines changed

3 files changed

+42
-29
lines changed

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::parsing::*;
22
use convert_case::{Case, Casing};
33
use proc_macro_crate::FoundCrate;
4-
use proc_macro2::{TokenStream as TokenStream2, TokenStream};
4+
use proc_macro2::TokenStream as TokenStream2;
55
use quote::{ToTokens, format_ident, quote, quote_spanned};
66
use std::sync::atomic::AtomicU64;
77
use syn::punctuated::Punctuated;
@@ -295,11 +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 (shader_entry_point, shader_gpu_node) = attributes
299-
.shader_node
300-
.as_ref()
301-
.map::<syn::Result<_>, _>(|n| Ok((n.codegen_shader_entry_point(parsed)?, n.codegen_gpu_node(parsed)?)))
302-
.unwrap_or(Ok((TokenStream::new(), TokenStream::new())))?;
298+
let ShaderTokens { shader_entry_point, gpu_node } = attributes.shader_node.as_ref().map(|n| n.codegen(parsed, &cfg)).unwrap_or(Ok(ShaderTokens::default()))?;
303299

304300
Ok(quote! {
305301
/// Underlying implementation for [#struct_name]
@@ -392,7 +388,7 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
392388

393389
#shader_entry_point
394390

395-
#shader_gpu_node
391+
#gpu_node
396392
})
397393
}
398394

@@ -595,7 +591,7 @@ fn generate_register_node_impl(parsed: &ParsedNodeFn, field_names: &[&Ident], st
595591
})
596592
}
597593

598-
use crate::shader_nodes::CodegenShaderEntryPoint;
594+
use crate::shader_nodes::{ShaderCodegen, ShaderTokens};
599595
use syn::visit_mut::VisitMut;
600596
use syn::{GenericArgument, Lifetime, Type};
601597

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

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,12 @@ impl Parse for ShaderNodeType {
3838
}
3939
}
4040

41-
pub trait CodegenShaderEntryPoint {
42-
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream>;
43-
fn codegen_gpu_node(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream>;
41+
pub trait ShaderCodegen {
42+
fn codegen(&self, parsed: &ParsedNodeFn, node_cfg: &TokenStream) -> syn::Result<ShaderTokens>;
4443
}
4544

46-
impl CodegenShaderEntryPoint for ShaderNodeType {
47-
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
45+
impl ShaderCodegen for ShaderNodeType {
46+
fn codegen(&self, parsed: &ParsedNodeFn, node_cfg: &TokenStream) -> syn::Result<ShaderTokens> {
4847
match self {
4948
ShaderNodeType::GpuNode => (),
5049
_ => {
@@ -55,15 +54,14 @@ impl CodegenShaderEntryPoint for ShaderNodeType {
5554
}
5655

5756
match self {
58-
ShaderNodeType::GpuNode => Ok(TokenStream::new()),
59-
ShaderNodeType::PerPixelAdjust(x) => x.codegen_shader_entry_point(parsed),
57+
ShaderNodeType::GpuNode => Ok(ShaderTokens::default()),
58+
ShaderNodeType::PerPixelAdjust(x) => x.codegen(parsed, node_cfg),
6059
}
6160
}
61+
}
6262

63-
fn codegen_gpu_node(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
64-
match self {
65-
ShaderNodeType::GpuNode => Ok(TokenStream::new()),
66-
ShaderNodeType::PerPixelAdjust(x) => x.codegen_gpu_node(parsed),
67-
}
68-
}
63+
#[derive(Clone, Default)]
64+
pub struct ShaderTokens {
65+
pub shader_entry_point: TokenStream,
66+
pub gpu_node: TokenStream,
6967
}

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

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedFieldType, ParsedNodeFn, RegularParsedField};
2-
use crate::shader_nodes::{CodegenShaderEntryPoint, ShaderNodeType};
2+
use crate::shader_nodes::{ShaderCodegen, ShaderNodeType, ShaderTokens};
33
use convert_case::{Case, Casing};
44
use proc_macro_crate::FoundCrate;
55
use proc_macro2::{Ident, Span, TokenStream};
66
use quote::{ToTokens, format_ident, quote};
77
use std::borrow::Cow;
88
use syn::parse::{Parse, ParseStream};
99
use syn::punctuated::Punctuated;
10-
use syn::{Path, Token, TraitBound, TraitBoundModifier, Type, TypeImplTrait, TypeParamBound};
10+
use syn::{Token, TraitBound, TraitBoundModifier, Type, TypeImplTrait, TypeParamBound};
1111

1212
#[derive(Debug, Clone)]
1313
pub struct PerPixelAdjust {}
@@ -18,10 +18,19 @@ impl Parse for PerPixelAdjust {
1818
}
1919
}
2020

21-
impl CodegenShaderEntryPoint for PerPixelAdjust {
21+
impl ShaderCodegen for PerPixelAdjust {
22+
fn codegen(&self, parsed: &ParsedNodeFn, node_cfg: &TokenStream) -> syn::Result<ShaderTokens> {
23+
Ok(ShaderTokens {
24+
shader_entry_point: self.codegen_shader_entry_point(parsed)?,
25+
gpu_node: self.codegen_gpu_node(parsed, node_cfg)?,
26+
})
27+
}
28+
}
29+
30+
impl PerPixelAdjust {
2231
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
2332
let fn_name = &parsed.fn_name;
24-
let gpu_mod = format_ident!("{}_gpu_entry_point", parsed.fn_name);
33+
let gpu_mod = format_ident!("{}_gpu_entry_point", fn_name);
2534
let spirv_image_ty = quote!(Image2d);
2635

2736
// bindings for images start at 1
@@ -101,7 +110,7 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
101110
})
102111
}
103112

104-
fn codegen_gpu_node(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
113+
fn codegen_gpu_node(&self, parsed: &ParsedNodeFn, node_cfg: &TokenStream) -> syn::Result<TokenStream> {
105114
let fn_name = format_ident!("{}_gpu", parsed.fn_name);
106115
let struct_name = format_ident!("{}", fn_name.to_string().to_case(Case::Pascal));
107116
let mod_name = fn_name.clone();
@@ -127,21 +136,22 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
127136
ParsedFieldType::Node { .. } => Err(syn::Error::new_spanned(&f.pat_ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics")),
128137
})
129138
.collect::<syn::Result<_>>()?;
139+
130140
let body = quote! {
131141
{
132142

133143
}
134144
};
135145

136-
crate::codegen::generate_node_code(&ParsedNodeFn {
146+
let gpu_node = crate::codegen::generate_node_code(&ParsedNodeFn {
137147
vis: parsed.vis.clone(),
138148
attributes: NodeFnAttributes {
139149
shader_node: Some(ShaderNodeType::GpuNode),
140150
..parsed.attributes.clone()
141151
},
142152
fn_name,
143153
struct_name,
144-
mod_name,
154+
mod_name: mod_name.clone(),
145155
fn_generics: vec![],
146156
where_clause: None,
147157
input: Input {
@@ -152,7 +162,7 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
152162
paren_token: None,
153163
modifier: TraitBoundModifier::None,
154164
lifetimes: None,
155-
path: Path::from(format_ident!("Ctx")),
165+
path: syn::parse2(quote!(#gcore::context::Ctx))?,
156166
})]),
157167
}),
158168
implementations: Default::default(),
@@ -163,6 +173,15 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
163173
body,
164174
crate_name: parsed.crate_name.clone(),
165175
description: "".to_string(),
176+
})?;
177+
178+
Ok(quote! {
179+
#node_cfg
180+
mod #mod_name {
181+
use super::*;
182+
183+
#gpu_node
184+
}
166185
})
167186
}
168187
}

0 commit comments

Comments
 (0)