mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-08-27 08:24:04 +00:00
shader-rt: initial
This commit is contained in:
parent
236dbf8f2b
commit
5a34d62048
10 changed files with 260 additions and 7 deletions
|
@ -295,7 +295,12 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
|||
|
||||
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 shader_entry_point = attributes.shader_node.as_ref().map(|n| n.codegen_shader_entry_point(parsed)).unwrap_or(Ok(TokenStream::new()))?;
|
||||
let (shader_entry_point, shader_gpu_node) = attributes
|
||||
.shader_node
|
||||
.as_ref()
|
||||
.map::<syn::Result<_>, _>(|n| Ok((n.codegen_shader_entry_point(parsed)?, n.codegen_gpu_node(parsed)?)))
|
||||
.unwrap_or(Ok((TokenStream::new(), TokenStream::new())))?;
|
||||
|
||||
Ok(quote! {
|
||||
/// Underlying implementation for [#struct_name]
|
||||
#[inline]
|
||||
|
@ -387,6 +392,8 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
|||
}
|
||||
|
||||
#shader_entry_point
|
||||
|
||||
#shader_gpu_node
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ pub(crate) struct ParsedNodeFn {
|
|||
pub(crate) description: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
#[derive(Debug, Default, Clone)]
|
||||
pub(crate) struct NodeFnAttributes {
|
||||
pub(crate) category: Option<LitStr>,
|
||||
pub(crate) display_name: Option<LitStr>,
|
||||
|
|
|
@ -19,7 +19,7 @@ pub fn modify_cfg(attributes: &NodeFnAttributes) -> TokenStream {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, VariantNames)]
|
||||
#[derive(Debug, Clone, VariantNames)]
|
||||
pub(crate) enum ShaderNodeType {
|
||||
PerPixelAdjust(PerPixelAdjust),
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ impl Parse for ShaderNodeType {
|
|||
|
||||
pub trait CodegenShaderEntryPoint {
|
||||
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream>;
|
||||
fn codegen_gpu_node(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream>;
|
||||
}
|
||||
|
||||
impl CodegenShaderEntryPoint for ShaderNodeType {
|
||||
|
@ -48,4 +49,10 @@ impl CodegenShaderEntryPoint for ShaderNodeType {
|
|||
ShaderNodeType::PerPixelAdjust(x) => x.codegen_shader_entry_point(parsed),
|
||||
}
|
||||
}
|
||||
|
||||
fn codegen_gpu_node(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
|
||||
match self {
|
||||
ShaderNodeType::PerPixelAdjust(x) => x.codegen_gpu_node(parsed),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
use crate::parsing::{ParsedFieldType, ParsedNodeFn, RegularParsedField};
|
||||
use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedFieldType, ParsedNodeFn, RegularParsedField};
|
||||
use crate::shader_nodes::CodegenShaderEntryPoint;
|
||||
use convert_case::{Case, Casing};
|
||||
use proc_macro2::{Ident, TokenStream};
|
||||
use quote::{ToTokens, format_ident, quote};
|
||||
use std::borrow::Cow;
|
||||
use syn::parse::{Parse, ParseStream};
|
||||
use syn::{Path, Type, TypePath};
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct PerPixelAdjust {}
|
||||
|
||||
impl Parse for PerPixelAdjust {
|
||||
|
@ -17,7 +19,7 @@ impl Parse for PerPixelAdjust {
|
|||
impl CodegenShaderEntryPoint for PerPixelAdjust {
|
||||
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
|
||||
let fn_name = &parsed.fn_name;
|
||||
let gpu_mod = format_ident!("{}_gpu", parsed.fn_name);
|
||||
let gpu_mod = format_ident!("{}_gpu_entry_point", parsed.fn_name);
|
||||
let spirv_image_ty = quote!(Image2d);
|
||||
|
||||
// bindings for images start at 1
|
||||
|
@ -96,6 +98,52 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
|
|||
}
|
||||
})
|
||||
}
|
||||
|
||||
fn codegen_gpu_node(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
|
||||
let fn_name = format_ident!("{}_gpu", parsed.fn_name);
|
||||
let struct_name = format_ident!("{}", fn_name.to_string().to_case(Case::Pascal));
|
||||
let mod_name = fn_name.clone();
|
||||
|
||||
let fields = parsed
|
||||
.fields
|
||||
.iter()
|
||||
.map(|f| match &f.ty {
|
||||
ParsedFieldType::Regular(reg) => Ok(ParsedField {
|
||||
ty: ParsedFieldType::Regular(RegularParsedField { gpu_image: false, ..reg.clone() }),
|
||||
..f.clone()
|
||||
}),
|
||||
ParsedFieldType::Node { .. } => Err(syn::Error::new_spanned(&f.pat_ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics")),
|
||||
})
|
||||
.collect::<syn::Result<_>>()?;
|
||||
let body = quote! {};
|
||||
|
||||
crate::codegen::generate_node_code(&ParsedNodeFn {
|
||||
vis: parsed.vis.clone(),
|
||||
attributes: NodeFnAttributes {
|
||||
shader_node: None,
|
||||
..parsed.attributes.clone()
|
||||
},
|
||||
fn_name,
|
||||
struct_name,
|
||||
mod_name,
|
||||
fn_generics: vec![],
|
||||
where_clause: None,
|
||||
input: Input {
|
||||
pat_ident: parsed.input.pat_ident.clone(),
|
||||
ty: Type::Path(TypePath {
|
||||
path: Path::from(format_ident!("Ctx")),
|
||||
qself: None,
|
||||
}),
|
||||
implementations: Default::default(),
|
||||
},
|
||||
output_type: parsed.output_type.clone(),
|
||||
is_async: true,
|
||||
fields,
|
||||
body,
|
||||
crate_name: parsed.crate_name.clone(),
|
||||
description: "".to_string(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
struct Param<'a> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue