summaryrefslogtreecommitdiff
path: root/rust/crates/compositor/src
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-19 07:42:52 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-19 07:42:52 +0200
commit729d10592f4e802f91c555c309ff3ba4b119f843 (patch)
treea547a6d1ba90ca9cc03f406e0160df0af987644d /rust/crates/compositor/src
parent9da365bc01fc54f6d3f0ca9c3212eee4c0cee7cd (diff)
downloadopencut-729d10592f4e802f91c555c309ff3ba4b119f843.tar.gz
fix: WebGL frame rendering and opencut-wasm 0.2.8
Diffstat (limited to 'rust/crates/compositor/src')
-rw-r--r--rust/crates/compositor/src/compositor.rs53
-rw-r--r--rust/crates/compositor/src/shaders/layer.wgsl1
2 files changed, 54 insertions, 0 deletions
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<wgpu::Texture, CompositorError> {
+ 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,
diff --git a/rust/crates/compositor/src/shaders/layer.wgsl b/rust/crates/compositor/src/shaders/layer.wgsl
index 9e335687..61457d84 100644
--- a/rust/crates/compositor/src/shaders/layer.wgsl
+++ b/rust/crates/compositor/src/shaders/layer.wgsl
@@ -11,6 +11,7 @@ struct LayerUniforms {
opacity: f32,
flip_x: f32,
flip_y: f32,
+ _padding: vec2f,
}
@group(0) @binding(0) var source_texture: texture_2d<f32>;