@@ -3,49 +3,60 @@ use crate::shader_nodes::per_pixel_adjust::PerPixelAdjust;
3
3
use proc_macro2:: { Ident , TokenStream } ;
4
4
use quote:: quote;
5
5
use strum:: VariantNames ;
6
- use syn:: Error ;
7
6
use syn:: parse:: { Parse , ParseStream } ;
7
+ use syn:: punctuated:: Punctuated ;
8
+ use syn:: { Error , Token } ;
8
9
9
10
pub mod per_pixel_adjust;
10
11
11
12
pub const STD_FEATURE_GATE : & str = "std" ;
13
+ pub const SHADER_NODES_FEATURE_GATE : & str = "shader-nodes" ;
12
14
13
15
pub fn modify_cfg ( attributes : & NodeFnAttributes ) -> TokenStream {
14
- match ( & attributes. cfg , & attributes. shader_node ) {
15
- ( Some ( cfg) , Some ( _) ) => quote ! ( #[ cfg( all( #cfg, feature = #STD_FEATURE_GATE ) ) ] ) ,
16
- ( Some ( cfg) , None ) => quote ! ( #[ cfg( #cfg) ] ) ,
17
- ( None , Some ( _) ) => quote ! ( #[ cfg( feature = #STD_FEATURE_GATE ) ] ) ,
18
- ( None , None ) => quote ! ( ) ,
19
- }
16
+ let feature_gate = match & attributes. shader_node {
17
+ // shader node cfg is done on the mod
18
+ Some ( ShaderNodeType :: ShaderNode ) => quote ! ( ) ,
19
+ Some ( _) => quote ! ( feature = #STD_FEATURE_GATE ) ,
20
+ None => quote ! ( ) ,
21
+ } ;
22
+ let cfgs: Punctuated < _ , Token ! [ , ] > = match & attributes. cfg {
23
+ None => [ & feature_gate] . into_iter ( ) . collect ( ) ,
24
+ Some ( cfg) => [ cfg, & feature_gate] . into_iter ( ) . collect ( ) ,
25
+ } ;
26
+ quote ! ( #[ cfg( all( #cfgs) ) ] )
20
27
}
21
28
22
29
#[ derive( Debug , Clone , VariantNames ) ]
23
30
pub ( crate ) enum ShaderNodeType {
31
+ /// Marker for this node being in a gpu node crate, but not having a gpu implementation. This is distinct from not
32
+ /// declaring `shader_node` at all, as it will wrap the CPU node with a `#[cfg(feature = "std")]` feature gate.
33
+ None ,
24
34
/// Marker for this node being a generated gpu node implementation, that should not emit anything to prevent
25
35
/// recursively generating more gpu nodes. But it still counts as a gpu node and will get the
26
36
/// `#[cfg(feature = "std")]` feature gate around it's impl.
27
- GpuNode ,
37
+ ShaderNode ,
28
38
PerPixelAdjust ( PerPixelAdjust ) ,
29
39
}
30
40
31
41
impl Parse for ShaderNodeType {
32
42
fn parse ( input : ParseStream ) -> syn:: Result < Self > {
33
43
let ident: Ident = input. parse ( ) ?;
34
44
Ok ( match ident. to_string ( ) . as_str ( ) {
45
+ "None" => ShaderNodeType :: None ,
35
46
"PerPixelAdjust" => ShaderNodeType :: PerPixelAdjust ( PerPixelAdjust :: parse ( input) ?) ,
36
47
_ => return Err ( Error :: new_spanned ( & ident, format ! ( "attr 'shader_node' must be one of {:?}" , Self :: VARIANTS ) ) ) ,
37
48
} )
38
49
}
39
50
}
40
51
41
52
pub trait ShaderCodegen {
42
- fn codegen ( & self , parsed : & ParsedNodeFn , node_cfg : & TokenStream ) -> syn:: Result < ShaderTokens > ;
53
+ fn codegen ( & self , parsed : & ParsedNodeFn ) -> syn:: Result < ShaderTokens > ;
43
54
}
44
55
45
56
impl ShaderCodegen for ShaderNodeType {
46
- fn codegen ( & self , parsed : & ParsedNodeFn , node_cfg : & TokenStream ) -> syn:: Result < ShaderTokens > {
57
+ fn codegen ( & self , parsed : & ParsedNodeFn ) -> syn:: Result < ShaderTokens > {
47
58
match self {
48
- ShaderNodeType :: GpuNode => ( ) ,
59
+ ShaderNodeType :: None | ShaderNodeType :: ShaderNode => ( ) ,
49
60
_ => {
50
61
if parsed. is_async {
51
62
return Err ( Error :: new_spanned ( & parsed. fn_name , "Shader nodes must not be async" ) ) ;
@@ -54,8 +65,8 @@ impl ShaderCodegen for ShaderNodeType {
54
65
}
55
66
56
67
match self {
57
- ShaderNodeType :: GpuNode => Ok ( ShaderTokens :: default ( ) ) ,
58
- ShaderNodeType :: PerPixelAdjust ( x) => x. codegen ( parsed, node_cfg ) ,
68
+ ShaderNodeType :: None | ShaderNodeType :: ShaderNode => Ok ( ShaderTokens :: default ( ) ) ,
69
+ ShaderNodeType :: PerPixelAdjust ( x) => x. codegen ( parsed) ,
59
70
}
60
71
}
61
72
}
0 commit comments