Skip to content

Commit 3179f27

Browse files
committed
WIP5
1 parent db6fb8e commit 3179f27

File tree

5 files changed

+40
-32
lines changed

5 files changed

+40
-32
lines changed

node-graph/node-macro/src/codegen.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,12 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
295295

296296
let cfg = crate::shader_nodes::modify_cfg(&attributes);
297297
let node_input_accessor = generate_node_input_references(parsed, fn_generics, &field_idents, &graphene_core, &identifier, &cfg);
298-
let shader_entry_point = attributes.shader_node.as_ref().map(|n| n.codegen_shader_entry_point(parsed)).unwrap_or(Ok(TokenStream::new()))?;
298+
let (shader_entry_point, shader_gpu_node) = attributes
299+
.shader_node
300+
.as_ref()
301+
.map::<syn::Result<_>, _>(|n| Ok((n.codegen_shader_entry_point(parsed)?, n.codegen_gpu_node(parsed)?)))
302+
.unwrap_or(Ok((TokenStream::new(), TokenStream::new())))?;
303+
299304
Ok(quote! {
300305
/// Underlying implementation for [#struct_name]
301306
#[inline]
@@ -386,6 +391,8 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
386391
}
387392

388393
#shader_entry_point
394+
395+
#shader_gpu_node
389396
})
390397
}
391398

node-graph/node-macro/src/parsing.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,14 +604,14 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
604604
ty,
605605
value_source,
606606
implementations,
607+
gpu_image,
607608
}),
608609
name,
609610
description,
610611
widget_override,
611612
number_display_decimal_places,
612613
number_step,
613614
unit,
614-
gpu_image,
615615
})
616616
}
617617
}

node-graph/node-macro/src/shader_nodes/per_pixel_adjust.rs

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedNodeFn};
1+
use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedFieldType, ParsedNodeFn, RegularParsedField};
22
use crate::shader_nodes::CodegenShaderEntryPoint;
33
use convert_case::{Case, Casing};
44
use proc_macro2::{Ident, TokenStream};
@@ -27,20 +27,23 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
2727
let params = parsed
2828
.fields
2929
.iter()
30-
.map(|f| match f {
31-
ParsedField::Node { pat_ident, .. } => Err(syn::Error::new_spanned(pat_ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics")),
32-
ParsedField::Regular { gpu_image: false, pat_ident, ty, .. } => Ok(Param {
33-
ident: Cow::Borrowed(&pat_ident.ident),
34-
ty: Cow::Owned(ty.to_token_stream()),
35-
param_type: ParamType::Uniform,
36-
}),
37-
ParsedField::Regular { gpu_image: true, pat_ident, .. } => {
38-
binding_cnt += 1;
39-
Ok(Param {
40-
ident: Cow::Owned(format_ident!("image_{}", &pat_ident.ident)),
41-
ty: Cow::Borrowed(&spirv_image_ty),
42-
param_type: ParamType::Image { binding: binding_cnt },
43-
})
30+
.map(|f| {
31+
let ident = &f.pat_ident;
32+
match &f.ty {
33+
ParsedFieldType::Node { .. } => Err(syn::Error::new_spanned(ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics")),
34+
ParsedFieldType::Regular(RegularParsedField { gpu_image: false, ty, .. }) => Ok(Param {
35+
ident: Cow::Borrowed(&ident.ident),
36+
ty: Cow::Owned(ty.to_token_stream()),
37+
param_type: ParamType::Uniform,
38+
}),
39+
ParsedFieldType::Regular(RegularParsedField { gpu_image: true, .. }) => {
40+
binding_cnt += 1;
41+
Ok(Param {
42+
ident: Cow::Owned(format_ident!("image_{}", &ident.ident)),
43+
ty: Cow::Borrowed(&spirv_image_ty),
44+
param_type: ParamType::Image { binding: binding_cnt },
45+
})
46+
}
4447
}
4548
})
4649
.collect::<syn::Result<Vec<_>>>()?;
@@ -104,13 +107,12 @@ impl CodegenShaderEntryPoint for PerPixelAdjust {
104107
let fields = parsed
105108
.fields
106109
.iter()
107-
.map(|f| match f {
108-
ParsedField::Regular { .. } => {
109-
let mut ret = f.clone();
110-
ret.gpu_image = false;
111-
Ok(ret)
112-
}
113-
ParsedField::Node { pat_ident, .. } => Err(syn::Error::new_spanned(pat_ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics")),
110+
.map(|f| match &f.ty {
111+
ParsedFieldType::Regular(reg) => Ok(ParsedField {
112+
ty: ParsedFieldType::Regular(RegularParsedField { gpu_image: false, ..reg.clone() }),
113+
..f.clone()
114+
}),
115+
ParsedFieldType::Node { .. } => Err(syn::Error::new_spanned(&f.pat_ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics")),
114116
})
115117
.collect::<syn::Result<_>>()?;
116118
let body = quote! {};

node-graph/wgpu-executor/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
mod context;
2-
mod shader_runtime;
2+
pub mod shader_runtime;
33
pub mod texture_upload;
44

55
use anyhow::Result;

node-graph/wgpu-executor/src/shader_runtime/per_pixel_adjust_runtime.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ impl PerPixelAdjustGraphicsPipeline {
9090

9191
pub fn run(&self, context: &Context, input: Table<Raster<GPU>>) -> Table<Raster<GPU>> {
9292
let device = &context.device;
93-
let name = &self.name;
93+
let name = self.name.as_str();
9494

9595
let mut cmd = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Some("gpu_invert") });
9696
let out = input
@@ -99,20 +99,19 @@ impl PerPixelAdjustGraphicsPipeline {
9999
let tex_in = &instance.element.texture;
100100
let view_in = tex_in.create_view(&TextureViewDescriptor::default());
101101
let format = tex_in.format();
102-
let pipeline = self.get(format);
103102

104103
let bind_group = device.create_bind_group(&BindGroupDescriptor {
105-
label: Some(format!("{name} bind group")),
104+
label: Some(&format!("{name} bind group")),
106105
// `get_bind_group_layout` allocates unnecessary memory, we could create it manually to not do that
107-
layout: &pipeline.get_bind_group_layout(0),
106+
layout: &self.pipeline.get_bind_group_layout(0),
108107
entries: &[BindGroupEntry {
109108
binding: 0,
110109
resource: BindingResource::TextureView(&view_in),
111110
}],
112111
});
113112

114113
let tex_out = device.create_texture(&TextureDescriptor {
115-
label: Some(format!("{name} texture out")),
114+
label: Some(&format!("{name} texture out")),
116115
size: tex_in.size(),
117116
mip_level_count: 1,
118117
sample_count: 1,
@@ -124,7 +123,7 @@ impl PerPixelAdjustGraphicsPipeline {
124123

125124
let view_out = tex_out.create_view(&TextureViewDescriptor::default());
126125
let mut rp = cmd.begin_render_pass(&RenderPassDescriptor {
127-
label: Some(format!("{name} render pipeline")),
126+
label: Some(&format!("{name} render pipeline")),
128127
color_attachments: &[Some(RenderPassColorAttachment {
129128
view: &view_out,
130129
resolve_target: None,
@@ -138,7 +137,7 @@ impl PerPixelAdjustGraphicsPipeline {
138137
timestamp_writes: None,
139138
occlusion_query_set: None,
140139
});
141-
rp.set_pipeline(&pipeline);
140+
rp.set_pipeline(&self.pipeline);
142141
rp.set_bind_group(0, Some(&bind_group), &[]);
143142
rp.draw(0..3, 0..1);
144143

0 commit comments

Comments
 (0)