From 9d7a8eaedacac2753990b4db90fd930324611d02 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 15 Jun 2026 10:44:18 +0200 Subject: [PATCH] :bug: Fix rendering artifacts from previous frames --- render-wasm/src/render.rs | 20 ++++++++------------ render-wasm/src/state.rs | 4 +++- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index b613ec5586..8d59339b65 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -907,6 +907,14 @@ impl RenderState { pub fn reset_canvas(&mut self) { self.surfaces.reset(self.background_color); + self.surfaces.clear_backbuffer(self.background_color); + self.surfaces.clear_target(self.background_color); + } + + /// Drop cached tile textures before a one-shot `render_sync_shape` render. + pub fn prepare_sync_shape_render(&mut self) { + self.surfaces.clear_tile_atlas(); + self.surfaces.invalidate_tile_cache(); } /// NOTE: @@ -1085,11 +1093,6 @@ impl RenderState { self.include_filter.is_some() } - fn reset_viewer_masked_surfaces(&mut self) { - self.surfaces.clear_backbuffer(self.background_color); - self.surfaces.clear_tile_atlas(); - } - /// True when the shape or any descendant is whitelisted. pub fn shape_visible_in_include_filter(&self, shape_id: &Uuid, tree: ShapesPoolRef) -> bool { let Some(ref include) = self.include_filter else { @@ -2192,13 +2195,6 @@ impl RenderState { self.interactive_target_seeded = false; } - // Viewer fixed-scroll passes reuse the same WASM context; `reset` does not - // clear Backbuffer, so pass 2 would otherwise keep pass-1 pixels in regions - // that render no shapes for the current mask. Target is cleared in present_frame. - if self.viewer_masked_pass() { - self.reset_viewer_masked_surfaces(); - } - let surface_ids = SurfaceId::Strokes as u32 | SurfaceId::Fills as u32 | SurfaceId::InnerShadows as u32 diff --git a/render-wasm/src/state.rs b/render-wasm/src/state.rs index 1995ffe288..9ca681841d 100644 --- a/render-wasm/src/state.rs +++ b/render-wasm/src/state.rs @@ -80,7 +80,9 @@ impl State { } pub fn render_sync_shape(&mut self, id: &Uuid, timestamp: i32) -> Result { - get_render_state().start_render_loop(Some(id), &self.shapes, timestamp, true) + let render_state = get_render_state(); + render_state.prepare_sync_shape_render(); + render_state.start_render_loop(Some(id), &self.shapes, timestamp, true) } pub fn render_shape_pixels(