node-macro: add CrateIdent struct containing resolved crate paths

This commit is contained in:
firestar99
2025-09-05 00:23:33 +02:00
parent 69f9ef30cc
commit b1a5ab17c8
10 changed files with 86 additions and 50 deletions
@@ -1,7 +1,7 @@
use crate::crate_ident::CrateIdent;
use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedFieldType, ParsedNodeFn, RegularParsedField};
use crate::shader_nodes::{SHADER_NODES_FEATURE_GATE, ShaderCodegen, ShaderNodeType, ShaderTokens};
use convert_case::{Case, Casing};
use proc_macro_crate::FoundCrate;
use proc_macro2::{Ident, TokenStream};
use quote::{ToTokens, format_ident, quote};
use std::borrow::Cow;
@@ -19,7 +19,7 @@ impl Parse 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 mut params;
@@ -74,6 +74,7 @@ impl ShaderCodegen for PerPixelAdjust {
let shader_node_mod = format_ident!("{}_shader_node", fn_name);
let codegen = PerPixelAdjustCodegen {
crate_ident,
parsed,
params,
has_uniform,
@@ -93,6 +94,7 @@ impl ShaderCodegen for PerPixelAdjust {
}
pub struct PerPixelAdjustCodegen<'a> {
crate_ident: &'a CrateIdent,
parsed: &'a ParsedNodeFn,
params: Vec<Param<'a>>,
has_uniform: bool,
@@ -107,6 +109,9 @@ pub struct PerPixelAdjustCodegen<'a> {
impl PerPixelAdjustCodegen<'_> {
fn codegen_shader_entry_point(&self) -> syn::Result<TokenStream> {
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
.params
.iter()
@@ -139,16 +144,16 @@ impl PerPixelAdjustCodegen<'_> {
Ok(quote! {
pub mod #entry_point_mod {
use super::*;
use graphene_core_shaders::color::Color;
use spirv_std::spirv;
use spirv_std::glam::{Vec4, Vec4Swizzles};
use spirv_std::image::{Image2d, ImageWithMethods};
use spirv_std::image::sample_with::lod;
use #gcore_shaders::color::Color;
use #reexport::glam::{Vec4, Vec4Swizzles};
use #reexport::spirv_std::spirv;
use #reexport::spirv_std::image::{Image2d, ImageWithMethods};
use #reexport::spirv_std::image::sample_with::lod;
pub const #entry_point_name: &str = core::concat!(core::module_path!(), "::entry_point");
#[repr(C)]
#[derive(Copy, Clone, bytemuck::NoUninit)]
#[derive(Copy, Clone, #reexport::bytemuck::NoUninit)]
pub struct #uniform_struct_ident {
#(pub #uniform_members),*
}
@@ -169,10 +174,8 @@ impl PerPixelAdjustCodegen<'_> {
}
fn codegen_gpu_node(&self) -> syn::Result<TokenStream> {
let gcore = match &self.parsed.crate_name {
FoundCrate::Itself => format_ident!("crate"),
FoundCrate::Name(name) => format_ident!("{name}"),
};
let gcore = self.crate_ident.gcore()?;
let wgpu_executor = self.crate_ident.wgpu_executor()?;
// adapt fields for gpu node
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<_>>>()?;
// insert wgpu_executor field
let wgpu_executor = format_ident!("__wgpu_executor");
let executor = format_ident!("__wgpu_executor");
fields.push(ParsedField {
pat_ident: PatIdent {
attrs: vec![],
by_ref: None,
mutability: None,
ident: parse_quote!(#wgpu_executor),
ident: parse_quote!(#executor),
subpat: None,
},
name: None,
@@ -271,7 +274,7 @@ impl PerPixelAdjustCodegen<'_> {
let entry_point_name = &self.entry_point_name;
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,
fragment_shader_name: super::#entry_point_name,
has_uniform: #has_uniform,
@@ -300,11 +303,10 @@ impl PerPixelAdjustCodegen<'_> {
is_async: true,
fields,
body,
crate_name: self.parsed.crate_name.clone(),
description: "".to_string(),
};
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`
let shader_node_mod = &self.shader_node_mod;
@@ -312,7 +314,7 @@ impl PerPixelAdjustCodegen<'_> {
#[cfg(feature = #SHADER_NODES_FEATURE_GATE)]
mod #shader_node_mod {
use super::*;
use wgpu_executor::WgpuExecutor;
use #wgpu_executor::WgpuExecutor;
#gpu_node_impl
}