1- use crate :: parsing:: { ParsedField , ParsedNodeFn } ;
1+ use crate :: parsing:: { Input , NodeFnAttributes , ParsedField , ParsedFieldType , ParsedNodeFn , RegularParsedField } ;
22use crate :: shader_nodes:: CodegenShaderEntryPoint ;
3+ use convert_case:: { Case , Casing } ;
34use proc_macro2:: { Ident , TokenStream } ;
45use quote:: { ToTokens , format_ident, quote} ;
56use std:: borrow:: Cow ;
67use syn:: parse:: { Parse , ParseStream } ;
8+ use syn:: { Path , Type , TypePath } ;
79
8- #[ derive( Debug ) ]
10+ #[ derive( Debug , Clone ) ]
911pub struct PerPixelAdjust { }
1012
1113impl Parse for PerPixelAdjust {
@@ -17,28 +19,31 @@ impl Parse for PerPixelAdjust {
1719impl CodegenShaderEntryPoint for PerPixelAdjust {
1820 fn codegen_shader_entry_point ( & self , parsed : & ParsedNodeFn ) -> syn:: Result < TokenStream > {
1921 let fn_name = & parsed. fn_name ;
20- let gpu_mod = format_ident ! ( "{}_gpu " , parsed. fn_name) ;
22+ let gpu_mod = format_ident ! ( "{}_gpu_entry_point " , parsed. fn_name) ;
2123 let spirv_image_ty = quote ! ( Image2d ) ;
2224
2325 // bindings for images start at 1
2426 let mut binding_cnt = 0 ;
2527 let params = parsed
2628 . fields
2729 . iter ( )
28- . map ( |f| match f {
29- ParsedField :: Node { pat_ident, .. } => Err ( syn:: Error :: new_spanned ( pat_ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics" ) ) ,
30- ParsedField :: Regular { gpu_image : false , pat_ident, ty, .. } => Ok ( Param {
31- ident : Cow :: Borrowed ( & pat_ident. ident ) ,
32- ty : Cow :: Owned ( ty. to_token_stream ( ) ) ,
33- param_type : ParamType :: Uniform ,
34- } ) ,
35- ParsedField :: Regular { gpu_image : true , pat_ident, .. } => {
36- binding_cnt += 1 ;
37- Ok ( Param {
38- ident : Cow :: Owned ( format_ident ! ( "image_{}" , & pat_ident. ident) ) ,
39- ty : Cow :: Borrowed ( & spirv_image_ty) ,
40- param_type : ParamType :: Image { binding : binding_cnt } ,
41- } )
30+ . map ( |f| {
31+ let ident = & f. pat_ident ;
32+ match & f. ty {
33+ ParsedFieldType :: Node { .. } => Err ( syn:: Error :: new_spanned ( ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics" ) ) ,
34+ ParsedFieldType :: Regular ( RegularParsedField { gpu_image : false , ty, .. } ) => Ok ( Param {
35+ ident : Cow :: Borrowed ( & ident. ident ) ,
36+ ty : Cow :: Owned ( ty. to_token_stream ( ) ) ,
37+ param_type : ParamType :: Uniform ,
38+ } ) ,
39+ ParsedFieldType :: Regular ( RegularParsedField { gpu_image : true , .. } ) => {
40+ binding_cnt += 1 ;
41+ Ok ( Param {
42+ ident : Cow :: Owned ( format_ident ! ( "image_{}" , & ident. ident) ) ,
43+ ty : Cow :: Borrowed ( & spirv_image_ty) ,
44+ param_type : ParamType :: Image { binding : binding_cnt } ,
45+ } )
46+ }
4247 }
4348 } )
4449 . collect :: < syn:: Result < Vec < _ > > > ( ) ?;
@@ -93,6 +98,52 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
9398 }
9499 } )
95100 }
101+
102+ fn codegen_gpu_node ( & self , parsed : & ParsedNodeFn ) -> syn:: Result < TokenStream > {
103+ let fn_name = format_ident ! ( "{}_gpu" , parsed. fn_name) ;
104+ let struct_name = format_ident ! ( "{}" , fn_name. to_string( ) . to_case( Case :: Pascal ) ) ;
105+ let mod_name = fn_name. clone ( ) ;
106+
107+ let fields = parsed
108+ . fields
109+ . iter ( )
110+ . map ( |f| match & f. ty {
111+ ParsedFieldType :: Regular ( reg) => Ok ( ParsedField {
112+ ty : ParsedFieldType :: Regular ( RegularParsedField { gpu_image : false , ..reg. clone ( ) } ) ,
113+ ..f. clone ( )
114+ } ) ,
115+ ParsedFieldType :: Node { .. } => Err ( syn:: Error :: new_spanned ( & f. pat_ident , "PerPixelAdjust shader nodes cannot accept other nodes as generics" ) ) ,
116+ } )
117+ . collect :: < syn:: Result < _ > > ( ) ?;
118+ let body = quote ! { } ;
119+
120+ crate :: codegen:: generate_node_code ( & ParsedNodeFn {
121+ vis : parsed. vis . clone ( ) ,
122+ attributes : NodeFnAttributes {
123+ shader_node : None ,
124+ ..parsed. attributes . clone ( )
125+ } ,
126+ fn_name,
127+ struct_name,
128+ mod_name,
129+ fn_generics : vec ! [ ] ,
130+ where_clause : None ,
131+ input : Input {
132+ pat_ident : parsed. input . pat_ident . clone ( ) ,
133+ ty : Type :: Path ( TypePath {
134+ path : Path :: from ( format_ident ! ( "Ctx" ) ) ,
135+ qself : None ,
136+ } ) ,
137+ implementations : Default :: default ( ) ,
138+ } ,
139+ output_type : parsed. output_type . clone ( ) ,
140+ is_async : true ,
141+ fields,
142+ body,
143+ crate_name : parsed. crate_name . clone ( ) ,
144+ description : "" . to_string ( ) ,
145+ } )
146+ }
96147}
97148
98149struct Param < ' a > {
0 commit comments