From adf442036b244dfafea6287bf69c22f4eb133b79 Mon Sep 17 00:00:00 2001
From: anthops <32993852+anthops@users.noreply.github.com>
Date: Wed, 30 Apr 2025 16:49:41 +0000
Subject: [PATCH] fix(graph): provide proper workaround for pixijs webgpu issue #1899 (#1949)

---
 quartz/components/scripts/graph.inline.ts |   21 ++++++++++++++++++---
 1 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/quartz/components/scripts/graph.inline.ts b/quartz/components/scripts/graph.inline.ts
index 87e2958..9c8ec60 100644
--- a/quartz/components/scripts/graph.inline.ts
+++ b/quartz/components/scripts/graph.inline.ts
@@ -68,13 +68,28 @@
   stop: () => void
 }
 
+// workaround for pixijs webgpu issue: https://github.com/pixijs/pixijs/issues/11389
 async function determineGraphicsAPI(): Promise<"webgpu" | "webgl"> {
   const adapter = await navigator.gpu?.requestAdapter().catch(() => null)
-  if (!adapter) {
+  const device = adapter && (await adapter.requestDevice().catch(() => null))
+  if (!device) {
     return "webgl"
   }
-  // Devices with WebGPU but no float32-blendable feature fail to render the graph
-  return adapter.features.has("float32-blendable") ? "webgpu" : "webgl"
+
+  const canvas = document.createElement("canvas")
+  const gl =
+    (canvas.getContext("webgl2") as WebGL2RenderingContext | null) ??
+    (canvas.getContext("webgl") as WebGLRenderingContext | null)
+
+  // we have to return webgl so pixijs automatically falls back to canvas
+  if (!gl) {
+    return "webgl"
+  }
+
+  const webglMaxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS)
+  const webgpuMaxTextures = device.limits.maxSampledTexturesPerShaderStage
+
+  return webglMaxTextures === webgpuMaxTextures ? "webgpu" : "webgl"
 }
 
 async function renderGraph(graph: HTMLElement, fullSlug: FullSlug) {

--
Gitblit v1.10.0