1
1
use crate :: parsing:: { Input , NodeFnAttributes , ParsedField , ParsedFieldType , ParsedNodeFn , RegularParsedField } ;
2
- use crate :: shader_nodes:: { CodegenShaderEntryPoint , ShaderNodeType } ;
2
+ use crate :: shader_nodes:: { ShaderCodegen , ShaderNodeType , ShaderTokens } ;
3
3
use convert_case:: { Case , Casing } ;
4
4
use proc_macro_crate:: FoundCrate ;
5
5
use proc_macro2:: { Ident , Span , TokenStream } ;
6
6
use quote:: { ToTokens , format_ident, quote} ;
7
7
use std:: borrow:: Cow ;
8
8
use syn:: parse:: { Parse , ParseStream } ;
9
9
use syn:: punctuated:: Punctuated ;
10
- use syn:: { Path , Token , TraitBound , TraitBoundModifier , Type , TypeImplTrait , TypeParamBound } ;
10
+ use syn:: { Token , TraitBound , TraitBoundModifier , Type , TypeImplTrait , TypeParamBound } ;
11
11
12
12
#[ derive( Debug , Clone ) ]
13
13
pub struct PerPixelAdjust { }
@@ -18,10 +18,19 @@ impl Parse for PerPixelAdjust {
18
18
}
19
19
}
20
20
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 {
22
31
fn codegen_shader_entry_point ( & self , parsed : & ParsedNodeFn ) -> syn:: Result < TokenStream > {
23
32
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) ;
25
34
let spirv_image_ty = quote ! ( Image2d ) ;
26
35
27
36
// bindings for images start at 1
@@ -101,7 +110,7 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
101
110
} )
102
111
}
103
112
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 > {
105
114
let fn_name = format_ident ! ( "{}_gpu" , parsed. fn_name) ;
106
115
let struct_name = format_ident ! ( "{}" , fn_name. to_string( ) . to_case( Case :: Pascal ) ) ;
107
116
let mod_name = fn_name. clone ( ) ;
@@ -127,21 +136,22 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
127
136
ParsedFieldType :: Node { .. } => Err ( syn:: Error :: new_spanned ( & f. pat_ident , "PerPixelAdjust shader nodes cannot accept other nodes as generics" ) ) ,
128
137
} )
129
138
. collect :: < syn:: Result < _ > > ( ) ?;
139
+
130
140
let body = quote ! {
131
141
{
132
142
133
143
}
134
144
} ;
135
145
136
- crate :: codegen:: generate_node_code ( & ParsedNodeFn {
146
+ let gpu_node = crate :: codegen:: generate_node_code ( & ParsedNodeFn {
137
147
vis : parsed. vis . clone ( ) ,
138
148
attributes : NodeFnAttributes {
139
149
shader_node : Some ( ShaderNodeType :: GpuNode ) ,
140
150
..parsed. attributes . clone ( )
141
151
} ,
142
152
fn_name,
143
153
struct_name,
144
- mod_name,
154
+ mod_name : mod_name . clone ( ) ,
145
155
fn_generics : vec ! [ ] ,
146
156
where_clause : None ,
147
157
input : Input {
@@ -152,7 +162,7 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
152
162
paren_token : None ,
153
163
modifier : TraitBoundModifier :: None ,
154
164
lifetimes : None ,
155
- path : Path :: from ( format_ident ! ( " Ctx" ) ) ,
165
+ path : syn :: parse2 ( quote ! ( #gcore :: context :: Ctx ) ) ? ,
156
166
} ) ] ) ,
157
167
} ) ,
158
168
implementations : Default :: default ( ) ,
@@ -163,6 +173,15 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
163
173
body,
164
174
crate_name : parsed. crate_name . clone ( ) ,
165
175
description : "" . to_string ( ) ,
176
+ } ) ?;
177
+
178
+ Ok ( quote ! {
179
+ #node_cfg
180
+ mod #mod_name {
181
+ use super :: * ;
182
+
183
+ #gpu_node
184
+ }
166
185
} )
167
186
}
168
187
}
0 commit comments