fix: prefer webgl for devices with webgpu and no float32-blendable feature flag #1899 (#1933)
Co-authored-by: Tony <32993852+0xREDACTED@users.noreply.github.com>
| | |
| | | "@myriaddreamin/rehype-typst": "^0.5.4", |
| | | "@napi-rs/simple-git": "0.1.19", |
| | | "@tweenjs/tween.js": "^25.0.0", |
| | | "@webgpu/types": "^0.1.60", |
| | | "ansi-truncate": "^1.2.0", |
| | | "async-mutex": "^0.5.0", |
| | | "chalk": "^5.4.1", |
| | |
| | | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" |
| | | }, |
| | | "node_modules/@webgpu/types": { |
| | | "version": "0.1.44", |
| | | "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.44.tgz", |
| | | "integrity": "sha512-JDpYJN5E/asw84LTYhKyvPpxGnD+bAKPtpW9Ilurf7cZpxaTbxkQcGwOd7jgB9BPBrTYQ+32ufo4HiuomTjHNQ==", |
| | | "version": "0.1.60", |
| | | "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.60.tgz", |
| | | "integrity": "sha512-8B/tdfRFKdrnejqmvq95ogp8tf52oZ51p3f4QD5m5Paey/qlX4Rhhy5Y8tgFMi7Ms70HzcMMw3EQjH/jdhTwlA==", |
| | | "license": "BSD-3-Clause" |
| | | }, |
| | | "node_modules/@xmldom/xmldom": { |
| | |
| | | "@myriaddreamin/rehype-typst": "^0.5.4", |
| | | "@napi-rs/simple-git": "0.1.19", |
| | | "@tweenjs/tween.js": "^25.0.0", |
| | | "@webgpu/types": "^0.1.60", |
| | | "ansi-truncate": "^1.2.0", |
| | | "async-mutex": "^0.5.0", |
| | | "chalk": "^5.4.1", |
| | |
| | | stop: () => void |
| | | } |
| | | |
| | | async function determineGraphicsAPI(): Promise<"webgpu" | "webgl"> { |
| | | const adapter = await navigator.gpu?.requestAdapter().catch(() => null) |
| | | if (!adapter) { |
| | | return "webgl" |
| | | } |
| | | // Devices with WebGPU but no float32-blendable feature fail to render the graph |
| | | return adapter.features.has("float32-blendable") ? "webgpu" : "webgl" |
| | | } |
| | | |
| | | async function renderGraph(graph: HTMLElement, fullSlug: FullSlug) { |
| | | const slug = simplifySlug(fullSlug) |
| | | const visited = getVisited() |
| | |
| | | tweens.forEach((tween) => tween.stop()) |
| | | tweens.clear() |
| | | |
| | | const pixiPreference = await determineGraphicsAPI() |
| | | const app = new Application() |
| | | await app.init({ |
| | | width, |
| | |
| | | autoStart: false, |
| | | autoDensity: true, |
| | | backgroundAlpha: 0, |
| | | preference: "webgpu", |
| | | preference: pixiPreference, |
| | | resolution: window.devicePixelRatio, |
| | | eventMode: "static", |
| | | }) |