From 0704fa5df68c7b1bb978be549e9a630cd1f3a5aa Mon Sep 17 00:00:00 2001 From: Aitor Moreno Date: Mon, 7 Jul 2025 19:03:58 +0200 Subject: [PATCH] WIP --- .../public/wasm-playground/rects.html | 2 +- render-wasm/src/main.rs | 2 +- render-wasm/src/render.rs | 60 +++++++++---------- 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/frontend/resources/public/wasm-playground/rects.html b/frontend/resources/public/wasm-playground/rects.html index 9719e167f2..c2ffad96ab 100644 --- a/frontend/resources/public/wasm-playground/rects.html +++ b/frontend/resources/public/wasm-playground/rects.html @@ -71,7 +71,7 @@ setShapeChildren(children); performance.mark('render:begin'); - Module._render(Date.now(), false); + Module._render(performance.now(), true); performance.mark('render:end'); const { duration } = performance.measure('render', 'render:begin', 'render:end'); // alert(`render time: ${duration.toFixed(2)}ms`); diff --git a/render-wasm/src/main.rs b/render-wasm/src/main.rs index 2450773ede..86d2c75582 100644 --- a/render-wasm/src/main.rs +++ b/render-wasm/src/main.rs @@ -119,7 +119,7 @@ pub extern "C" fn set_canvas_background(raw_color: u32) { #[no_mangle] pub extern "C" fn render(_: i32, full: bool) { - with_state!(state, { + with_state_mut!(state, { state .start_render_loop(performance::get_time(), full) .expect("Error rendering"); diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index 203e53e81b..b0d617e1ca 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -70,7 +70,7 @@ impl PendingNodes { self.list.pop() } - pub fn prepare(&mut self, tree: &mut HashMap) { + pub fn prepare(&mut self, tree: &HashMap) { self.list.clear(); if self.list.capacity() < tree.len() { self.list.reserve(tree.len() - self.list.capacity()); @@ -810,15 +810,6 @@ impl RenderState { if self.render_in_progress { self.cancel_animation_frame(); self.render_request_id = Some(wapi::request_animation_frame!()); - } else { - if self.render_is_full { - // if let Some(next_tile) = self.pending_tiles.pop() { - // self.update_render_context(&next_tile); - emscripten::log!(emscripten::Log::Default, "whatever {}", self.pending_tiles.len()); - let tile_rect = self.get_current_tile_bounds(); - self.apply_render_to_final_canvas(tile_rect); - } - performance::end_measure!("render"); } } performance::end_measure!("process_animation_frame"); @@ -832,6 +823,20 @@ impl RenderState { && performance::get_time() - timestamp > MAX_BLOCKING_TIME_MS) } + #[inline] + pub fn render_current_tile_to_final_canvas(&mut self, is_empty: bool) { + let tile_rect = self.get_current_tile_bounds(); + if !is_empty { + self.apply_render_to_final_canvas(tile_rect); + } else { + self.surfaces.apply_mut(SurfaceId::Target as u32, |s| { + let mut paint = skia::Paint::default(); + paint.set_color(self.background_color); + s.canvas().draw_rect(tile_rect, &paint); + }); + } + } + #[inline] pub fn render_shape_enter(&mut self, element: &Shape, mask: bool) { // Masked groups needs two rendering passes, the first one rendering @@ -964,7 +969,7 @@ impl RenderState { pub fn render_shape_tree_full( &mut self, - tree: &mut HashMap, + tree: &HashMap, modifiers: &HashMap, structure: &HashMap>, scale_content: &HashMap, @@ -991,13 +996,19 @@ impl RenderState { } debug::render_wasm_label(self); + while let Some(next_tile) = self.pending_tiles.pop() { + emscripten::log!(emscripten::Log::Default, "next_tile {} {}", next_tile.0, next_tile.1); + self.update_render_context(&next_tile); + self.render_current_tile_to_final_canvas(false); + } emscripten::log!(emscripten::Log::Default, "render_shape_tree_full:end"); + Ok((is_empty, should_stop_rendering)) } pub fn render_shape_tree_full_uncached_shape_tile( &mut self, - element: &mut Shape, + element: &&mut Shape, node_render_state: &NodeRenderState, tile: &tiles::Tile, modifiers: &HashMap, @@ -1034,7 +1045,7 @@ impl RenderState { pub fn render_shape_tree_full_uncached_shape_tiles( &mut self, - element: &mut Shape, + element: &&mut Shape, node_render_state: &NodeRenderState, tiles: &HashSet, modifiers: &HashMap, @@ -1062,7 +1073,7 @@ impl RenderState { pub fn render_shape_tree_full_uncached( &mut self, - tree: &mut HashMap, + tree: &HashMap, modifiers: &HashMap, structure: &HashMap>, scale_content: &HashMap, @@ -1079,14 +1090,14 @@ impl RenderState { ); let NodeRenderState { id: node_id, - visited_children: visited_children, + visited_children, clip_bounds: _clip_bounds, visited_mask: _visited_mask, mask, } = node_render_state; is_empty = false; - let element = tree.get_mut(&node_id).ok_or( + let element = tree.get(&node_id).ok_or( "Error: Element with root_id {node_render_state.id} not found in the tree." .to_string(), )?; @@ -1145,7 +1156,7 @@ impl RenderState { let children_clip_bounds = node_render_state.get_children_clip_bounds(element, modifiers.get(&element.id)); - let mut children_ids = modified_children_ids(element, structure.get(&element.id), false); + let mut children_ids = element.modified_children_ids(structure.get(&element.id), false); // Z-index ordering on Layouts if element.has_layout() { @@ -1329,16 +1340,7 @@ impl RenderState { return Ok(()); } performance::end_measure!("render_shape_tree::uncached"); - let tile_rect = self.get_current_tile_bounds(); - if !is_empty { - self.apply_render_to_final_canvas(tile_rect); - } else { - self.surfaces.apply_mut(SurfaceId::Target as u32, |s| { - let mut paint = skia::Paint::default(); - paint.set_color(self.background_color); - s.canvas().draw_rect(tile_rect, &paint); - }); - } + self.render_current_tile_to_final_canvas(is_empty); } } @@ -1492,10 +1494,6 @@ impl RenderState { self.viewbox.zoom() * self.options.dpr() } - pub fn get_scale_mut(&mut self) -> f32 { - self.viewbox.zoom() * self.options.dpr() - } - pub fn get_cached_scale(&self) -> f32 { self.cached_viewbox.zoom() * self.options.dpr() }