From 89f882ecdabdae0ff044c7411130bfaae4f637ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elena=20Torr=C3=B3?= Date: Fri, 26 Jun 2026 10:59:22 +0200 Subject: [PATCH] :bug: Fix viewer rendering on Firefox+NVIDIA setup (#10385) --- frontend/src/app/main/render_viewer_wasm.cljs | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/frontend/src/app/main/render_viewer_wasm.cljs b/frontend/src/app/main/render_viewer_wasm.cljs index 9ae5d63994..45f7b83f73 100644 --- a/frontend/src/app/main/render_viewer_wasm.cljs +++ b/frontend/src/app/main/render_viewer_wasm.cljs @@ -8,6 +8,7 @@ "WASM offscreen rendering for the shared viewer (snapshot + fixed-scroll)." (:require [app.common.data.macros :as dm] + [app.common.exceptions :as ex] [app.render-wasm.api :as wasm.api] [app.render-wasm.wasm :as wasm] [app.util.dom :as dom] @@ -43,15 +44,31 @@ :dpr 1})) (defn- draw-bitmap! + "Blit the rendered OffscreenCanvas onto the visible 2D `canvas`. Firefox+NVIDIA + can't `drawImage` a managed OffscreenCanvas directly (yields transparent + pixels), but `drawImage` of an `ImageBitmap` works — so go through + `createImageBitmap` (GPU-side, correct orientation, no CPU readback)." [canvas os-canvas object-id vis-w vis-h finish] - (ts/raf - (fn [] - (let [ctx2d (.getContext canvas "2d")] - (.clearRect ctx2d 0 0 vis-w vis-h) - ;; Draw directly from OffscreenCanvas so it can be reused across passes. - (.drawImage ctx2d os-canvas 0 0 vis-w vis-h) - (dom/set-attribute! canvas "id" (str "screenshot-" object-id)) - (finish))))) + (-> (js/createImageBitmap os-canvas) + (p/then + (fn [bitmap] + (ts/raf + (fn [] + (let [ctx2d (.getContext canvas "2d")] + (.clearRect ctx2d 0 0 vis-w vis-h) + (.drawImage ctx2d bitmap 0 0 vis-w vis-h) + (.close bitmap) + (dom/set-attribute! canvas "id" (str "screenshot-" object-id)) + (finish)))))) + (p/catch + (fn [e] + (finish) + (ts/schedule + (fn [] + (ex/raise :type :wasm-error + :code :viewer-canvas-failed + :hint "Viewer canvas failed" + :cause e))))))) (defn- viewer-disable-wasm-ui-overlay! "Workspace WASM UI (rulers + rounded viewport frame) is composited in