diff --git a/node-graph/gcore/src/raster_types.rs b/node-graph/gcore/src/raster_types.rs index 7efae73fb8..75aed1b145 100644 --- a/node-graph/gcore/src/raster_types.rs +++ b/node-graph/gcore/src/raster_types.rs @@ -134,10 +134,11 @@ pub use gpu::GPU; mod gpu { use super::*; use crate::raster_types::__private::Sealed; + use std::sync::Arc; #[derive(Clone, Debug, PartialEq, Hash)] pub struct GPU { - pub texture: wgpu::Texture, + pub texture: Arc, } impl Sealed for Raster {} @@ -150,13 +151,32 @@ mod gpu { impl Raster { pub fn new_gpu(texture: wgpu::Texture) -> Self { - Self::new(GPU { texture }) + Self::new(GPU { + texture: Arc::new(InnerTexture(texture)), + }) } pub fn data(&self) -> &wgpu::Texture { &self.texture } } + + #[derive(Debug, PartialEq, Hash)] + pub struct InnerTexture(wgpu::Texture); + + impl Deref for InnerTexture { + type Target = wgpu::Texture; + + fn deref(&self) -> &Self::Target { + &self.0 + } + } + + impl Drop for InnerTexture { + fn drop(&mut self) { + self.0.destroy(); + } + } } #[cfg(not(feature = "wgpu"))] @@ -174,6 +194,10 @@ mod gpu { true } } + + impl Drop for GPU { + fn drop(&mut self) {} + } } mod gpu_common { diff --git a/node-graph/gsvg-renderer/src/renderer.rs b/node-graph/gsvg-renderer/src/renderer.rs index 3917a14c3c..c43ed49b52 100644 --- a/node-graph/gsvg-renderer/src/renderer.rs +++ b/node-graph/gsvg-renderer/src/renderer.rs @@ -153,7 +153,7 @@ impl Default for SvgRender { #[derive(Clone, Debug, Default)] pub struct RenderContext { #[cfg(feature = "vello")] - pub resource_overrides: Vec<(peniko::Image, wgpu::Texture)>, + pub resource_overrides: Vec<(peniko::Image, Raster)>, } /// Static state used whilst rendering @@ -1326,7 +1326,7 @@ impl Render for Table> { .with_extend(peniko::Extend::Repeat); let image_transform = transform * *row.transform * DAffine2::from_scale(1. / DVec2::new(image.width as f64, image.height as f64)); scene.draw_image(&image, kurbo::Affine::new(image_transform.to_cols_array())); - context.resource_overrides.push((image, row.element.data().clone())); + context.resource_overrides.push((image, row.element.clone())); if layer { scene.pop_layer() diff --git a/node-graph/wgpu-executor/src/lib.rs b/node-graph/wgpu-executor/src/lib.rs index 0b42dd631e..34ffc5a3aa 100644 --- a/node-graph/wgpu-executor/src/lib.rs +++ b/node-graph/wgpu-executor/src/lib.rs @@ -140,7 +140,7 @@ impl WgpuExecutor { let mut renderer = self.vello_renderer.lock().await; for (image, texture) in context.resource_overrides.iter() { let texture_view = wgpu::TexelCopyTextureInfoBase { - texture: texture.clone(), + texture: wgpu::Texture::clone(&texture.texture), mip_level: 0, origin: Origin3d::ZERO, aspect: TextureAspect::All, diff --git a/node-graph/wgpu-executor/src/shader_runtime/per_pixel_adjust_runtime.rs b/node-graph/wgpu-executor/src/shader_runtime/per_pixel_adjust_runtime.rs index aa567a5b93..7ed4bb65cf 100644 --- a/node-graph/wgpu-executor/src/shader_runtime/per_pixel_adjust_runtime.rs +++ b/node-graph/wgpu-executor/src/shader_runtime/per_pixel_adjust_runtime.rs @@ -230,7 +230,7 @@ impl PerPixelAdjustGraphicsPipeline { rp.draw(0..3, 0..1); TableRow { - element: Raster::new(GPU { texture: tex_out }), + element: Raster::new_gpu(tex_out), transform: *instance.transform, alpha_blending: *instance.alpha_blending, source_node_id: *instance.source_node_id,