| | |
| | | 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) |
| | | const device = adapter && (await adapter.requestDevice().catch(() => null)) |
| | | if (!device) { |
| | | return "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) { |
| | | 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: pixiPreference, |
| | | preference: "webgpu", |
| | | resolution: window.devicePixelRatio, |
| | | eventMode: "static", |
| | | }) |