mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-20 11:28:30 +08:00
Extract pipelines from WgpuExecutor into scope-provided pipeline nodes (#4210)
* Implement generic pipeline caching * Fix WIP * Fix * Fix * Fix * Fix bench * Migrations * Review
This commit is contained in:
@@ -1,46 +1,59 @@
|
||||
mod background; // TODO: Think about where to place this. Likely inlined in the node. Requires refactor of wgpu pipline usage.
|
||||
mod context;
|
||||
mod resample;
|
||||
mod pipeline;
|
||||
pub mod shader_runtime;
|
||||
mod texture_cache;
|
||||
pub mod texture_conversion;
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::background::BackgroundCompositor;
|
||||
use crate::resample::Resampler;
|
||||
use crate::shader_runtime::ShaderRuntime;
|
||||
use crate::texture_cache::TextureCache;
|
||||
use anyhow::Result;
|
||||
use core_types::Color;
|
||||
use core_types::color::SRGBA8;
|
||||
use futures::lock::Mutex;
|
||||
use glam::{Affine2, UVec2};
|
||||
use glam::UVec2;
|
||||
use graphene_application_io::{ApplicationIo, EditorApi};
|
||||
use vello::{AaConfig, AaSupport, RenderParams, Renderer, RendererOptions, Scene};
|
||||
use wgpu::{Origin3d, TextureAspect};
|
||||
|
||||
pub use context::Context as WgpuContext;
|
||||
pub use context::ContextBuilder as WgpuContextBuilder;
|
||||
pub use pipeline::AsyncPipeline as AsyncWgpuPipeline;
|
||||
pub use pipeline::Pipeline as WgpuPipeline;
|
||||
pub use pipeline::PipelineCache as WgpuPipelineCache;
|
||||
pub use rendering::RenderContext;
|
||||
pub use wgpu::Backends as WgpuBackends;
|
||||
pub use wgpu::Features as WgpuFeatures;
|
||||
|
||||
const TEXTURE_CACHE_SIZE: u64 = 256 * 1024 * 1024; // 256 MiB
|
||||
|
||||
#[derive(dyn_any::DynAny)]
|
||||
#[derive(dyn_any::DynAny, Clone)]
|
||||
pub struct WgpuExecutor {
|
||||
pub context: WgpuContext,
|
||||
inner: Arc<WgpuExecutorInner>,
|
||||
}
|
||||
|
||||
impl WgpuExecutor {
|
||||
pub fn context(&self) -> &WgpuContext {
|
||||
&self.inner.context
|
||||
}
|
||||
|
||||
pub fn shader_runtime(&self) -> &ShaderRuntime {
|
||||
&self.inner.shader_runtime
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(dyn_any::DynAny)]
|
||||
pub struct WgpuExecutorInner {
|
||||
context: WgpuContext,
|
||||
texture_cache: Mutex<TextureCache>,
|
||||
vello_renderer: Mutex<Renderer>,
|
||||
resampler: Resampler,
|
||||
background_compositor: BackgroundCompositor,
|
||||
pub shader_runtime: ShaderRuntime,
|
||||
shader_runtime: ShaderRuntime,
|
||||
}
|
||||
|
||||
impl std::fmt::Debug for WgpuExecutor {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.debug_struct("WgpuExecutor").field("context", &self.context).finish()
|
||||
f.debug_struct("WgpuExecutor").field("context", &self.context()).finish()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,7 +78,7 @@ impl WgpuExecutor {
|
||||
};
|
||||
|
||||
{
|
||||
let mut renderer = self.vello_renderer.lock().await;
|
||||
let mut renderer = self.inner.vello_renderer.lock().await;
|
||||
for (image_brush, texture) in context.resource_overrides.iter() {
|
||||
let texture_view = wgpu::TexelCopyTextureInfoBase {
|
||||
texture: texture.clone(),
|
||||
@@ -75,7 +88,7 @@ impl WgpuExecutor {
|
||||
};
|
||||
renderer.override_image(&image_brush.image, Some(texture_view));
|
||||
}
|
||||
renderer.render_to_texture(&self.context.device, &self.context.queue, scene, &texture_view, &render_params)?;
|
||||
renderer.render_to_texture(&self.context().device, &self.context().queue, scene, &texture_view, &render_params)?;
|
||||
for (image_brush, _) in context.resource_overrides.iter() {
|
||||
renderer.override_image(&image_brush.image, None);
|
||||
}
|
||||
@@ -84,21 +97,12 @@ impl WgpuExecutor {
|
||||
Ok(texture)
|
||||
}
|
||||
|
||||
pub async fn resample_texture(&self, source: &wgpu::Texture, size: UVec2, transform: &glam::DAffine2) -> Arc<wgpu::Texture> {
|
||||
let out = self.request_texture(size).await;
|
||||
self.resampler.resample(&self.context, source, transform, &out);
|
||||
out
|
||||
}
|
||||
|
||||
pub async fn composite_background(&self, foreground: &wgpu::Texture, backgrounds: &[rendering::Background], document_to_screen: Affine2, zoom: f32) -> Arc<wgpu::Texture> {
|
||||
let size = foreground.size();
|
||||
let output = self.request_texture(UVec2::new(size.width, size.height)).await;
|
||||
self.background_compositor.composite(&self.context, foreground, &output, backgrounds, document_to_screen, zoom);
|
||||
output
|
||||
pub fn pipeline_init<P: WgpuPipeline>(&self, pipeline: &WgpuPipelineCache) {
|
||||
pipeline.init::<P>(self);
|
||||
}
|
||||
|
||||
pub async fn request_texture(&self, size: UVec2) -> Arc<wgpu::Texture> {
|
||||
self.texture_cache.lock().await.request_texture(&self.context.device, size)
|
||||
self.inner.texture_cache.lock().await.request_texture(&self.context().device, size)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,17 +126,15 @@ impl WgpuExecutor {
|
||||
|
||||
let texture_cache = TextureCache::new(TEXTURE_CACHE_SIZE);
|
||||
|
||||
let resampler = Resampler::new(&context.device);
|
||||
let background_compositor = BackgroundCompositor::new(&context.device);
|
||||
let shader_runtime = ShaderRuntime::new(&context);
|
||||
|
||||
Some(Self {
|
||||
context,
|
||||
texture_cache: texture_cache.into(),
|
||||
vello_renderer: vello_renderer.into(),
|
||||
resampler,
|
||||
background_compositor,
|
||||
shader_runtime,
|
||||
inner: Arc::new(WgpuExecutorInner {
|
||||
context,
|
||||
texture_cache: texture_cache.into(),
|
||||
vello_renderer: vello_renderer.into(),
|
||||
shader_runtime,
|
||||
}),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user