diff --git a/frontend/src/app/render_wasm.cljs b/frontend/src/app/render_wasm.cljs index 8de936b2d7..0672c723a8 100644 --- a/frontend/src/app/render_wasm.cljs +++ b/frontend/src/app/render_wasm.cljs @@ -17,7 +17,10 @@ (defn initialize [enabled?] (if enabled? - (set! app.common.types.path/wasm:calc-bool-content wasm.api/calculate-bool) + (do + (set! app.common.types.path/wasm:calc-bool-content wasm.api/calculate-bool) + ;; Preload the WASM engine at boot so it's ready when a file opens. + (wasm.api/preload-module!)) (set! app.common.types.path/wasm:calc-bool-content nil)) (set! app.common.types.shape/wasm-enabled? enabled?) (set! app.common.types.shape/wasm-create-shape wasm.shape/create-shape)) diff --git a/frontend/src/app/render_wasm/api.cljs b/frontend/src/app/render_wasm/api.cljs index a7e03e627e..a6e5dc16c4 100644 --- a/frontend/src/app/render_wasm/api.cljs +++ b/frontend/src/app/render_wasm/api.cljs @@ -2555,4 +2555,10 @@ (p/resolved false))))) (p/resolved false)))) +(defn preload-module! + "Starts downloading + compiling the WASM engine now instead of on first + viewport mount. Idempotent: the `delay` caches its in-flight promise." + [] + @module) + diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index df284816f6..e984bf077d 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -2234,6 +2234,10 @@ impl RenderState { } else { self.reset_canvas(); self.interactive_target_seeded = false; + // Paint rulers/frame now so they survive the progressive frames + // instead of blanking until the first full `present_frame`. + ui::render(self, tree); + self.flush_and_submit(); } let surface_ids = SurfaceId::Strokes as u32