11use crate :: parsing:: { Input , NodeFnAttributes , ParsedField , ParsedFieldType , ParsedNodeFn , RegularParsedField } ;
2- use crate :: shader_nodes:: { CodegenShaderEntryPoint , ShaderNodeType } ;
2+ use crate :: shader_nodes:: { ShaderCodegen , ShaderNodeType , ShaderTokens } ;
33use convert_case:: { Case , Casing } ;
44use proc_macro_crate:: FoundCrate ;
55use proc_macro2:: { Ident , Span , TokenStream } ;
66use quote:: { ToTokens , format_ident, quote} ;
77use std:: borrow:: Cow ;
88use syn:: parse:: { Parse , ParseStream } ;
99use 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 ) ]
1313pub 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