aigpu 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +85 -0
- package/bin/aigpu.js +15 -0
- package/client.d.ts +15 -0
- package/dist/agent-tools.d.ts +61 -0
- package/dist/agent-tools.d.ts.map +1 -0
- package/dist/agent-tools.js +107 -0
- package/dist/agent-tools.js.map +1 -0
- package/dist/agent.d.ts +56 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +243 -0
- package/dist/agent.js.map +1 -0
- package/dist/api-types.d.ts +56 -0
- package/dist/api-types.d.ts.map +1 -0
- package/dist/api-types.js +2 -0
- package/dist/api-types.js.map +1 -0
- package/dist/bind-cache.d.ts +19 -0
- package/dist/bind-cache.d.ts.map +1 -0
- package/dist/bind-cache.js +43 -0
- package/dist/bind-cache.js.map +1 -0
- package/dist/bundle.d.ts +30 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +127 -0
- package/dist/bundle.js.map +1 -0
- package/dist/claim-validation-encode.d.ts +14 -0
- package/dist/claim-validation-encode.d.ts.map +1 -0
- package/dist/claim-validation-encode.js +28 -0
- package/dist/claim-validation-encode.js.map +1 -0
- package/dist/claim-validation.d.ts +73 -0
- package/dist/claim-validation.d.ts.map +1 -0
- package/dist/claim-validation.js +135 -0
- package/dist/claim-validation.js.map +1 -0
- package/dist/cli/bin/aigpu.js +101 -0
- package/dist/cli/lib/check/run.js +153 -0
- package/dist/cli/lib/docs/commands/cat.js +12 -0
- package/dist/cli/lib/docs/commands/find.js +180 -0
- package/dist/cli/lib/docs/commands/grep.js +49 -0
- package/dist/cli/lib/docs/commands/ls.js +41 -0
- package/dist/cli/lib/docs/commands/path.js +12 -0
- package/dist/cli/lib/docs/commands/resolve.js +41 -0
- package/dist/cli/lib/docs/commands/shared.js +13 -0
- package/dist/cli/lib/docs/commands/symbols.js +25 -0
- package/dist/cli/lib/docs/errors.js +8 -0
- package/dist/cli/lib/docs/generate/check-drift.js +61 -0
- package/dist/cli/lib/docs/generate/cli.js +12 -0
- package/dist/cli/lib/docs/generate/generate.js +113 -0
- package/dist/cli/lib/docs/generate/manifest.js +218 -0
- package/dist/cli/lib/docs/generate/skill.js +150 -0
- package/dist/cli/lib/docs/help.js +21 -0
- package/dist/cli/lib/docs/index.js +62 -0
- package/dist/cli/lib/docs/model.js +7 -0
- package/dist/cli/lib/docs/run.js +24 -0
- package/dist/cli/lib/docs/service.js +119 -0
- package/dist/cli/lib/doctor/run.js +236 -0
- package/dist/cli/lib/examples/errors.js +13 -0
- package/dist/cli/lib/examples/hashing.js +9 -0
- package/dist/cli/lib/examples/help.js +13 -0
- package/dist/cli/lib/examples/local-source.js +142 -0
- package/dist/cli/lib/examples/paths.js +12 -0
- package/dist/cli/lib/examples/pull.js +58 -0
- package/dist/cli/lib/examples/run.js +71 -0
- package/dist/cli/lib/examples/search.js +6 -0
- package/dist/cli/lib/examples/service.js +118 -0
- package/dist/cli/lib/generated/docs-manifest.generated.js +4758 -0
- package/dist/cli/lib/install-dawn/run.js +24 -0
- package/dist/cli/lib/install-software-renderer/run.js +17 -0
- package/dist/cli/lib/mcp/http.js +93 -0
- package/dist/cli/lib/mcp/server.js +258 -0
- package/dist/cli/lib/mcp/stdio.js +34 -0
- package/dist/cli/lib/snapshot/png.js +62 -0
- package/dist/cli/lib/snapshot/render.js +22 -0
- package/dist/cli/lib/snapshot/run.js +79 -0
- package/dist/cli/lib/snapshot/shaders.js +11 -0
- package/dist/cli/package.json +4 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -0
- package/dist/clock.d.ts +26 -0
- package/dist/clock.d.ts.map +1 -0
- package/dist/clock.js +50 -0
- package/dist/clock.js.map +1 -0
- package/dist/compute.d.ts +41 -0
- package/dist/compute.d.ts.map +1 -0
- package/dist/compute.js +132 -0
- package/dist/compute.js.map +1 -0
- package/dist/core/render-bundle.d.ts +30 -0
- package/dist/core/render-bundle.d.ts.map +1 -0
- package/dist/core/render-bundle.js +39 -0
- package/dist/core/render-bundle.js.map +1 -0
- package/dist/core/storage-buffer.d.ts +81 -0
- package/dist/core/storage-buffer.d.ts.map +1 -0
- package/dist/core/storage-buffer.js +91 -0
- package/dist/core/storage-buffer.js.map +1 -0
- package/dist/core/structured-uniform.d.ts +33 -0
- package/dist/core/structured-uniform.d.ts.map +1 -0
- package/dist/core/structured-uniform.js +110 -0
- package/dist/core/structured-uniform.js.map +1 -0
- package/dist/core/uniform-pool-internals.d.ts +12 -0
- package/dist/core/uniform-pool-internals.d.ts.map +1 -0
- package/dist/core/uniform-pool-internals.js +24 -0
- package/dist/core/uniform-pool-internals.js.map +1 -0
- package/dist/core/uniform-pool-types.d.ts +22 -0
- package/dist/core/uniform-pool-types.d.ts.map +1 -0
- package/dist/core/uniform-pool-types.js +2 -0
- package/dist/core/uniform-pool-types.js.map +1 -0
- package/dist/core/uniform-pool.d.ts +22 -0
- package/dist/core/uniform-pool.d.ts.map +1 -0
- package/dist/core/uniform-pool.js +128 -0
- package/dist/core/uniform-pool.js.map +1 -0
- package/dist/core/uniform.d.ts +55 -0
- package/dist/core/uniform.d.ts.map +1 -0
- package/dist/core/uniform.js +64 -0
- package/dist/core/uniform.js.map +1 -0
- package/dist/core/wgsl-alignment.d.ts +24 -0
- package/dist/core/wgsl-alignment.d.ts.map +1 -0
- package/dist/core/wgsl-alignment.js +81 -0
- package/dist/core/wgsl-alignment.js.map +1 -0
- package/dist/core.d.ts +13 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +7 -0
- package/dist/core.js.map +1 -0
- package/dist/dom.d.ts +37 -0
- package/dist/dom.d.ts.map +1 -0
- package/dist/dom.js +81 -0
- package/dist/dom.js.map +1 -0
- package/dist/draw-protocols.d.ts +36 -0
- package/dist/draw-protocols.d.ts.map +1 -0
- package/dist/draw-protocols.js +10 -0
- package/dist/draw-protocols.js.map +1 -0
- package/dist/draw.d.ts +248 -0
- package/dist/draw.d.ts.map +1 -0
- package/dist/draw.js +890 -0
- package/dist/draw.js.map +1 -0
- package/dist/effect.d.ts +53 -0
- package/dist/effect.d.ts.map +1 -0
- package/dist/effect.js +75 -0
- package/dist/effect.js.map +1 -0
- package/dist/entry-metadata.d.ts +16 -0
- package/dist/entry-metadata.d.ts.map +1 -0
- package/dist/entry-metadata.js +27 -0
- package/dist/entry-metadata.js.map +1 -0
- package/dist/errors.d.ts +96 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +616 -0
- package/dist/errors.js.map +1 -0
- package/dist/frame-protocols.d.ts +107 -0
- package/dist/frame-protocols.d.ts.map +1 -0
- package/dist/frame-protocols.js +20 -0
- package/dist/frame-protocols.js.map +1 -0
- package/dist/frame-state.d.ts +32 -0
- package/dist/frame-state.d.ts.map +1 -0
- package/dist/frame-state.js +62 -0
- package/dist/frame-state.js.map +1 -0
- package/dist/frame.d.ts +127 -0
- package/dist/frame.d.ts.map +1 -0
- package/dist/frame.js +645 -0
- package/dist/frame.js.map +1 -0
- package/dist/group-claim.d.ts +9 -0
- package/dist/group-claim.d.ts.map +1 -0
- package/dist/group-claim.js +7 -0
- package/dist/group-claim.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/indirect.d.ts +39 -0
- package/dist/indirect.d.ts.map +1 -0
- package/dist/indirect.js +61 -0
- package/dist/indirect.js.map +1 -0
- package/dist/init-from-device.d.ts +11 -0
- package/dist/init-from-device.d.ts.map +1 -0
- package/dist/init-from-device.js +56 -0
- package/dist/init-from-device.js.map +1 -0
- package/dist/init.d.ts +12 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +7 -0
- package/dist/init.js.map +1 -0
- package/dist/kernel.d.ts +104 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +151 -0
- package/dist/kernel.js.map +1 -0
- package/dist/lifecycle.d.ts +10 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +21 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/live-kernel.d.ts +48 -0
- package/dist/live-kernel.d.ts.map +1 -0
- package/dist/live-kernel.js +67 -0
- package/dist/live-kernel.js.map +1 -0
- package/dist/mock.d.ts +42 -0
- package/dist/mock.d.ts.map +1 -0
- package/dist/mock.js +29 -0
- package/dist/mock.js.map +1 -0
- package/dist/node.d.ts +48 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +36 -0
- package/dist/node.js.map +1 -0
- package/dist/ping-pong.d.ts +19 -0
- package/dist/ping-pong.d.ts.map +1 -0
- package/dist/ping-pong.js +67 -0
- package/dist/ping-pong.js.map +1 -0
- package/dist/pipeline-store.d.ts +89 -0
- package/dist/pipeline-store.d.ts.map +1 -0
- package/dist/pipeline-store.js +366 -0
- package/dist/pipeline-store.js.map +1 -0
- package/dist/query-ring.d.ts +91 -0
- package/dist/query-ring.d.ts.map +1 -0
- package/dist/query-ring.js +178 -0
- package/dist/query-ring.js.map +1 -0
- package/dist/render-service.d.ts +23 -0
- package/dist/render-service.d.ts.map +1 -0
- package/dist/render-service.js +37 -0
- package/dist/render-service.js.map +1 -0
- package/dist/sampler.d.ts +19 -0
- package/dist/sampler.d.ts.map +1 -0
- package/dist/sampler.js +46 -0
- package/dist/sampler.js.map +1 -0
- package/dist/scene/camera.d.ts +91 -0
- package/dist/scene/camera.d.ts.map +1 -0
- package/dist/scene/camera.js +221 -0
- package/dist/scene/camera.js.map +1 -0
- package/dist/scene/geometries.d.ts +26 -0
- package/dist/scene/geometries.d.ts.map +1 -0
- package/dist/scene/geometries.js +26 -0
- package/dist/scene/geometries.js.map +1 -0
- package/dist/scene/geometry-descriptor.d.ts +120 -0
- package/dist/scene/geometry-descriptor.d.ts.map +1 -0
- package/dist/scene/geometry-descriptor.js +378 -0
- package/dist/scene/geometry-descriptor.js.map +1 -0
- package/dist/scene/geometry-recipe.d.ts +41 -0
- package/dist/scene/geometry-recipe.d.ts.map +1 -0
- package/dist/scene/geometry-recipe.js +40 -0
- package/dist/scene/geometry-recipe.js.map +1 -0
- package/dist/scene/geometry-src/camera-math.d.ts +6 -0
- package/dist/scene/geometry-src/camera-math.d.ts.map +1 -0
- package/dist/scene/geometry-src/camera-math.js +47 -0
- package/dist/scene/geometry-src/camera-math.js.map +1 -0
- package/dist/scene/geometry-src/camera.d.ts +10 -0
- package/dist/scene/geometry-src/camera.d.ts.map +1 -0
- package/dist/scene/geometry-src/camera.js +2 -0
- package/dist/scene/geometry-src/camera.js.map +1 -0
- package/dist/scene/geometry-src/capsule-data.d.ts +10 -0
- package/dist/scene/geometry-src/capsule-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/capsule-data.js +61 -0
- package/dist/scene/geometry-src/capsule-data.js.map +1 -0
- package/dist/scene/geometry-src/cone-data.d.ts +13 -0
- package/dist/scene/geometry-src/cone-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/cone-data.js +52 -0
- package/dist/scene/geometry-src/cone-data.js.map +1 -0
- package/dist/scene/geometry-src/cylinder-data.d.ts +14 -0
- package/dist/scene/geometry-src/cylinder-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/cylinder-data.js +58 -0
- package/dist/scene/geometry-src/cylinder-data.js.map +1 -0
- package/dist/scene/geometry-src/deg-to-rad.d.ts +2 -0
- package/dist/scene/geometry-src/deg-to-rad.d.ts.map +1 -0
- package/dist/scene/geometry-src/deg-to-rad.js +4 -0
- package/dist/scene/geometry-src/deg-to-rad.js.map +1 -0
- package/dist/scene/geometry-src/disk-data.d.ts +12 -0
- package/dist/scene/geometry-src/disk-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/disk-data.js +21 -0
- package/dist/scene/geometry-src/disk-data.js.map +1 -0
- package/dist/scene/geometry-src/errors.d.ts +3 -0
- package/dist/scene/geometry-src/errors.d.ts.map +1 -0
- package/dist/scene/geometry-src/errors.js +5 -0
- package/dist/scene/geometry-src/errors.js.map +1 -0
- package/dist/scene/geometry-src/icosphere-data.d.ts +8 -0
- package/dist/scene/geometry-src/icosphere-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/icosphere-data.js +58 -0
- package/dist/scene/geometry-src/icosphere-data.js.map +1 -0
- package/dist/scene/geometry-src/index.d.ts +36 -0
- package/dist/scene/geometry-src/index.d.ts.map +1 -0
- package/dist/scene/geometry-src/index.js +21 -0
- package/dist/scene/geometry-src/index.js.map +1 -0
- package/dist/scene/geometry-src/mesh-box.d.ts +8 -0
- package/dist/scene/geometry-src/mesh-box.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-box.js +57 -0
- package/dist/scene/geometry-src/mesh-box.js.map +1 -0
- package/dist/scene/geometry-src/mesh-cache.d.ts +4 -0
- package/dist/scene/geometry-src/mesh-cache.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-cache.js +14 -0
- package/dist/scene/geometry-src/mesh-cache.js.map +1 -0
- package/dist/scene/geometry-src/mesh-capsule.d.ts +14 -0
- package/dist/scene/geometry-src/mesh-capsule.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-capsule.js +52 -0
- package/dist/scene/geometry-src/mesh-capsule.js.map +1 -0
- package/dist/scene/geometry-src/mesh-cone.d.ts +16 -0
- package/dist/scene/geometry-src/mesh-cone.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-cone.js +54 -0
- package/dist/scene/geometry-src/mesh-cone.js.map +1 -0
- package/dist/scene/geometry-src/mesh-cylinder.d.ts +18 -0
- package/dist/scene/geometry-src/mesh-cylinder.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-cylinder.js +67 -0
- package/dist/scene/geometry-src/mesh-cylinder.js.map +1 -0
- package/dist/scene/geometry-src/mesh-disk.d.ts +11 -0
- package/dist/scene/geometry-src/mesh-disk.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-disk.js +45 -0
- package/dist/scene/geometry-src/mesh-disk.js.map +1 -0
- package/dist/scene/geometry-src/mesh-dodecahedron.d.ts +4 -0
- package/dist/scene/geometry-src/mesh-dodecahedron.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-dodecahedron.js +10 -0
- package/dist/scene/geometry-src/mesh-dodecahedron.js.map +1 -0
- package/dist/scene/geometry-src/mesh-fullscreen-quad.d.ts +7 -0
- package/dist/scene/geometry-src/mesh-fullscreen-quad.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-fullscreen-quad.js +39 -0
- package/dist/scene/geometry-src/mesh-fullscreen-quad.js.map +1 -0
- package/dist/scene/geometry-src/mesh-icosahedron.d.ts +4 -0
- package/dist/scene/geometry-src/mesh-icosahedron.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-icosahedron.js +10 -0
- package/dist/scene/geometry-src/mesh-icosahedron.js.map +1 -0
- package/dist/scene/geometry-src/mesh-icosphere.d.ts +11 -0
- package/dist/scene/geometry-src/mesh-icosphere.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-icosphere.js +47 -0
- package/dist/scene/geometry-src/mesh-icosphere.js.map +1 -0
- package/dist/scene/geometry-src/mesh-octahedron.d.ts +4 -0
- package/dist/scene/geometry-src/mesh-octahedron.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-octahedron.js +10 -0
- package/dist/scene/geometry-src/mesh-octahedron.js.map +1 -0
- package/dist/scene/geometry-src/mesh-plane.d.ts +13 -0
- package/dist/scene/geometry-src/mesh-plane.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-plane.js +51 -0
- package/dist/scene/geometry-src/mesh-plane.js.map +1 -0
- package/dist/scene/geometry-src/mesh-ring.d.ts +12 -0
- package/dist/scene/geometry-src/mesh-ring.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-ring.js +47 -0
- package/dist/scene/geometry-src/mesh-ring.js.map +1 -0
- package/dist/scene/geometry-src/mesh-sphere.d.ts +10 -0
- package/dist/scene/geometry-src/mesh-sphere.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-sphere.js +51 -0
- package/dist/scene/geometry-src/mesh-sphere.js.map +1 -0
- package/dist/scene/geometry-src/mesh-tetrahedron.d.ts +5 -0
- package/dist/scene/geometry-src/mesh-tetrahedron.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-tetrahedron.js +10 -0
- package/dist/scene/geometry-src/mesh-tetrahedron.js.map +1 -0
- package/dist/scene/geometry-src/mesh-torus.d.ts +17 -0
- package/dist/scene/geometry-src/mesh-torus.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-torus.js +56 -0
- package/dist/scene/geometry-src/mesh-torus.js.map +1 -0
- package/dist/scene/geometry-src/mesh-types.d.ts +38 -0
- package/dist/scene/geometry-src/mesh-types.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-types.js +2 -0
- package/dist/scene/geometry-src/mesh-types.js.map +1 -0
- package/dist/scene/geometry-src/mesh.d.ts +61 -0
- package/dist/scene/geometry-src/mesh.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh.js +49 -0
- package/dist/scene/geometry-src/mesh.js.map +1 -0
- package/dist/scene/geometry-src/orthographic-camera.d.ts +14 -0
- package/dist/scene/geometry-src/orthographic-camera.d.ts.map +1 -0
- package/dist/scene/geometry-src/orthographic-camera.js +9 -0
- package/dist/scene/geometry-src/orthographic-camera.js.map +1 -0
- package/dist/scene/geometry-src/perspective-camera.d.ts +12 -0
- package/dist/scene/geometry-src/perspective-camera.d.ts.map +1 -0
- package/dist/scene/geometry-src/perspective-camera.js +9 -0
- package/dist/scene/geometry-src/perspective-camera.js.map +1 -0
- package/dist/scene/geometry-src/plane-data.d.ts +12 -0
- package/dist/scene/geometry-src/plane-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/plane-data.js +25 -0
- package/dist/scene/geometry-src/plane-data.js.map +1 -0
- package/dist/scene/geometry-src/polyhedron-data.d.ts +7 -0
- package/dist/scene/geometry-src/polyhedron-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/polyhedron-data.js +42 -0
- package/dist/scene/geometry-src/polyhedron-data.js.map +1 -0
- package/dist/scene/geometry-src/polyhedron-mesh.d.ts +10 -0
- package/dist/scene/geometry-src/polyhedron-mesh.d.ts.map +1 -0
- package/dist/scene/geometry-src/polyhedron-mesh.js +37 -0
- package/dist/scene/geometry-src/polyhedron-mesh.js.map +1 -0
- package/dist/scene/geometry-src/polyhedron-seeds.d.ts +6 -0
- package/dist/scene/geometry-src/polyhedron-seeds.d.ts.map +1 -0
- package/dist/scene/geometry-src/polyhedron-seeds.js +51 -0
- package/dist/scene/geometry-src/polyhedron-seeds.js.map +1 -0
- package/dist/scene/geometry-src/primitive-data-utils.d.ts +9 -0
- package/dist/scene/geometry-src/primitive-data-utils.d.ts.map +1 -0
- package/dist/scene/geometry-src/primitive-data-utils.js +36 -0
- package/dist/scene/geometry-src/primitive-data-utils.js.map +1 -0
- package/dist/scene/geometry-src/ring-data.d.ts +13 -0
- package/dist/scene/geometry-src/ring-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/ring-data.js +24 -0
- package/dist/scene/geometry-src/ring-data.js.map +1 -0
- package/dist/scene/geometry-src/sphere-data.d.ts +11 -0
- package/dist/scene/geometry-src/sphere-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/sphere-data.js +31 -0
- package/dist/scene/geometry-src/sphere-data.js.map +1 -0
- package/dist/scene/geometry-src/srgb.d.ts +5 -0
- package/dist/scene/geometry-src/srgb.d.ts.map +1 -0
- package/dist/scene/geometry-src/srgb.js +23 -0
- package/dist/scene/geometry-src/srgb.js.map +1 -0
- package/dist/scene/geometry-src/torus-data.d.ts +11 -0
- package/dist/scene/geometry-src/torus-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/torus-data.js +38 -0
- package/dist/scene/geometry-src/torus-data.js.map +1 -0
- package/dist/scene/geometry-src/vertex-layout.d.ts +2 -0
- package/dist/scene/geometry-src/vertex-layout.d.ts.map +1 -0
- package/dist/scene/geometry-src/vertex-layout.js +2 -0
- package/dist/scene/geometry-src/vertex-layout.js.map +1 -0
- package/dist/scene/geometry.d.ts +70 -0
- package/dist/scene/geometry.d.ts.map +1 -0
- package/dist/scene/geometry.js +71 -0
- package/dist/scene/geometry.js.map +1 -0
- package/dist/scene/orbit.d.ts +9 -0
- package/dist/scene/orbit.d.ts.map +1 -0
- package/dist/scene/orbit.js +15 -0
- package/dist/scene/orbit.js.map +1 -0
- package/dist/scene/tree/errors.d.ts +4 -0
- package/dist/scene/tree/errors.d.ts.map +1 -0
- package/dist/scene/tree/errors.js +19 -0
- package/dist/scene/tree/errors.js.map +1 -0
- package/dist/scene/tree/light.d.ts +42 -0
- package/dist/scene/tree/light.d.ts.map +1 -0
- package/dist/scene/tree/light.js +102 -0
- package/dist/scene/tree/light.js.map +1 -0
- package/dist/scene/tree/material.d.ts +79 -0
- package/dist/scene/tree/material.d.ts.map +1 -0
- package/dist/scene/tree/material.js +117 -0
- package/dist/scene/tree/material.js.map +1 -0
- package/dist/scene/tree/math.d.ts +26 -0
- package/dist/scene/tree/math.d.ts.map +1 -0
- package/dist/scene/tree/math.js +217 -0
- package/dist/scene/tree/math.js.map +1 -0
- package/dist/scene/tree/mesh-node.d.ts +17 -0
- package/dist/scene/tree/mesh-node.d.ts.map +1 -0
- package/dist/scene/tree/mesh-node.js +24 -0
- package/dist/scene/tree/mesh-node.js.map +1 -0
- package/dist/scene/tree/node.d.ts +70 -0
- package/dist/scene/tree/node.d.ts.map +1 -0
- package/dist/scene/tree/node.js +220 -0
- package/dist/scene/tree/node.js.map +1 -0
- package/dist/scene/tree/orbit-controls.d.ts +69 -0
- package/dist/scene/tree/orbit-controls.d.ts.map +1 -0
- package/dist/scene/tree/orbit-controls.js +226 -0
- package/dist/scene/tree/orbit-controls.js.map +1 -0
- package/dist/scene.d.ts +21 -0
- package/dist/scene.d.ts.map +1 -0
- package/dist/scene.js +11 -0
- package/dist/scene.js.map +1 -0
- package/dist/set-core.d.ts +50 -0
- package/dist/set-core.d.ts.map +1 -0
- package/dist/set-core.js +268 -0
- package/dist/set-core.js.map +1 -0
- package/dist/set-layouts.d.ts +20 -0
- package/dist/set-layouts.d.ts.map +1 -0
- package/dist/set-layouts.js +103 -0
- package/dist/set-layouts.js.map +1 -0
- package/dist/set-packing.d.ts +4 -0
- package/dist/set-packing.d.ts.map +1 -0
- package/dist/set-packing.js +82 -0
- package/dist/set-packing.js.map +1 -0
- package/dist/set-resources.d.ts +20 -0
- package/dist/set-resources.d.ts.map +1 -0
- package/dist/set-resources.js +140 -0
- package/dist/set-resources.js.map +1 -0
- package/dist/shader-source.d.ts +4 -0
- package/dist/shader-source.d.ts.map +1 -0
- package/dist/shader-source.js +21 -0
- package/dist/shader-source.js.map +1 -0
- package/dist/storage.d.ts +38 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +76 -0
- package/dist/storage.js.map +1 -0
- package/dist/surface.d.ts +89 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +243 -0
- package/dist/surface.js.map +1 -0
- package/dist/target-offscreen.d.ts +41 -0
- package/dist/target-offscreen.d.ts.map +1 -0
- package/dist/target-offscreen.js +115 -0
- package/dist/target-offscreen.js.map +1 -0
- package/dist/target-utils.d.ts +37 -0
- package/dist/target-utils.d.ts.map +1 -0
- package/dist/target-utils.js +103 -0
- package/dist/target-utils.js.map +1 -0
- package/dist/target.d.ts +65 -0
- package/dist/target.d.ts.map +1 -0
- package/dist/target.js +2 -0
- package/dist/target.js.map +1 -0
- package/dist/timer.d.ts +78 -0
- package/dist/timer.d.ts.map +1 -0
- package/dist/timer.js +261 -0
- package/dist/timer.js.map +1 -0
- package/dist/uniforms-layout.d.ts +8 -0
- package/dist/uniforms-layout.d.ts.map +1 -0
- package/dist/uniforms-layout.js +84 -0
- package/dist/uniforms-layout.js.map +1 -0
- package/dist/uniforms.d.ts +43 -0
- package/dist/uniforms.d.ts.map +1 -0
- package/dist/uniforms.js +176 -0
- package/dist/uniforms.js.map +1 -0
- package/dist/visibility.d.ts +118 -0
- package/dist/visibility.d.ts.map +1 -0
- package/dist/visibility.js +290 -0
- package/dist/visibility.js.map +1 -0
- package/package.json +131 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { type Device } from "@aigpu/core";
|
|
2
|
+
import type { EntryPointInfo, OverrideInfo } from "@aigpu/wgsl/reflect-source";
|
|
3
|
+
import type { Target, CompileTarget, TargetSignature } from "./target.ts";
|
|
4
|
+
import { type AIGpuError } from "./errors.ts";
|
|
5
|
+
export interface ErrorCtx {
|
|
6
|
+
readonly where: string;
|
|
7
|
+
readonly signature?: string;
|
|
8
|
+
}
|
|
9
|
+
export type ErrorSink = (error: AIGpuError) => void | Promise<void>;
|
|
10
|
+
export type SettledSource = () => readonly Promise<unknown>[];
|
|
11
|
+
export type RegisterSettledSource = (source: SettledSource) => () => void;
|
|
12
|
+
export type PipelineEntry = {
|
|
13
|
+
pipeline?: GPURenderPipeline;
|
|
14
|
+
pending?: {
|
|
15
|
+
promise: Promise<GPURenderPipeline>;
|
|
16
|
+
resolve(pipeline: GPURenderPipeline): void;
|
|
17
|
+
reject(error: unknown): void;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export interface PipelineStore {
|
|
21
|
+
getReady(key: string): GPURenderPipeline | undefined;
|
|
22
|
+
getSync(key: string, create: () => GPURenderPipeline, ctx: ErrorCtx): GPURenderPipeline | undefined;
|
|
23
|
+
getAsync(key: string, create: () => Promise<GPURenderPipeline>, ctx: ErrorCtx): Promise<GPURenderPipeline>;
|
|
24
|
+
dispose(): void;
|
|
25
|
+
}
|
|
26
|
+
export interface ShaderModuleCache {
|
|
27
|
+
get(source: string, label: string): GPUShaderModule;
|
|
28
|
+
dispose(): void;
|
|
29
|
+
}
|
|
30
|
+
export interface PipelineLayoutCache {
|
|
31
|
+
get(layouts: ReadonlyMap<number, GPUBindGroupLayout>): GPUPipelineLayout;
|
|
32
|
+
dispose(): void;
|
|
33
|
+
}
|
|
34
|
+
export interface PipelineStoreOptions {
|
|
35
|
+
readonly errorSink?: ErrorSink;
|
|
36
|
+
readonly registerSettledSource?: RegisterSettledSource;
|
|
37
|
+
}
|
|
38
|
+
export declare function normalizeSignature(arg: CompileTarget): TargetSignature;
|
|
39
|
+
export declare function signatureKeyOf(sig: TargetSignature): string;
|
|
40
|
+
export declare function validateTargetSignature(sig: TargetSignature, where: string): void;
|
|
41
|
+
export declare function pipelineKeyOf(parts: {
|
|
42
|
+
readonly module: GPUShaderModule;
|
|
43
|
+
readonly pipelineLayout: GPUPipelineLayout;
|
|
44
|
+
readonly vertexBufferLayouts?: readonly GPUVertexBufferLayout[];
|
|
45
|
+
readonly signature: TargetSignature;
|
|
46
|
+
readonly fragmentKey?: string;
|
|
47
|
+
readonly topology?: GPUPrimitiveTopology;
|
|
48
|
+
readonly stripIndexFormat?: GPUIndexFormat;
|
|
49
|
+
readonly cullMode?: GPUCullMode;
|
|
50
|
+
readonly frontFace?: GPUFrontFace;
|
|
51
|
+
readonly unclippedDepth?: boolean;
|
|
52
|
+
readonly depthKey?: string;
|
|
53
|
+
readonly stencilKey?: string;
|
|
54
|
+
readonly multisampleKey?: string;
|
|
55
|
+
readonly constantsKey?: string;
|
|
56
|
+
readonly entryKey?: string;
|
|
57
|
+
}): string;
|
|
58
|
+
/**
|
|
59
|
+
* Selects the entry point a pipeline stage compiles: the first entry point of the stage when no name is given
|
|
60
|
+
* (exactly today's behavior), or the named one — validated to exist and to have the requested stage. Callers must
|
|
61
|
+
* run this selection before deriving anything from the result (binding visibility, storage-stage limits, bind
|
|
62
|
+
* group layouts, vertex input layouts), so the whole pipeline reflects the chosen variant.
|
|
63
|
+
*/
|
|
64
|
+
export declare function selectEntryPoint(label: string, entryPoints: readonly EntryPointInfo[], stage: "vertex" | "fragment" | "compute", name: string | undefined, where: string): EntryPointInfo | undefined;
|
|
65
|
+
export type NormalizedConstantsOptions = {
|
|
66
|
+
readonly constants?: Readonly<Record<string, GPUPipelineConstantValue>>;
|
|
67
|
+
readonly constantsKey?: string;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Validates a `constants` option against the shader's reflected `override` declarations and normalizes it into
|
|
71
|
+
* the GPUProgrammableStage constants record (booleans become 1/0 — GPUPipelineConstantValue "is a `double`", and
|
|
72
|
+
* WebGPU converts it "to WGSL type of the pipeline-overridable constant (bool/i32/u32/f32/f16)") plus a
|
|
73
|
+
* deterministic pipeline-cache key fragment.
|
|
74
|
+
*
|
|
75
|
+
* WebGPU keys each override by its pipeline-overridable constant identifier string — "the pipeline constant ID of
|
|
76
|
+
* the constant if its declaration specifies one, and otherwise the constant's identifier name" — and key matching
|
|
77
|
+
* is module-level: "The pipeline-overridable constant is not required to be statically used by entryPoint." One
|
|
78
|
+
* record is therefore valid for every stage of the module and needs no per-stage filtering. The spec's
|
|
79
|
+
* must-provide rule is per constant "statically used by entryPoint"; reflection does not track override
|
|
80
|
+
* reachability per entry point, so the no-default check here is conservatively module-level — providing a value
|
|
81
|
+
* for an unused override is always legal, and requiring one for an unused no-default override never produces an
|
|
82
|
+
* invalid pipeline.
|
|
83
|
+
*/
|
|
84
|
+
export declare function normalizeConstantsOptions(label: string, value: Readonly<Record<string, number | boolean>> | undefined, overrides: readonly OverrideInfo[], where: string): NormalizedConstantsOptions;
|
|
85
|
+
export declare function createShaderModuleCache(device: Device): ShaderModuleCache;
|
|
86
|
+
export declare function createPipelineLayoutCache(device: Device): PipelineLayoutCache;
|
|
87
|
+
export declare function createPipelineStore(device: Device, opts?: PipelineStoreOptions): PipelineStore;
|
|
88
|
+
export type { CompileTarget, Target, TargetSignature };
|
|
89
|
+
//# sourceMappingURL=pipeline-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-store.d.ts","sourceRoot":"","sources":["../src/pipeline-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { bindGroupLayoutMetadata } from "@aigpu/core";
|
|
2
|
+
import { isTarget } from "./target-utils.js";
|
|
3
|
+
import { compileDisposedError, compileFailedError, compileSignatureInvalidError, constantsInvalidError, entryInvalidError, pipelineLayoutGapError } from "./errors.js";
|
|
4
|
+
let nextShaderModuleId = 1;
|
|
5
|
+
let nextPipelineLayoutId = 1;
|
|
6
|
+
const shaderModuleIds = new WeakMap();
|
|
7
|
+
const pipelineLayoutIds = new WeakMap();
|
|
8
|
+
export function normalizeSignature(arg) {
|
|
9
|
+
if (isTarget(arg)) {
|
|
10
|
+
return {
|
|
11
|
+
colors: arg.colors.map((color) => color.format),
|
|
12
|
+
depth: arg.depth?.format,
|
|
13
|
+
sampleCount: arg.sampleCount,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (typeof arg !== "object" || arg === null)
|
|
17
|
+
return { colors: [] };
|
|
18
|
+
return {
|
|
19
|
+
colors: Array.isArray(arg.colors) ? [...arg.colors] : (arg.colors ?? []),
|
|
20
|
+
depth: arg.depth,
|
|
21
|
+
sampleCount: arg.sampleCount ?? 1,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function signatureKeyOf(sig) {
|
|
25
|
+
return `${sig.colors.join(",")}:${sig.depth ?? "none"}:${sig.sampleCount ?? 1}`;
|
|
26
|
+
}
|
|
27
|
+
export function validateTargetSignature(sig, where) {
|
|
28
|
+
if (!Array.isArray(sig.colors) || sig.colors.length === 0)
|
|
29
|
+
throw compileSignatureInvalidError(where, "colors must be a non-empty array.");
|
|
30
|
+
const invalidColor = sig.colors.find((format) => typeof format !== "string" || format.length === 0);
|
|
31
|
+
if (invalidColor !== undefined)
|
|
32
|
+
throw compileSignatureInvalidError(where, `colors must contain only GPUTextureFormat strings; received ${String(invalidColor)}.`);
|
|
33
|
+
if (sig.depth !== undefined && (typeof sig.depth !== "string" || sig.depth.length === 0))
|
|
34
|
+
throw compileSignatureInvalidError(where, "depth must be a GPUTextureFormat string.");
|
|
35
|
+
const sampleCount = sig.sampleCount ?? 1;
|
|
36
|
+
if (sampleCount !== 1 && sampleCount !== 4)
|
|
37
|
+
throw compileSignatureInvalidError(where, `sampleCount must be 1 or 4; received ${String(sampleCount)}.`);
|
|
38
|
+
}
|
|
39
|
+
export function pipelineKeyOf(parts) {
|
|
40
|
+
const base = `${idFor(shaderModuleIds, parts.module, () => nextShaderModuleId++)}|${idFor(pipelineLayoutIds, parts.pipelineLayout, () => nextPipelineLayoutId++)}|${vertexLayoutHash(parts.vertexBufferLayouts ?? [])}|${signatureKeyOf(parts.signature)}`;
|
|
41
|
+
const primitive = parts.topology || parts.stripIndexFormat ? `${base}|${parts.topology ?? "triangle-list"}|${parts.stripIndexFormat ?? "none"}` : base;
|
|
42
|
+
const culled = parts.cullMode || parts.frontFace ? `${primitive}|${parts.cullMode ?? "none"}|${parts.frontFace ?? "ccw"}` : primitive;
|
|
43
|
+
const clipped = parts.unclippedDepth ? `${culled}|unclipped` : culled;
|
|
44
|
+
const withDepth = parts.depthKey ? `${clipped}|${parts.depthKey}` : clipped;
|
|
45
|
+
const withStencil = parts.stencilKey ? `${withDepth}|${parts.stencilKey}` : withDepth;
|
|
46
|
+
const withMultisample = parts.multisampleKey ? `${withStencil}|${parts.multisampleKey}` : withStencil;
|
|
47
|
+
const withConstants = parts.constantsKey ? `${withMultisample}|${parts.constantsKey}` : withMultisample;
|
|
48
|
+
// The shader module is shared per byte-identical source, so entry point names must key variants themselves.
|
|
49
|
+
const withEntry = parts.entryKey ? `${withConstants}|${parts.entryKey}` : withConstants;
|
|
50
|
+
return parts.fragmentKey ? `${withEntry}|${parts.fragmentKey}` : withEntry;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Selects the entry point a pipeline stage compiles: the first entry point of the stage when no name is given
|
|
54
|
+
* (exactly today's behavior), or the named one — validated to exist and to have the requested stage. Callers must
|
|
55
|
+
* run this selection before deriving anything from the result (binding visibility, storage-stage limits, bind
|
|
56
|
+
* group layouts, vertex input layouts), so the whole pipeline reflects the chosen variant.
|
|
57
|
+
*/
|
|
58
|
+
export function selectEntryPoint(label, entryPoints, stage, name, where) {
|
|
59
|
+
if (name === undefined)
|
|
60
|
+
return entryPoints.find((entry) => entry.stage === stage);
|
|
61
|
+
if (typeof name !== "string") {
|
|
62
|
+
throw entryInvalidError(label, `${stage} received ${previewConstant(name)}; expected an entry point name string.`, where);
|
|
63
|
+
}
|
|
64
|
+
// WGSL forbids duplicate function names, so a name identifies at most one entry point across all stages.
|
|
65
|
+
const named = entryPoints.find((entry) => entry.name === name);
|
|
66
|
+
if (!named) {
|
|
67
|
+
throw entryInvalidError(label, `"${name}" matches no entry point in the shader; available entry points: ${availableEntryPoints(entryPoints)}.`, where);
|
|
68
|
+
}
|
|
69
|
+
if (named.stage !== stage) {
|
|
70
|
+
throw entryInvalidError(label, `"${name}" is a @${named.stage} entry point, not @${stage}; available entry points: ${availableEntryPoints(entryPoints)}.`, where);
|
|
71
|
+
}
|
|
72
|
+
return named;
|
|
73
|
+
}
|
|
74
|
+
function availableEntryPoints(entryPoints) {
|
|
75
|
+
if (!entryPoints.length)
|
|
76
|
+
return "none";
|
|
77
|
+
return entryPoints.map((entry) => `"${entry.name}" (@${entry.stage})`).join(", ");
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Validates a `constants` option against the shader's reflected `override` declarations and normalizes it into
|
|
81
|
+
* the GPUProgrammableStage constants record (booleans become 1/0 — GPUPipelineConstantValue "is a `double`", and
|
|
82
|
+
* WebGPU converts it "to WGSL type of the pipeline-overridable constant (bool/i32/u32/f32/f16)") plus a
|
|
83
|
+
* deterministic pipeline-cache key fragment.
|
|
84
|
+
*
|
|
85
|
+
* WebGPU keys each override by its pipeline-overridable constant identifier string — "the pipeline constant ID of
|
|
86
|
+
* the constant if its declaration specifies one, and otherwise the constant's identifier name" — and key matching
|
|
87
|
+
* is module-level: "The pipeline-overridable constant is not required to be statically used by entryPoint." One
|
|
88
|
+
* record is therefore valid for every stage of the module and needs no per-stage filtering. The spec's
|
|
89
|
+
* must-provide rule is per constant "statically used by entryPoint"; reflection does not track override
|
|
90
|
+
* reachability per entry point, so the no-default check here is conservatively module-level — providing a value
|
|
91
|
+
* for an unused override is always legal, and requiring one for an unused no-default override never produces an
|
|
92
|
+
* invalid pipeline.
|
|
93
|
+
*/
|
|
94
|
+
export function normalizeConstantsOptions(label, value, overrides, where) {
|
|
95
|
+
if (value !== undefined && (typeof value !== "object" || value === null || Array.isArray(value))) {
|
|
96
|
+
throw constantsInvalidError(label, `received ${previewConstant(value)}; expected { overrideNameOrId: number | boolean }.`, where);
|
|
97
|
+
}
|
|
98
|
+
const byIdentifier = new Map(overrides.map((override) => [overrideIdentifierOf(override), override]));
|
|
99
|
+
const constants = {};
|
|
100
|
+
for (const [key, entry] of Object.entries(value ?? {})) {
|
|
101
|
+
if (!byIdentifier.has(key)) {
|
|
102
|
+
throw constantsInvalidError(label, `"${key}" matches no override in the shader; available overrides: ${availableOverrides(overrides)}.`, where);
|
|
103
|
+
}
|
|
104
|
+
if (typeof entry === "boolean") {
|
|
105
|
+
constants[key] = entry ? 1 : 0;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (typeof entry !== "number" || !Number.isFinite(entry)) {
|
|
109
|
+
throw constantsInvalidError(label, `"${key}" received ${previewConstant(entry)}; use a finite number or a boolean (WebGPU converts the value to the override's WGSL type, and NaN/Infinity fail that conversion).`, where);
|
|
110
|
+
}
|
|
111
|
+
constants[key] = entry;
|
|
112
|
+
}
|
|
113
|
+
// WebGPU: "If the pipeline-overridable constant identified by key does not have a default value,
|
|
114
|
+
// descriptor.constants must contain key." — checked module-level here; see the function comment.
|
|
115
|
+
for (const override of overrides) {
|
|
116
|
+
const identifier = overrideIdentifierOf(override);
|
|
117
|
+
if (override.defaultValue === undefined && !(identifier in constants)) {
|
|
118
|
+
throw constantsInvalidError(label, `override '${override.name}' has no default value and must be provided; add constants: { "${identifier}": value }.`, where);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// No overridden values behaves exactly like an absent option; descriptors and pipeline cache keys stay byte-identical.
|
|
122
|
+
if (Object.keys(constants).length === 0)
|
|
123
|
+
return {};
|
|
124
|
+
return { constants, constantsKey: constantsKeyFor(constants) };
|
|
125
|
+
}
|
|
126
|
+
function overrideIdentifierOf(override) {
|
|
127
|
+
return override.id !== undefined ? String(override.id) : override.name;
|
|
128
|
+
}
|
|
129
|
+
function availableOverrides(overrides) {
|
|
130
|
+
if (!overrides.length)
|
|
131
|
+
return "none";
|
|
132
|
+
return overrides.map((override) => override.id !== undefined ? `"${override.id}" (@id of ${override.name})` : `"${override.name}"`).join(", ");
|
|
133
|
+
}
|
|
134
|
+
function constantsKeyFor(constants) {
|
|
135
|
+
return `cn~${Object.entries(constants).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)).map(([key, entry]) => `${key}=${entry}`).join("~")}`;
|
|
136
|
+
}
|
|
137
|
+
function previewConstant(value) {
|
|
138
|
+
if (typeof value === "string")
|
|
139
|
+
return `"${value}"`;
|
|
140
|
+
try {
|
|
141
|
+
return JSON.stringify(value) ?? String(value);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return String(value);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export function createShaderModuleCache(device) {
|
|
148
|
+
const modules = new Map();
|
|
149
|
+
return {
|
|
150
|
+
get(source, label) {
|
|
151
|
+
let module = modules.get(source);
|
|
152
|
+
if (!module) {
|
|
153
|
+
// GPUShaderModule is immutable; the first creator's label wins for byte-identical WGSL.
|
|
154
|
+
module = device.gpu.createShaderModule({ label, code: source });
|
|
155
|
+
modules.set(source, module);
|
|
156
|
+
}
|
|
157
|
+
return module;
|
|
158
|
+
},
|
|
159
|
+
dispose() { modules.clear(); },
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
export function createPipelineLayoutCache(device) {
|
|
163
|
+
const layouts = new Map();
|
|
164
|
+
return {
|
|
165
|
+
get(bindGroupLayouts) {
|
|
166
|
+
const key = pipelineLayoutKeyOf(bindGroupLayouts);
|
|
167
|
+
let layout = layouts.get(key);
|
|
168
|
+
if (!layout) {
|
|
169
|
+
layout = device.gpu.createPipelineLayout({ bindGroupLayouts: contiguousLayouts(bindGroupLayouts) });
|
|
170
|
+
layouts.set(key, layout);
|
|
171
|
+
}
|
|
172
|
+
return layout;
|
|
173
|
+
},
|
|
174
|
+
dispose() { layouts.clear(); },
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export function createPipelineStore(device, opts = {}) {
|
|
178
|
+
return new DevicePipelineStore(device, opts);
|
|
179
|
+
}
|
|
180
|
+
class DevicePipelineStore {
|
|
181
|
+
device;
|
|
182
|
+
#entries = new Map();
|
|
183
|
+
#tracked = new Set();
|
|
184
|
+
#errorSink;
|
|
185
|
+
#unregisterSettledSource;
|
|
186
|
+
#disposed = false;
|
|
187
|
+
constructor(device, opts) {
|
|
188
|
+
this.device = device;
|
|
189
|
+
this.#errorSink = opts.errorSink ?? (() => undefined);
|
|
190
|
+
this.#unregisterSettledSource = opts.registerSettledSource?.(() => [...this.#tracked]);
|
|
191
|
+
}
|
|
192
|
+
getReady(key) {
|
|
193
|
+
return this.#entries.get(key)?.pipeline;
|
|
194
|
+
}
|
|
195
|
+
getSync(key, create, ctx) {
|
|
196
|
+
this.#assertUsable(ctx.where);
|
|
197
|
+
const existing = this.#entries.get(key);
|
|
198
|
+
if (existing?.pipeline)
|
|
199
|
+
return existing.pipeline;
|
|
200
|
+
const entry = existing ?? {};
|
|
201
|
+
if (!existing)
|
|
202
|
+
this.#entries.set(key, entry);
|
|
203
|
+
const pipeline = this.#createSyncPipeline(key, entry, create, ctx);
|
|
204
|
+
if (!pipeline) {
|
|
205
|
+
if (!entry.pending)
|
|
206
|
+
this.#entries.delete(key);
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
entry.pipeline = pipeline;
|
|
210
|
+
entry.pending?.resolve(pipeline);
|
|
211
|
+
entry.pending = undefined;
|
|
212
|
+
return pipeline;
|
|
213
|
+
}
|
|
214
|
+
getAsync(key, create, ctx) {
|
|
215
|
+
this.#assertUsable(ctx.where);
|
|
216
|
+
const existing = this.#entries.get(key);
|
|
217
|
+
if (existing?.pipeline)
|
|
218
|
+
return Promise.resolve(existing.pipeline);
|
|
219
|
+
if (existing?.pending)
|
|
220
|
+
return existing.pending.promise;
|
|
221
|
+
const entry = {};
|
|
222
|
+
const pending = createDeferred();
|
|
223
|
+
entry.pending = pending;
|
|
224
|
+
this.#entries.set(key, entry);
|
|
225
|
+
let native;
|
|
226
|
+
try {
|
|
227
|
+
native = create();
|
|
228
|
+
}
|
|
229
|
+
catch (cause) {
|
|
230
|
+
const error = compileFailedError(ctx.where, cause, ctx.signature);
|
|
231
|
+
pending.reject(error);
|
|
232
|
+
this.#entries.delete(key);
|
|
233
|
+
return pending.promise;
|
|
234
|
+
}
|
|
235
|
+
this.#track(native);
|
|
236
|
+
native.then((pipeline) => {
|
|
237
|
+
if (this.#entries.get(key) !== entry || entry.pipeline || entry.pending !== pending)
|
|
238
|
+
return;
|
|
239
|
+
entry.pipeline = pipeline;
|
|
240
|
+
entry.pending = undefined;
|
|
241
|
+
pending.resolve(pipeline);
|
|
242
|
+
}, (cause) => {
|
|
243
|
+
if (this.#entries.get(key) !== entry || entry.pipeline || entry.pending !== pending)
|
|
244
|
+
return;
|
|
245
|
+
entry.pending = undefined;
|
|
246
|
+
this.#entries.delete(key);
|
|
247
|
+
pending.reject(compileFailedError(ctx.where, cause, ctx.signature));
|
|
248
|
+
});
|
|
249
|
+
return pending.promise;
|
|
250
|
+
}
|
|
251
|
+
dispose() {
|
|
252
|
+
if (this.#disposed)
|
|
253
|
+
return;
|
|
254
|
+
this.#disposed = true;
|
|
255
|
+
const error = compileDisposedError("gpu.dispose");
|
|
256
|
+
for (const entry of this.#entries.values())
|
|
257
|
+
entry.pending?.reject(error);
|
|
258
|
+
this.#entries.clear();
|
|
259
|
+
this.#tracked.clear();
|
|
260
|
+
this.#unregisterSettledSource?.();
|
|
261
|
+
}
|
|
262
|
+
#createSyncPipeline(key, entry, create, ctx) {
|
|
263
|
+
const gpu = this.device.gpu;
|
|
264
|
+
const scoped = typeof gpu.pushErrorScope === "function" && typeof gpu.popErrorScope === "function";
|
|
265
|
+
if (scoped)
|
|
266
|
+
gpu.pushErrorScope("validation");
|
|
267
|
+
try {
|
|
268
|
+
const pipeline = create();
|
|
269
|
+
if (scoped)
|
|
270
|
+
this.#trackSyncErrorScope(key, entry, ctx);
|
|
271
|
+
return pipeline;
|
|
272
|
+
}
|
|
273
|
+
catch (cause) {
|
|
274
|
+
if (scoped)
|
|
275
|
+
this.#suppressSyncErrorScopePop();
|
|
276
|
+
const error = compileFailedError(ctx.where, cause, ctx.signature);
|
|
277
|
+
void this.#errorSink(error);
|
|
278
|
+
return undefined;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
#trackSyncErrorScope(key, entry, ctx) {
|
|
282
|
+
const pop = this.device.gpu.popErrorScope()
|
|
283
|
+
.then((nativeError) => {
|
|
284
|
+
if (!nativeError)
|
|
285
|
+
return;
|
|
286
|
+
const error = compileFailedError(ctx.where, nativeError, ctx.signature);
|
|
287
|
+
if (this.#entries.get(key) === entry)
|
|
288
|
+
this.#entries.delete(key);
|
|
289
|
+
return this.#errorSink(error);
|
|
290
|
+
}, (cause) => {
|
|
291
|
+
const error = compileFailedError(ctx.where, cause, ctx.signature);
|
|
292
|
+
if (this.#entries.get(key) === entry)
|
|
293
|
+
this.#entries.delete(key);
|
|
294
|
+
return this.#errorSink(error);
|
|
295
|
+
});
|
|
296
|
+
this.#track(pop);
|
|
297
|
+
}
|
|
298
|
+
#suppressSyncErrorScopePop() {
|
|
299
|
+
const pop = this.device.gpu.popErrorScope?.();
|
|
300
|
+
if (pop)
|
|
301
|
+
void pop.catch(() => undefined);
|
|
302
|
+
}
|
|
303
|
+
#assertUsable(where) {
|
|
304
|
+
if (!this.#disposed)
|
|
305
|
+
return;
|
|
306
|
+
throw compileDisposedError(where);
|
|
307
|
+
}
|
|
308
|
+
#track(promise) {
|
|
309
|
+
this.#tracked.add(promise);
|
|
310
|
+
void promise.catch(() => undefined).then(() => this.#tracked.delete(promise), () => this.#tracked.delete(promise));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
function createDeferred() {
|
|
314
|
+
let resolve;
|
|
315
|
+
let reject;
|
|
316
|
+
const promise = new Promise((res, rej) => { resolve = res; reject = rej; });
|
|
317
|
+
void promise.catch(() => undefined);
|
|
318
|
+
return { promise, resolve, reject };
|
|
319
|
+
}
|
|
320
|
+
function idFor(ids, value, next) {
|
|
321
|
+
let id = ids.get(value);
|
|
322
|
+
if (!id) {
|
|
323
|
+
id = next();
|
|
324
|
+
ids.set(value, id);
|
|
325
|
+
}
|
|
326
|
+
return id;
|
|
327
|
+
}
|
|
328
|
+
function vertexLayoutHash(layouts) {
|
|
329
|
+
return JSON.stringify(layouts.map((layout) => ({
|
|
330
|
+
arrayStride: layout.arrayStride,
|
|
331
|
+
stepMode: layout.stepMode ?? "vertex",
|
|
332
|
+
attributes: [...layout.attributes].map((attribute) => ({
|
|
333
|
+
shaderLocation: attribute.shaderLocation,
|
|
334
|
+
offset: attribute.offset,
|
|
335
|
+
format: attribute.format,
|
|
336
|
+
})),
|
|
337
|
+
})));
|
|
338
|
+
}
|
|
339
|
+
function pipelineLayoutKeyOf(layouts) {
|
|
340
|
+
return JSON.stringify([...layouts.entries()].map(([group, layout]) => ({ group, entries: layoutEntries(layout) })));
|
|
341
|
+
}
|
|
342
|
+
function contiguousLayouts(bindGroupLayouts) {
|
|
343
|
+
const maxGroup = Math.max(-1, ...bindGroupLayouts.keys());
|
|
344
|
+
const layouts = [];
|
|
345
|
+
for (let i = 0; i <= maxGroup; i++)
|
|
346
|
+
layouts.push(requiredLayout(bindGroupLayouts, i));
|
|
347
|
+
return layouts;
|
|
348
|
+
}
|
|
349
|
+
function requiredLayout(bindGroupLayouts, group) {
|
|
350
|
+
const layout = bindGroupLayouts.get(group);
|
|
351
|
+
if (!layout)
|
|
352
|
+
throw pipelineLayoutGapError(group);
|
|
353
|
+
return layout;
|
|
354
|
+
}
|
|
355
|
+
function layoutEntries(layout) {
|
|
356
|
+
return (bindGroupLayoutMetadata(layout)?.entries ?? []).map((entry) => ({
|
|
357
|
+
binding: entry.binding,
|
|
358
|
+
visibility: entry.visibility,
|
|
359
|
+
buffer: entry.buffer ? { ...entry.buffer } : undefined,
|
|
360
|
+
sampler: entry.sampler ? { ...entry.sampler } : undefined,
|
|
361
|
+
texture: entry.texture ? { ...entry.texture } : undefined,
|
|
362
|
+
storageTexture: entry.storageTexture ? { ...entry.storageTexture } : undefined,
|
|
363
|
+
externalTexture: entry.externalTexture ? { ...entry.externalTexture } : undefined,
|
|
364
|
+
}));
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=pipeline-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-store.js","sourceRoot":"","sources":["../src/pipeline-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { Device } from "@aigpu/core";
|
|
2
|
+
import type { ErrorSink } from "./pipeline-store.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Bytes each resolved query occupies: WebGPU resolveQuerySet writes each result
|
|
5
|
+
* "into a GPUBuffer ... as a 64-bit unsigned integer" (8 bytes per query).
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export declare const QUERY_RESULT_BYTES = 8;
|
|
10
|
+
/**
|
|
11
|
+
* Options for the internal query resolve/readback ring shared by query-based
|
|
12
|
+
* features (timer today, occlusion queries next).
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
export interface QueryRingOptions {
|
|
17
|
+
/** GPUQuerySetDescriptor.type — "timestamp" for pass timing, "occlusion" for occlusion queries. */
|
|
18
|
+
readonly type: GPUQueryType;
|
|
19
|
+
/** Query count of the owned GPUQuerySet. WebGPU createQuerySet requires "descriptor.count must be ≤ 4096". */
|
|
20
|
+
readonly capacity: number;
|
|
21
|
+
readonly label?: string;
|
|
22
|
+
/** Staging buffers rotated per resolve (frames in flight + 1). Defaults to 3. */
|
|
23
|
+
readonly depth?: number;
|
|
24
|
+
/** Registers each pending readback so gpu.settled() covers in-flight maps. */
|
|
25
|
+
readonly trackSettled?: (promise: Promise<unknown>) => void;
|
|
26
|
+
/**
|
|
27
|
+
* Reports a failed readback (device loss, a rejected mapAsync, an unmap that throws) through the
|
|
28
|
+
* package's error channel — gpu.onError. The ring itself stays non-throwing: a failed readback is
|
|
29
|
+
* dropped, never surfaced as a rejected frame. Defaults to console.error.
|
|
30
|
+
*/
|
|
31
|
+
readonly errorSink?: ErrorSink;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Host hooks shared by the query-based features built on the ring (timer(gpu), visibility(gpu)).
|
|
35
|
+
*
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
38
|
+
export interface QueryHostOptions {
|
|
39
|
+
/** Registers each pending readback so gpu.settled() covers in-flight maps. */
|
|
40
|
+
readonly trackSettled?: (promise: Promise<unknown>) => void;
|
|
41
|
+
/** Error channel for dropped readbacks (gpu.onError). */
|
|
42
|
+
readonly errorSink?: ErrorSink;
|
|
43
|
+
/** Called from the feature's dispose() so the owning gpu can drop its tracking reference. */
|
|
44
|
+
readonly onDispose?: () => void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Internal ownership boundary for query readback plumbing. The ring knows nothing
|
|
48
|
+
* about span names, frames, or timers — it owns the GPUQuerySet, one resolve buffer
|
|
49
|
+
* (usage query_resolve|copy_src), and `depth` parity-rotated staging buffers
|
|
50
|
+
* (usage map_read|copy_dst), and turns "resolve the used range, then read it back
|
|
51
|
+
* without ever blocking" into two calls that bracket a queue submission.
|
|
52
|
+
*
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
export interface QueryRing {
|
|
56
|
+
readonly querySet: GPUQuerySet;
|
|
57
|
+
/** Query capacity of the owned set (immutable; consumers recreate the ring to grow). */
|
|
58
|
+
readonly capacity: number;
|
|
59
|
+
/**
|
|
60
|
+
* Appends one resolveQuerySet of the contiguous used range [0, usedCount) plus a
|
|
61
|
+
* copyBufferToBuffer into the next staging buffer to an encoder that is about to be
|
|
62
|
+
* finished and submitted. Returns false — encoding nothing — when usedCount is 0 or
|
|
63
|
+
* the next staging buffer is still map-pending: the readback is dropped, never blocked on.
|
|
64
|
+
*/
|
|
65
|
+
encodeResolve(encoder: GPUCommandEncoder, usedCount: number): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Call after the encoder from the last successful encodeResolve was submitted: starts the
|
|
68
|
+
* non-blocking mapAsync readback. `apply` receives the decoded u64 values (one per resolved
|
|
69
|
+
* query); readbacks apply in order — a stale readback that lands after a newer one already
|
|
70
|
+
* applied is discarded. No-op when the preceding encodeResolve returned false.
|
|
71
|
+
*/
|
|
72
|
+
onSubmitted(apply: (values: BigUint64Array) => void): void;
|
|
73
|
+
/**
|
|
74
|
+
* Pins the GPU resources while a frame in flight references `querySet` from a pass descriptor:
|
|
75
|
+
* `dispose()` then defers destruction until the matching `release()`. Consumers retain once per
|
|
76
|
+
* frame that binds the set and release when that frame is submitted (or abandoned), so a
|
|
77
|
+
* mid-frame `dispose()` can never destroy a query set the current frame still points at.
|
|
78
|
+
*/
|
|
79
|
+
retain(): void;
|
|
80
|
+
/** Balances one retain(); performs a deferred destruction when the ring is disposed and idle. */
|
|
81
|
+
release(): void;
|
|
82
|
+
/**
|
|
83
|
+
* Stops new encodes/readbacks. In-flight readbacks still decode and apply (so results are
|
|
84
|
+
* not lost when a consumer retires a ring to grow capacity); GPU resources are destroyed
|
|
85
|
+
* once the last in-flight map settles and the last frame retain is released.
|
|
86
|
+
*/
|
|
87
|
+
dispose(): void;
|
|
88
|
+
}
|
|
89
|
+
/** @internal */
|
|
90
|
+
export declare function createQueryRing(device: Device, options: QueryRingOptions): QueryRing;
|
|
91
|
+
//# sourceMappingURL=query-ring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-ring.d.ts","sourceRoot":"","sources":["../src/query-ring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAKpC;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mGAAmG;IACnG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,8GAA8G;IAC9G,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5D;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5D,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B,6FAA6F;IAC7F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3D;;;;;OAKG;IACH,MAAM,IAAI,IAAI,CAAC;IACf,iGAAiG;IACjG,OAAO,IAAI,IAAI,CAAC;IAChB;;;;OAIG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAEpF"}
|