From 729d10592f4e802f91c555c309ff3ba4b119f843 Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Sun, 19 Apr 2026 07:42:52 +0200 Subject: fix: WebGL frame rendering and opencut-wasm 0.2.8 --- rust/crates/compositor/src/compositor.rs | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'rust/crates/compositor/src/compositor.rs') diff --git a/rust/crates/compositor/src/compositor.rs b/rust/crates/compositor/src/compositor.rs index c0e6ec3b..84bcceae 100644 --- a/rust/crates/compositor/src/compositor.rs +++ b/rust/crates/compositor/src/compositor.rs @@ -288,6 +288,59 @@ impl Compositor { self.textures.remove(id); } + /// Composites all frame items into a texture and returns it. + /// Used on backends that cannot surface-render to an arbitrary canvas (e.g. WebGL). + pub fn render_frame_to_texture( + &mut self, + context: &GpuContext, + frame: &FrameDescriptor, + ) -> Result { + self.texture_pool.recycle_frame(); + let mut encoder = + context + .device() + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("compositor-frame-encoder"), + }); + let mut scene = self.create_cleared_texture( + context, + &mut encoder, + frame.width, + frame.height, + frame.clear.color, + ); + + for item in &frame.items { + match item { + FrameItemDescriptor::Layer(layer) => { + let layer_texture = self.render_layer(context, &mut encoder, frame, layer)?; + scene = self.blend_texture( + context, + &mut encoder, + &scene, + &layer_texture, + layer.blend_mode, + frame.width, + frame.height, + )?; + } + FrameItemDescriptor::SceneEffect { effect_pass_groups } => { + scene = self.apply_effect_groups( + context, + &mut encoder, + &scene, + frame.width, + frame.height, + effect_pass_groups, + )?; + } + } + } + + context.queue().submit([encoder.finish()]); + Ok(scene) + } + pub fn render_frame( &mut self, context: &GpuContext, -- cgit v1.3.1