From 304c44048f6d17c1eb1c1e4494449e5dd24e65a9 Mon Sep 17 00:00:00 2001 From: Aitor Moreno Date: Tue, 15 Apr 2025 15:45:28 +0200 Subject: [PATCH] :recycle: Refactor how rAF/cAF is handled (#6241) --- render-wasm/_build_env | 3 ++- render-wasm/src/js/wapi.js | 8 ++++++++ render-wasm/src/main.rs | 1 + render-wasm/src/render.rs | 33 ++++++--------------------------- render-wasm/src/wapi.rs | 28 ++++++++++++++++++++++++++++ 5 files changed, 45 insertions(+), 28 deletions(-) create mode 100644 render-wasm/src/js/wapi.js create mode 100644 render-wasm/src/wapi.rs diff --git a/render-wasm/_build_env b/render-wasm/_build_env index fe6b42b7da..9911613cc2 100644 --- a/render-wasm/_build_env +++ b/render-wasm/_build_env @@ -7,6 +7,7 @@ else fi EMCC_CFLAGS="--no-entry \ + --js-library src/js/wapi.js \ -sASSERTIONS=1 \ -sALLOW_TABLE_GROWTH=1 \ -sALLOW_MEMORY_GROWTH=1 \ @@ -33,7 +34,7 @@ else # -gseparate-dwarf # -gsplit-dwarf # -gsource-map - EMCC_CFLAGS="-g $EMCC_CFLAGS -sMALLOC=emmalloc-debug" + EMCC_CFLAGS="-g $EMCC_CFLAGS -sVERBOSE=1 -sMALLOC=emmalloc-debug" fi export EMCC_CFLAGS; diff --git a/render-wasm/src/js/wapi.js b/render-wasm/src/js/wapi.js new file mode 100644 index 0000000000..e732fdbe6d --- /dev/null +++ b/render-wasm/src/js/wapi.js @@ -0,0 +1,8 @@ +addToLibrary({ + wapi_requestAnimationFrame: function wapi_requestAnimationFrame() { + return window.requestAnimationFrame(Module._process_animation_frame); + }, + wapi_cancelAnimationFrame: function wapi_cancelAnimationFrame(frameId) { + return window.cancelAnimationFrame(frameId); + } +}); diff --git a/render-wasm/src/main.rs b/render-wasm/src/main.rs index 55b3ba70a4..2cc17367cd 100644 --- a/render-wasm/src/main.rs +++ b/render-wasm/src/main.rs @@ -12,6 +12,7 @@ mod state; mod utils; mod uuid; mod view; +mod wapi; mod wasm; use crate::mem::SerializableResult; diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index da08c37c67..4ca0c46847 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -4,9 +4,10 @@ use crate::uuid::Uuid; use std::collections::HashMap; use crate::performance; -use crate::view::Viewbox; #[cfg(target_arch = "wasm32")] -use crate::{run_script, run_script_int}; +use crate::run_script; +use crate::view::Viewbox; +use crate::wapi; mod blend; mod debug; @@ -433,7 +434,7 @@ impl RenderState { ) -> Result<(), String> { if self.render_in_progress { if let Some(frame_id) = self.render_request_id { - self.cancel_animation_frame(frame_id); + wapi::cancel_animation_frame!(frame_id); } } performance::begin_measure!("render"); @@ -491,28 +492,6 @@ impl RenderState { Ok(()) } - #[cfg(target_arch = "wasm32")] - pub fn request_animation_frame(&mut self) -> i32 { - #[cfg(feature = "profile-raf")] - performance::mark!("request_animation_frame"); - run_script_int!("requestAnimationFrame(_process_animation_frame)") - } - - #[cfg(not(target_arch = "wasm32"))] - pub fn request_animation_frame(&mut self) -> i32 { - 0 - } - - #[cfg(target_arch = "wasm32")] - pub fn cancel_animation_frame(&mut self, frame_id: i32) { - #[cfg(feature = "profile-raf")] - performance::mark!("cancel_animation_frame"); - run_script!(format!("cancelAnimationFrame({})", frame_id)) - } - - #[cfg(not(target_arch = "wasm32"))] - pub fn cancel_animation_frame(&mut self, _frame_id: i32) {} - pub fn process_animation_frame( &mut self, tree: &mut HashMap, @@ -526,9 +505,9 @@ impl RenderState { if self.render_in_progress { if let Some(frame_id) = self.render_request_id { - self.cancel_animation_frame(frame_id); + wapi::cancel_animation_frame!(frame_id); } - self.render_request_id = Some(self.request_animation_frame()); + self.render_request_id = Some(wapi::request_animation_frame!()); } else { performance::end_measure!("render"); } diff --git a/render-wasm/src/wapi.rs b/render-wasm/src/wapi.rs new file mode 100644 index 0000000000..ace2a2072a --- /dev/null +++ b/render-wasm/src/wapi.rs @@ -0,0 +1,28 @@ +#[macro_export] +macro_rules! request_animation_frame { + () => { + #[cfg(target_arch = "wasm32")] + { + extern "C" { + pub fn wapi_requestAnimationFrame() -> i32; + } + unsafe { wapi_requestAnimationFrame() } + } + }; +} + +#[macro_export] +macro_rules! cancel_animation_frame { + ($frame_id:expr) => { + #[cfg(target_arch = "wasm32")] + { + extern "C" { + pub fn wapi_cancelAnimationFrame(frame_id: i32); + } + unsafe { wapi_cancelAnimationFrame($frame_id) } + } + }; +} + +pub use cancel_animation_frame; +pub use request_animation_frame;