summaryrefslogtreecommitdiff
path: root/rust/wasm/src/gpu.rs
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-19 07:42:52 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-19 07:42:52 +0200
commit729d10592f4e802f91c555c309ff3ba4b119f843 (patch)
treea547a6d1ba90ca9cc03f406e0160df0af987644d /rust/wasm/src/gpu.rs
parent9da365bc01fc54f6d3f0ca9c3212eee4c0cee7cd (diff)
downloadopencut-729d10592f4e802f91c555c309ff3ba4b119f843.tar.gz
fix: WebGL frame rendering and opencut-wasm 0.2.8
Diffstat (limited to 'rust/wasm/src/gpu.rs')
-rw-r--r--rust/wasm/src/gpu.rs20
1 files changed, 19 insertions, 1 deletions
diff --git a/rust/wasm/src/gpu.rs b/rust/wasm/src/gpu.rs
index 4e65978c..52c051f0 100644
--- a/rust/wasm/src/gpu.rs
+++ b/rust/wasm/src/gpu.rs
@@ -19,9 +19,27 @@ thread_local! {
static GPU_RUNTIME: RefCell<Option<GpuRuntime>> = const { RefCell::new(None) };
}
+fn set_panic_hook() {
+ static SET_HOOK: std::sync::Once = std::sync::Once::new();
+ SET_HOOK.call_once(|| {
+ std::panic::set_hook(Box::new(|info| {
+ // Store the full panic message in window.__wasmPanic so the JS catch block
+ // can surface it instead of the opaque "Unreachable" WASM trap message.
+ if let Some(window) = web_sys::window() {
+ let _ = Reflect::set(
+ &window,
+ &JsValue::from_str("__wasmPanic"),
+ &JsValue::from_str(&info.to_string()),
+ );
+ }
+ console_error_panic_hook::hook(info);
+ }));
+ });
+}
+
#[wasm_bindgen(js_name = initializeGpu)]
pub async fn initialize_gpu() -> Result<(), JsValue> {
- console_error_panic_hook::set_once();
+ set_panic_hook();
if GPU_RUNTIME.with(|runtime| runtime.borrow().is_some()) {
return Ok(());