mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-02 09:48:11 +08:00
node-macro: add CrateIdent struct containing resolved crate paths
This commit is contained in:
Generated
+1
@@ -2140,6 +2140,7 @@ dependencies = [
|
|||||||
"num-traits",
|
"num-traits",
|
||||||
"serde",
|
"serde",
|
||||||
"specta",
|
"specta",
|
||||||
|
"spirv-std",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ glam = { workspace = true }
|
|||||||
half = { workspace = true, default-features = false }
|
half = { workspace = true, default-features = false }
|
||||||
num-derive = { workspace = true }
|
num-derive = { workspace = true }
|
||||||
num-traits = { workspace = true }
|
num-traits = { workspace = true }
|
||||||
|
spirv-std = { workspace = true }
|
||||||
|
|
||||||
# Workspace std dependencies
|
# Workspace std dependencies
|
||||||
serde = { workspace = true, optional = true }
|
serde = { workspace = true, optional = true }
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ pub mod choice_type;
|
|||||||
pub mod color;
|
pub mod color;
|
||||||
pub mod context;
|
pub mod context;
|
||||||
pub mod registry;
|
pub mod registry;
|
||||||
|
pub mod shaders;
|
||||||
|
|
||||||
pub use context::Ctx;
|
pub use context::Ctx;
|
||||||
pub use glam;
|
pub use glam;
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
pub mod __private {
|
||||||
|
pub use bytemuck;
|
||||||
|
pub use glam;
|
||||||
|
pub use spirv_std;
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
use crate::parsing::*;
|
use crate::parsing::*;
|
||||||
use convert_case::{Case, Casing};
|
use convert_case::{Case, Casing};
|
||||||
use proc_macro_crate::FoundCrate;
|
|
||||||
use proc_macro2::TokenStream as TokenStream2;
|
use proc_macro2::TokenStream as TokenStream2;
|
||||||
use quote::{ToTokens, format_ident, quote, quote_spanned};
|
use quote::{ToTokens, format_ident, quote, quote_spanned};
|
||||||
use std::sync::atomic::AtomicU64;
|
use std::sync::atomic::AtomicU64;
|
||||||
@@ -10,7 +9,7 @@ use syn::token::Comma;
|
|||||||
use syn::{Error, Ident, PatIdent, Token, WhereClause, WherePredicate, parse_quote};
|
use syn::{Error, Ident, PatIdent, Token, WhereClause, WherePredicate, parse_quote};
|
||||||
static NODE_ID: AtomicU64 = AtomicU64::new(0);
|
static NODE_ID: AtomicU64 = AtomicU64::new(0);
|
||||||
|
|
||||||
pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStream2> {
|
pub(crate) fn generate_node_code(crate_ident: &CrateIdent, parsed: &ParsedNodeFn) -> syn::Result<TokenStream2> {
|
||||||
let ParsedNodeFn {
|
let ParsedNodeFn {
|
||||||
vis,
|
vis,
|
||||||
attributes,
|
attributes,
|
||||||
@@ -24,10 +23,10 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
|||||||
is_async,
|
is_async,
|
||||||
fields,
|
fields,
|
||||||
body,
|
body,
|
||||||
crate_name: graphene_core_crate,
|
|
||||||
description,
|
description,
|
||||||
..
|
..
|
||||||
} = parsed;
|
} = parsed;
|
||||||
|
let graphene_core = crate_ident.gcore()?;
|
||||||
|
|
||||||
let category = &attributes.category.as_ref().map(|value| quote!(Some(#value))).unwrap_or(quote!(None));
|
let category = &attributes.category.as_ref().map(|value| quote!(Some(#value))).unwrap_or(quote!(None));
|
||||||
let mod_name = format_ident!("_{}_mod", mod_name);
|
let mod_name = format_ident!("_{}_mod", mod_name);
|
||||||
@@ -60,14 +59,6 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
|||||||
quote! { pub(super) #name: #r#gen }
|
quote! { pub(super) #name: #r#gen }
|
||||||
});
|
});
|
||||||
|
|
||||||
let graphene_core = match graphene_core_crate {
|
|
||||||
FoundCrate::Itself => quote!(crate),
|
|
||||||
FoundCrate::Name(name) => {
|
|
||||||
let ident = Ident::new(name, proc_macro2::Span::call_site());
|
|
||||||
quote!( #ident )
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut future_idents = Vec::new();
|
let mut future_idents = Vec::new();
|
||||||
|
|
||||||
let field_types: Vec<_> = fields
|
let field_types: Vec<_> = fields
|
||||||
@@ -295,7 +286,7 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
|||||||
|
|
||||||
let cfg = crate::shader_nodes::modify_cfg(attributes);
|
let cfg = crate::shader_nodes::modify_cfg(attributes);
|
||||||
let node_input_accessor = generate_node_input_references(parsed, fn_generics, &field_idents, &graphene_core, &identifier, &cfg);
|
let node_input_accessor = generate_node_input_references(parsed, fn_generics, &field_idents, &graphene_core, &identifier, &cfg);
|
||||||
let ShaderTokens { shader_entry_point, gpu_node } = attributes.shader_node.as_ref().map(|n| n.codegen(parsed)).unwrap_or(Ok(ShaderTokens::default()))?;
|
let ShaderTokens { shader_entry_point, gpu_node } = attributes.shader_node.as_ref().map(|n| n.codegen(crate_ident, parsed)).unwrap_or(Ok(ShaderTokens::default()))?;
|
||||||
|
|
||||||
Ok(quote! {
|
Ok(quote! {
|
||||||
/// Underlying implementation for [#struct_name]
|
/// Underlying implementation for [#struct_name]
|
||||||
@@ -592,6 +583,7 @@ fn generate_register_node_impl(parsed: &ParsedNodeFn, field_names: &[&Ident], st
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use crate::crate_ident::CrateIdent;
|
||||||
use crate::shader_nodes::{ShaderCodegen, ShaderTokens};
|
use crate::shader_nodes::{ShaderCodegen, ShaderTokens};
|
||||||
use syn::visit_mut::VisitMut;
|
use syn::visit_mut::VisitMut;
|
||||||
use syn::{GenericArgument, Lifetime, Type};
|
use syn::{GenericArgument, Lifetime, Type};
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
use proc_macro_crate::{FoundCrate, crate_name};
|
||||||
|
use proc_macro2::{Span, TokenStream};
|
||||||
|
use quote::{format_ident, quote};
|
||||||
|
|
||||||
|
pub struct CrateIdent {
|
||||||
|
gcore: syn::Result<TokenStream>,
|
||||||
|
gcore_shaders: syn::Result<TokenStream>,
|
||||||
|
wgpu_executor: syn::Result<TokenStream>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CrateIdent {
|
||||||
|
pub fn gcore(&self) -> syn::Result<&TokenStream> {
|
||||||
|
self.gcore.as_ref().map_err(Clone::clone)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn gcore_shaders(&self) -> syn::Result<&TokenStream> {
|
||||||
|
self.gcore_shaders.as_ref().map_err(Clone::clone)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn wgpu_executor(&self) -> syn::Result<&TokenStream> {
|
||||||
|
self.wgpu_executor.as_ref().map_err(Clone::clone)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for CrateIdent {
|
||||||
|
fn default() -> Self {
|
||||||
|
let find_crate = |orig_name| match crate_name(orig_name) {
|
||||||
|
Ok(FoundCrate::Itself) => Ok(quote!(crate)),
|
||||||
|
Ok(FoundCrate::Name(name)) => {
|
||||||
|
let name = format_ident!("{}", name);
|
||||||
|
Ok(quote!(::#name))
|
||||||
|
}
|
||||||
|
Err(e) => Err(syn::Error::new(Span::call_site(), &format!("Could not find dependency on `{orig_name}`:\n{e}"))),
|
||||||
|
};
|
||||||
|
|
||||||
|
let gcore = find_crate("graphene-core");
|
||||||
|
let gcore_shaders = find_crate("graphene-core-shaders").or_else(|eshaders| {
|
||||||
|
gcore
|
||||||
|
.as_ref()
|
||||||
|
.map(Clone::clone)
|
||||||
|
.map_err(|ecore| syn::Error::new(Span::call_site(), &format!("{ecore}\n\nFallback: {eshaders}")))
|
||||||
|
});
|
||||||
|
let wgpu_executor = find_crate("wgpu-executor");
|
||||||
|
Self { gcore, gcore_shaders, wgpu_executor }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ use proc_macro_error2::proc_macro_error;
|
|||||||
use syn::GenericParam;
|
use syn::GenericParam;
|
||||||
|
|
||||||
mod codegen;
|
mod codegen;
|
||||||
|
mod crate_ident;
|
||||||
mod derive_choice_type;
|
mod derive_choice_type;
|
||||||
mod parsing;
|
mod parsing;
|
||||||
mod shader_nodes;
|
mod shader_nodes;
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ use syn::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use crate::codegen::generate_node_code;
|
use crate::codegen::generate_node_code;
|
||||||
|
use crate::crate_ident::CrateIdent;
|
||||||
use crate::shader_nodes::ShaderNodeType;
|
use crate::shader_nodes::ShaderNodeType;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
@@ -35,7 +36,6 @@ pub(crate) struct ParsedNodeFn {
|
|||||||
pub(crate) is_async: bool,
|
pub(crate) is_async: bool,
|
||||||
pub(crate) fields: Vec<ParsedField>,
|
pub(crate) fields: Vec<ParsedField>,
|
||||||
pub(crate) body: TokenStream2,
|
pub(crate) body: TokenStream2,
|
||||||
pub(crate) crate_name: proc_macro_crate::FoundCrate,
|
|
||||||
pub(crate) description: String,
|
pub(crate) description: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,12 +313,6 @@ fn parse_node_fn(attr: TokenStream2, item: TokenStream2) -> syn::Result<ParsedNo
|
|||||||
let output_type = parse_output(&input_fn.sig.output)?;
|
let output_type = parse_output(&input_fn.sig.output)?;
|
||||||
let where_clause = input_fn.sig.generics.where_clause;
|
let where_clause = input_fn.sig.generics.where_clause;
|
||||||
let body = input_fn.block.to_token_stream();
|
let body = input_fn.block.to_token_stream();
|
||||||
let crate_name = proc_macro_crate::crate_name("graphene-core").map_err(|e| {
|
|
||||||
Error::new(
|
|
||||||
proc_macro2::Span::call_site(),
|
|
||||||
format!("Failed to find location of graphene_core. Make sure it is imported as a dependency: {e}"),
|
|
||||||
)
|
|
||||||
})?;
|
|
||||||
let description = input_fn
|
let description = input_fn
|
||||||
.attrs
|
.attrs
|
||||||
.iter()
|
.iter()
|
||||||
@@ -349,7 +343,6 @@ fn parse_node_fn(attr: TokenStream2, item: TokenStream2) -> syn::Result<ParsedNo
|
|||||||
fields,
|
fields,
|
||||||
where_clause,
|
where_clause,
|
||||||
body,
|
body,
|
||||||
crate_name,
|
|
||||||
description,
|
description,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -643,10 +636,11 @@ fn extract_attribute<'a>(attrs: &'a [Attribute], name: &str) -> Option<&'a Attri
|
|||||||
|
|
||||||
// Modify the new_node_fn function to use the code generation
|
// Modify the new_node_fn function to use the code generation
|
||||||
pub fn new_node_fn(attr: TokenStream2, item: TokenStream2) -> syn::Result<TokenStream2> {
|
pub fn new_node_fn(attr: TokenStream2, item: TokenStream2) -> syn::Result<TokenStream2> {
|
||||||
|
let crate_ident = CrateIdent::default();
|
||||||
let mut parsed_node = parse_node_fn(attr, item.clone()).map_err(|e| Error::new(e.span(), format!("Failed to parse node function: {e}")))?;
|
let mut parsed_node = parse_node_fn(attr, item.clone()).map_err(|e| Error::new(e.span(), format!("Failed to parse node function: {e}")))?;
|
||||||
parsed_node.replace_impl_trait_in_input();
|
parsed_node.replace_impl_trait_in_input();
|
||||||
crate::validation::validate_node_fn(&parsed_node).map_err(|e| Error::new(e.span(), format!("Validation Error: {e}")))?;
|
crate::validation::validate_node_fn(&parsed_node).map_err(|e| Error::new(e.span(), format!("Validation Error: {e}")))?;
|
||||||
generate_node_code(&parsed_node).map_err(|e| Error::new(e.span(), format!("Failed to generate node code: {e}")))
|
generate_node_code(&crate_ident, &parsed_node).map_err(|e| Error::new(e.span(), format!("Failed to generate node code: {e}")))
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ParsedNodeFn {
|
impl ParsedNodeFn {
|
||||||
@@ -677,7 +671,6 @@ impl ParsedNodeFn {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use proc_macro_crate::FoundCrate;
|
|
||||||
use proc_macro2::Span;
|
use proc_macro2::Span;
|
||||||
use quote::{quote, quote_spanned};
|
use quote::{quote, quote_spanned};
|
||||||
use syn::parse_quote;
|
use syn::parse_quote;
|
||||||
@@ -829,7 +822,6 @@ mod tests {
|
|||||||
unit: None,
|
unit: None,
|
||||||
}],
|
}],
|
||||||
body: TokenStream2::new(),
|
body: TokenStream2::new(),
|
||||||
crate_name: FoundCrate::Itself,
|
|
||||||
description: String::from("Multi\nLine\n"),
|
description: String::from("Multi\nLine\n"),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -911,7 +903,6 @@ mod tests {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
body: TokenStream2::new(),
|
body: TokenStream2::new(),
|
||||||
crate_name: FoundCrate::Itself,
|
|
||||||
description: String::from("Hello\n\t\t\t\tWorld\n"),
|
description: String::from("Hello\n\t\t\t\tWorld\n"),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -974,7 +965,6 @@ mod tests {
|
|||||||
unit: None,
|
unit: None,
|
||||||
}],
|
}],
|
||||||
body: TokenStream2::new(),
|
body: TokenStream2::new(),
|
||||||
crate_name: FoundCrate::Itself,
|
|
||||||
description: "Test\n".into(),
|
description: "Test\n".into(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1041,7 +1031,6 @@ mod tests {
|
|||||||
unit: None,
|
unit: None,
|
||||||
}],
|
}],
|
||||||
body: TokenStream2::new(),
|
body: TokenStream2::new(),
|
||||||
crate_name: FoundCrate::Itself,
|
|
||||||
description: String::new(),
|
description: String::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1110,7 +1099,6 @@ mod tests {
|
|||||||
unit: None,
|
unit: None,
|
||||||
}],
|
}],
|
||||||
body: TokenStream2::new(),
|
body: TokenStream2::new(),
|
||||||
crate_name: FoundCrate::Itself,
|
|
||||||
description: String::new(),
|
description: String::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1172,7 +1160,6 @@ mod tests {
|
|||||||
unit: None,
|
unit: None,
|
||||||
}],
|
}],
|
||||||
body: TokenStream2::new(),
|
body: TokenStream2::new(),
|
||||||
crate_name: FoundCrate::Itself,
|
|
||||||
description: String::new(),
|
description: String::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1214,7 +1201,6 @@ mod tests {
|
|||||||
is_async: false,
|
is_async: false,
|
||||||
fields: vec![],
|
fields: vec![],
|
||||||
body: TokenStream2::new(),
|
body: TokenStream2::new(),
|
||||||
crate_name: FoundCrate::Itself,
|
|
||||||
description: String::new(),
|
description: String::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use crate::crate_ident::CrateIdent;
|
||||||
use crate::parsing::{NodeFnAttributes, ParsedNodeFn};
|
use crate::parsing::{NodeFnAttributes, ParsedNodeFn};
|
||||||
use crate::shader_nodes::per_pixel_adjust::PerPixelAdjust;
|
use crate::shader_nodes::per_pixel_adjust::PerPixelAdjust;
|
||||||
use proc_macro2::{Ident, TokenStream};
|
use proc_macro2::{Ident, TokenStream};
|
||||||
@@ -50,11 +51,11 @@ impl Parse for ShaderNodeType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub trait ShaderCodegen {
|
pub trait ShaderCodegen {
|
||||||
fn codegen(&self, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens>;
|
fn codegen(&self, crate_ident: &CrateIdent, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ShaderCodegen for ShaderNodeType {
|
impl ShaderCodegen for ShaderNodeType {
|
||||||
fn codegen(&self, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens> {
|
fn codegen(&self, crate_ident: &CrateIdent, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens> {
|
||||||
match self {
|
match self {
|
||||||
ShaderNodeType::None | ShaderNodeType::ShaderNode => (),
|
ShaderNodeType::None | ShaderNodeType::ShaderNode => (),
|
||||||
_ => {
|
_ => {
|
||||||
@@ -66,7 +67,7 @@ impl ShaderCodegen for ShaderNodeType {
|
|||||||
|
|
||||||
match self {
|
match self {
|
||||||
ShaderNodeType::None | ShaderNodeType::ShaderNode => Ok(ShaderTokens::default()),
|
ShaderNodeType::None | ShaderNodeType::ShaderNode => Ok(ShaderTokens::default()),
|
||||||
ShaderNodeType::PerPixelAdjust(x) => x.codegen(parsed),
|
ShaderNodeType::PerPixelAdjust(x) => x.codegen(crate_ident, parsed),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
|
use crate::crate_ident::CrateIdent;
|
||||||
use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedFieldType, ParsedNodeFn, RegularParsedField};
|
use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedFieldType, ParsedNodeFn, RegularParsedField};
|
||||||
use crate::shader_nodes::{SHADER_NODES_FEATURE_GATE, ShaderCodegen, ShaderNodeType, ShaderTokens};
|
use crate::shader_nodes::{SHADER_NODES_FEATURE_GATE, ShaderCodegen, ShaderNodeType, ShaderTokens};
|
||||||
use convert_case::{Case, Casing};
|
use convert_case::{Case, Casing};
|
||||||
use proc_macro_crate::FoundCrate;
|
|
||||||
use proc_macro2::{Ident, TokenStream};
|
use proc_macro2::{Ident, TokenStream};
|
||||||
use quote::{ToTokens, format_ident, quote};
|
use quote::{ToTokens, format_ident, quote};
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
@@ -19,7 +19,7 @@ impl Parse for PerPixelAdjust {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ShaderCodegen for PerPixelAdjust {
|
impl ShaderCodegen for PerPixelAdjust {
|
||||||
fn codegen(&self, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens> {
|
fn codegen(&self, crate_ident: &CrateIdent, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens> {
|
||||||
let fn_name = &parsed.fn_name;
|
let fn_name = &parsed.fn_name;
|
||||||
|
|
||||||
let mut params;
|
let mut params;
|
||||||
@@ -74,6 +74,7 @@ impl ShaderCodegen for PerPixelAdjust {
|
|||||||
let shader_node_mod = format_ident!("{}_shader_node", fn_name);
|
let shader_node_mod = format_ident!("{}_shader_node", fn_name);
|
||||||
|
|
||||||
let codegen = PerPixelAdjustCodegen {
|
let codegen = PerPixelAdjustCodegen {
|
||||||
|
crate_ident,
|
||||||
parsed,
|
parsed,
|
||||||
params,
|
params,
|
||||||
has_uniform,
|
has_uniform,
|
||||||
@@ -93,6 +94,7 @@ impl ShaderCodegen for PerPixelAdjust {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct PerPixelAdjustCodegen<'a> {
|
pub struct PerPixelAdjustCodegen<'a> {
|
||||||
|
crate_ident: &'a CrateIdent,
|
||||||
parsed: &'a ParsedNodeFn,
|
parsed: &'a ParsedNodeFn,
|
||||||
params: Vec<Param<'a>>,
|
params: Vec<Param<'a>>,
|
||||||
has_uniform: bool,
|
has_uniform: bool,
|
||||||
@@ -107,6 +109,9 @@ pub struct PerPixelAdjustCodegen<'a> {
|
|||||||
impl PerPixelAdjustCodegen<'_> {
|
impl PerPixelAdjustCodegen<'_> {
|
||||||
fn codegen_shader_entry_point(&self) -> syn::Result<TokenStream> {
|
fn codegen_shader_entry_point(&self) -> syn::Result<TokenStream> {
|
||||||
let fn_name = &self.parsed.fn_name;
|
let fn_name = &self.parsed.fn_name;
|
||||||
|
let gcore_shaders = self.crate_ident.gcore_shaders()?;
|
||||||
|
let reexport = quote!(#gcore_shaders::shaders::__private);
|
||||||
|
|
||||||
let uniform_members = self
|
let uniform_members = self
|
||||||
.params
|
.params
|
||||||
.iter()
|
.iter()
|
||||||
@@ -139,16 +144,16 @@ impl PerPixelAdjustCodegen<'_> {
|
|||||||
Ok(quote! {
|
Ok(quote! {
|
||||||
pub mod #entry_point_mod {
|
pub mod #entry_point_mod {
|
||||||
use super::*;
|
use super::*;
|
||||||
use graphene_core_shaders::color::Color;
|
use #gcore_shaders::color::Color;
|
||||||
use spirv_std::spirv;
|
use #reexport::glam::{Vec4, Vec4Swizzles};
|
||||||
use spirv_std::glam::{Vec4, Vec4Swizzles};
|
use #reexport::spirv_std::spirv;
|
||||||
use spirv_std::image::{Image2d, ImageWithMethods};
|
use #reexport::spirv_std::image::{Image2d, ImageWithMethods};
|
||||||
use spirv_std::image::sample_with::lod;
|
use #reexport::spirv_std::image::sample_with::lod;
|
||||||
|
|
||||||
pub const #entry_point_name: &str = core::concat!(core::module_path!(), "::entry_point");
|
pub const #entry_point_name: &str = core::concat!(core::module_path!(), "::entry_point");
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Copy, Clone, bytemuck::NoUninit)]
|
#[derive(Copy, Clone, #reexport::bytemuck::NoUninit)]
|
||||||
pub struct #uniform_struct_ident {
|
pub struct #uniform_struct_ident {
|
||||||
#(pub #uniform_members),*
|
#(pub #uniform_members),*
|
||||||
}
|
}
|
||||||
@@ -169,10 +174,8 @@ impl PerPixelAdjustCodegen<'_> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn codegen_gpu_node(&self) -> syn::Result<TokenStream> {
|
fn codegen_gpu_node(&self) -> syn::Result<TokenStream> {
|
||||||
let gcore = match &self.parsed.crate_name {
|
let gcore = self.crate_ident.gcore()?;
|
||||||
FoundCrate::Itself => format_ident!("crate"),
|
let wgpu_executor = self.crate_ident.wgpu_executor()?;
|
||||||
FoundCrate::Name(name) => format_ident!("{name}"),
|
|
||||||
};
|
|
||||||
|
|
||||||
// adapt fields for gpu node
|
// adapt fields for gpu node
|
||||||
let raster_gpu: Type = parse_quote!(#gcore::table::Table<#gcore::raster_types::Raster<#gcore::raster_types::GPU>>);
|
let raster_gpu: Type = parse_quote!(#gcore::table::Table<#gcore::raster_types::Raster<#gcore::raster_types::GPU>>);
|
||||||
@@ -207,13 +210,13 @@ impl PerPixelAdjustCodegen<'_> {
|
|||||||
.collect::<syn::Result<Vec<_>>>()?;
|
.collect::<syn::Result<Vec<_>>>()?;
|
||||||
|
|
||||||
// insert wgpu_executor field
|
// insert wgpu_executor field
|
||||||
let wgpu_executor = format_ident!("__wgpu_executor");
|
let executor = format_ident!("__wgpu_executor");
|
||||||
fields.push(ParsedField {
|
fields.push(ParsedField {
|
||||||
pat_ident: PatIdent {
|
pat_ident: PatIdent {
|
||||||
attrs: vec![],
|
attrs: vec![],
|
||||||
by_ref: None,
|
by_ref: None,
|
||||||
mutability: None,
|
mutability: None,
|
||||||
ident: parse_quote!(#wgpu_executor),
|
ident: parse_quote!(#executor),
|
||||||
subpat: None,
|
subpat: None,
|
||||||
},
|
},
|
||||||
name: None,
|
name: None,
|
||||||
@@ -271,7 +274,7 @@ impl PerPixelAdjustCodegen<'_> {
|
|||||||
let entry_point_name = &self.entry_point_name;
|
let entry_point_name = &self.entry_point_name;
|
||||||
let body = quote! {
|
let body = quote! {
|
||||||
{
|
{
|
||||||
#wgpu_executor.shader_runtime.run_per_pixel_adjust(&::wgpu_executor::shader_runtime::per_pixel_adjust_runtime::Shaders {
|
#executor.shader_runtime.run_per_pixel_adjust(&::wgpu_executor::shader_runtime::per_pixel_adjust_runtime::Shaders {
|
||||||
wgsl_shader: crate::WGSL_SHADER,
|
wgsl_shader: crate::WGSL_SHADER,
|
||||||
fragment_shader_name: super::#entry_point_name,
|
fragment_shader_name: super::#entry_point_name,
|
||||||
has_uniform: #has_uniform,
|
has_uniform: #has_uniform,
|
||||||
@@ -300,11 +303,10 @@ impl PerPixelAdjustCodegen<'_> {
|
|||||||
is_async: true,
|
is_async: true,
|
||||||
fields,
|
fields,
|
||||||
body,
|
body,
|
||||||
crate_name: self.parsed.crate_name.clone(),
|
|
||||||
description: "".to_string(),
|
description: "".to_string(),
|
||||||
};
|
};
|
||||||
parsed_node_fn.replace_impl_trait_in_input();
|
parsed_node_fn.replace_impl_trait_in_input();
|
||||||
let gpu_node_impl = crate::codegen::generate_node_code(&parsed_node_fn)?;
|
let gpu_node_impl = crate::codegen::generate_node_code(self.crate_ident, &parsed_node_fn)?;
|
||||||
|
|
||||||
// wrap node in `mod #gpu_node_mod`
|
// wrap node in `mod #gpu_node_mod`
|
||||||
let shader_node_mod = &self.shader_node_mod;
|
let shader_node_mod = &self.shader_node_mod;
|
||||||
@@ -312,7 +314,7 @@ impl PerPixelAdjustCodegen<'_> {
|
|||||||
#[cfg(feature = #SHADER_NODES_FEATURE_GATE)]
|
#[cfg(feature = #SHADER_NODES_FEATURE_GATE)]
|
||||||
mod #shader_node_mod {
|
mod #shader_node_mod {
|
||||||
use super::*;
|
use super::*;
|
||||||
use wgpu_executor::WgpuExecutor;
|
use #wgpu_executor::WgpuExecutor;
|
||||||
|
|
||||||
#gpu_node_impl
|
#gpu_node_impl
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user