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,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared public types with no runtime weight and no dependency on the `Gpu` facade.
|
|
3
|
+
*
|
|
4
|
+
* They live outside `gpu.ts` so feature modules (compute, storage, ping-pong, uniforms, ...)
|
|
5
|
+
* can be imported — and tree-shaken — without pulling the object that owns every factory.
|
|
6
|
+
*/
|
|
7
|
+
import type { AIGpuError } from "./errors.ts";
|
|
8
|
+
import type { Target } from "./target.ts";
|
|
9
|
+
export interface ComputeOptions {
|
|
10
|
+
readonly label?: string;
|
|
11
|
+
readonly set?: Record<string, unknown>;
|
|
12
|
+
/** Values for WGSL `override` constants, keyed by name (or by numeric id as a string when the override has @id). Immutable after construction. */
|
|
13
|
+
readonly constants?: Readonly<Record<string, number | boolean>>;
|
|
14
|
+
/** Compute entry point to use when the shader has several. Defaults to the first @compute entry point. */
|
|
15
|
+
readonly entry?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface DispatchOptions {
|
|
18
|
+
/** GPU-driven dispatch: read the workgroup counts from a buffer instead of CPU-side counts. */
|
|
19
|
+
readonly indirect: StorageBuffer | {
|
|
20
|
+
readonly buffer: StorageBuffer;
|
|
21
|
+
readonly offset?: number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface Compute {
|
|
25
|
+
set(values: Record<string, unknown>): this;
|
|
26
|
+
dispatch(x: number, y?: number, z?: number): void;
|
|
27
|
+
dispatch(opts: DispatchOptions): void;
|
|
28
|
+
}
|
|
29
|
+
export type StorageAccess = "read" | "read-write";
|
|
30
|
+
export interface StorageOptions {
|
|
31
|
+
/** Binding access for shader reflection. Defaults to "read-write". */
|
|
32
|
+
readonly access?: StorageAccess;
|
|
33
|
+
/** Adds the "indirect" buffer usage so the buffer can supply GPU-read draw/dispatch arguments. Defaults to false. */
|
|
34
|
+
readonly indirect?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface StorageBuffer {
|
|
37
|
+
readonly size: number;
|
|
38
|
+
readonly access: StorageAccess;
|
|
39
|
+
read(): Promise<ArrayBuffer>;
|
|
40
|
+
write(data: BufferSource): void;
|
|
41
|
+
}
|
|
42
|
+
export interface PingPongTargets {
|
|
43
|
+
readonly read: Target;
|
|
44
|
+
readonly write: Target;
|
|
45
|
+
swap(): void;
|
|
46
|
+
}
|
|
47
|
+
export interface PingPongStorage {
|
|
48
|
+
readonly read: StorageBuffer;
|
|
49
|
+
readonly write: StorageBuffer;
|
|
50
|
+
swap(): void;
|
|
51
|
+
}
|
|
52
|
+
export interface SharedUniforms<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
53
|
+
set(values: Partial<T>): void;
|
|
54
|
+
}
|
|
55
|
+
export type GpuErrorListener = (error: AIGpuError) => void;
|
|
56
|
+
//# sourceMappingURL=api-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-types.d.ts","sourceRoot":"","sources":["../src/api-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,kJAAkJ;IAClJ,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAChE,0GAA0G;IAC1G,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,WAAW,eAAe;IAC9B,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG;QAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjG;AACD,MAAM,WAAW,OAAO;IAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE;AACjK,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;AAClD,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAChC,qHAAqH;IACrH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AACD,MAAM,WAAW,aAAa;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAAC,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE;AACvJ,MAAM,WAAW,eAAe;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,IAAI,CAAA;CAAE;AAChG,MAAM,WAAW,eAAe;IAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAAC,IAAI,IAAI,IAAI,CAAA;CAAE;AAC9G,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;CAAE;AAC9H,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-types.js","sourceRoot":"","sources":["../src/api-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ResourceIdentity, UnsubscribeResourceDestroy } from "@aigpu/core";
|
|
2
|
+
export type BindGroupIdentityPart = ResourceIdentity | {
|
|
3
|
+
readonly kind: string;
|
|
4
|
+
readonly id: number;
|
|
5
|
+
} | string | number;
|
|
6
|
+
export type BindGroupFactory = () => GPUBindGroup;
|
|
7
|
+
export interface BindGroupCache {
|
|
8
|
+
getOrCreate(drawId: number | string, group: number, identityTuple: readonly BindGroupIdentityPart[], factory: BindGroupFactory): GPUBindGroup;
|
|
9
|
+
evictIdentity(identity: BindGroupIdentityPart): void;
|
|
10
|
+
clearDraw(drawId: number | string): void;
|
|
11
|
+
dispose(): void;
|
|
12
|
+
}
|
|
13
|
+
export declare function createBindGroupCache(): BindGroupCache;
|
|
14
|
+
export declare function identityKey(identity: BindGroupIdentityPart): string;
|
|
15
|
+
export declare function subscribeEviction(resource: {
|
|
16
|
+
onDestroy?: (cb: (resource: unknown) => void) => UnsubscribeResourceDestroy;
|
|
17
|
+
readonly resourceIdentity?: ResourceIdentity;
|
|
18
|
+
}, cache: BindGroupCache): UnsubscribeResourceDestroy | undefined;
|
|
19
|
+
//# sourceMappingURL=bind-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bind-cache.d.ts","sourceRoot":"","sources":["../src/bind-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEhF,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AACxH,MAAM,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,qBAAqB,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAAC;IAC9I,aAAa,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACrD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACzC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CA2BrD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAGnE;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE;IAAE,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,KAAK,0BAA0B,CAAC;IAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CAAE,EACvI,KAAK,EAAE,cAAc,GACpB,0BAA0B,GAAG,SAAS,CAIxC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export function createBindGroupCache() {
|
|
2
|
+
const entries = new Map();
|
|
3
|
+
return {
|
|
4
|
+
getOrCreate(drawId, group, identityTuple, factory) {
|
|
5
|
+
const identities = identityTuple.map(identityKey);
|
|
6
|
+
const key = `${drawId}:${group}:${identities.join("|")}`;
|
|
7
|
+
const existing = entries.get(key);
|
|
8
|
+
if (existing)
|
|
9
|
+
return existing.bindGroup;
|
|
10
|
+
const bindGroup = factory();
|
|
11
|
+
entries.set(key, { identities, bindGroup });
|
|
12
|
+
return bindGroup;
|
|
13
|
+
},
|
|
14
|
+
evictIdentity(identity) {
|
|
15
|
+
const needle = identityKey(identity);
|
|
16
|
+
for (const [key, entry] of entries) {
|
|
17
|
+
if (entry.identities.includes(needle))
|
|
18
|
+
entries.delete(key);
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
clearDraw(drawId) {
|
|
22
|
+
const prefix = `${drawId}:`;
|
|
23
|
+
for (const key of entries.keys())
|
|
24
|
+
if (key.startsWith(prefix))
|
|
25
|
+
entries.delete(key);
|
|
26
|
+
},
|
|
27
|
+
dispose() {
|
|
28
|
+
entries.clear();
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function identityKey(identity) {
|
|
33
|
+
if (typeof identity === "string" || typeof identity === "number")
|
|
34
|
+
return String(identity);
|
|
35
|
+
return `${identity.kind}:${identity.id}`;
|
|
36
|
+
}
|
|
37
|
+
export function subscribeEviction(resource, cache) {
|
|
38
|
+
const identity = resource.resourceIdentity;
|
|
39
|
+
if (!identity || typeof resource.onDestroy !== "function")
|
|
40
|
+
return undefined;
|
|
41
|
+
return resource.onDestroy(() => cache.evictIdentity(identity));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=bind-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bind-cache.js","sourceRoot":"","sources":["../src/bind-cache.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,oBAAoB;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwF,CAAC;IAEhH,OAAO;QACL,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO;YAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC,SAAS,CAAC;YACxC,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,aAAa,CAAC,QAAQ;YACpB,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;gBACnC,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,SAAS,CAAC,MAAM;YACd,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC;YAC5B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE;gBAAE,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpF,CAAC;QACD,OAAO;YACL,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAA+B;IACzD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1F,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAuI,EACvI,KAAqB;IAErB,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC;IAC3C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,SAAS,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IAC5E,OAAO,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjE,CAAC"}
|
package/dist/bundle.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Draw, type DrawCallOptions } from "./draw.ts";
|
|
2
|
+
import { type Effect } from "./effect.ts";
|
|
3
|
+
import type { CompileTarget } from "./target.ts";
|
|
4
|
+
import type { Gpu } from "./kernel.ts";
|
|
5
|
+
/**
|
|
6
|
+
* Records an explicit WebGPU render bundle: the draws in `record` are encoded once and replayed
|
|
7
|
+
* with `pass.bundles(bundle)`.
|
|
8
|
+
*
|
|
9
|
+
* A bundle freezes its commands, its bind groups and the target signature it was recorded for; the
|
|
10
|
+
* recorded state is re-checked at replay and a mismatch throws `AIGPU-R3-BUNDLE-STALE` instead of
|
|
11
|
+
* drawing something stale. Recording against a `Surface` is only legal inside a frame, because the
|
|
12
|
+
* surface's current texture — and therefore its format — is only defined there.
|
|
13
|
+
*/
|
|
14
|
+
export declare function bundle(gpu: Gpu, opts: BundleOptions, record: (recorder: BundleRecorder) => void): Bundle;
|
|
15
|
+
export interface BundleOptions {
|
|
16
|
+
readonly target: CompileTarget;
|
|
17
|
+
readonly label?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface BundleRecorder {
|
|
20
|
+
draw(drawable: Draw | Effect, opts?: DrawCallOptions): void;
|
|
21
|
+
}
|
|
22
|
+
export interface Bundle {
|
|
23
|
+
readonly id: string;
|
|
24
|
+
readonly gpu: GPURenderBundle;
|
|
25
|
+
}
|
|
26
|
+
/** Records explicit WebGPU render bundles and keeps the R3 stale signature checked at replay time. */
|
|
27
|
+
export declare function createBundle(device: {
|
|
28
|
+
readonly gpu: GPUDevice;
|
|
29
|
+
}, opts: BundleOptions, record: (recorder: BundleRecorder) => void): Bundle;
|
|
30
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"AACA,OAAO,EAAkJ,KAAK,IAAI,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5M,OAAO,EAA8B,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAA2B,MAAM,aAAa,CAAC;AAM1E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEvC;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,CAExG;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAC7D;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;CAC/B;AAKD,sGAAsG;AACtG,wBAAgB,YAAY,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;CAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,CAOzI"}
|
package/dist/bundle.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { createRenderBundle } from "./core/render-bundle.js";
|
|
2
|
+
import { drawUsesBlendConstant, drawUsesStencilReference, encodeDraw, registerDrawBundle } from "./draw.js";
|
|
3
|
+
import { InternalEffect, effectDraw } from "./effect.js";
|
|
4
|
+
import { normalizeSignature, signatureKeyOf, validateTargetSignature } from "./pipeline-store.js";
|
|
5
|
+
import { bundleBlendConstantError, bundleStencilReferenceError, surfaceNotInFrameError, AIGpuError } from "./errors.js";
|
|
6
|
+
import { isFrameActive, isSurface } from "./surface.js";
|
|
7
|
+
import { FRAME_BUNDLE } from "./frame-protocols.js";
|
|
8
|
+
import { liveKernel } from "./live-kernel.js";
|
|
9
|
+
/**
|
|
10
|
+
* Records an explicit WebGPU render bundle: the draws in `record` are encoded once and replayed
|
|
11
|
+
* with `pass.bundles(bundle)`.
|
|
12
|
+
*
|
|
13
|
+
* A bundle freezes its commands, its bind groups and the target signature it was recorded for; the
|
|
14
|
+
* recorded state is re-checked at replay and a mismatch throws `AIGPU-R3-BUNDLE-STALE` instead of
|
|
15
|
+
* drawing something stale. Recording against a `Surface` is only legal inside a frame, because the
|
|
16
|
+
* surface's current texture — and therefore its format — is only defined there.
|
|
17
|
+
*/
|
|
18
|
+
export function bundle(gpu, opts, record) {
|
|
19
|
+
return createBundle(liveKernel(gpu, "bundle").device, opts, record);
|
|
20
|
+
}
|
|
21
|
+
let nextBundleId = 1;
|
|
22
|
+
let recordingDepth = 0;
|
|
23
|
+
/** Records explicit WebGPU render bundles and keeps the R3 stale signature checked at replay time. */
|
|
24
|
+
export function createBundle(device, opts, record) {
|
|
25
|
+
const id = opts.label ?? `bundle${nextBundleId++}`;
|
|
26
|
+
if (isSurface(opts.target) && !isFrameActive())
|
|
27
|
+
throw surfaceNotInFrameError("bundle");
|
|
28
|
+
const signature = normalizeBundleSignature(opts.target);
|
|
29
|
+
const bundle = new RecordedBundle(device, id, signature);
|
|
30
|
+
bundle.record(record);
|
|
31
|
+
return bundle;
|
|
32
|
+
}
|
|
33
|
+
class RecordedBundle {
|
|
34
|
+
device;
|
|
35
|
+
id;
|
|
36
|
+
signature;
|
|
37
|
+
gpu;
|
|
38
|
+
#staleEvent;
|
|
39
|
+
#signatureKey;
|
|
40
|
+
#draws = new Set();
|
|
41
|
+
constructor(device, id, signature) {
|
|
42
|
+
this.device = device;
|
|
43
|
+
this.id = id;
|
|
44
|
+
this.signature = signature;
|
|
45
|
+
this.#signatureKey = signatureKeyOf(signature);
|
|
46
|
+
}
|
|
47
|
+
record(record) {
|
|
48
|
+
this.gpu = createRenderBundle(this.device, {
|
|
49
|
+
label: this.id,
|
|
50
|
+
colorFormats: this.signature.colors,
|
|
51
|
+
depthStencilFormat: this.signature.depth,
|
|
52
|
+
sampleCount: this.signature.sampleCount ?? 1,
|
|
53
|
+
record: (recorder) => this.#recordCommands(record, recorder.gpu),
|
|
54
|
+
});
|
|
55
|
+
for (const draw of this.#draws)
|
|
56
|
+
registerDrawBundle(draw, this);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Frame bundle protocol: `pass.bundles()` replays through this, so `frame.ts` never imports
|
|
60
|
+
* bundle.ts. The recorded bundle is its own protocol object — `gpu` and the staleness check.
|
|
61
|
+
*/
|
|
62
|
+
get [FRAME_BUNDLE]() { return this; }
|
|
63
|
+
markStale(event) {
|
|
64
|
+
if (recordingDepth > 0)
|
|
65
|
+
return;
|
|
66
|
+
this.#staleEvent ??= event;
|
|
67
|
+
}
|
|
68
|
+
assertReplayable(target) {
|
|
69
|
+
const actual = normalizeBundleSignature(target);
|
|
70
|
+
const actualKey = signatureKeyOf(actual);
|
|
71
|
+
if (this.#signatureKey !== actualKey)
|
|
72
|
+
throw bundleStaleError(this.id, targetSignatureStaleMessage(this.id, this.#signatureKey, actualKey));
|
|
73
|
+
if (this.#staleEvent)
|
|
74
|
+
throw bundleStaleError(this.id, staleEventMessage(this.id, this.#staleEvent));
|
|
75
|
+
}
|
|
76
|
+
remember(draw) {
|
|
77
|
+
this.#draws.add(draw);
|
|
78
|
+
}
|
|
79
|
+
#recordCommands(record, encoder) {
|
|
80
|
+
recordingDepth += 1;
|
|
81
|
+
try {
|
|
82
|
+
record(new ExplicitBundleRecorder(this, encoder));
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
recordingDepth -= 1;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
class ExplicitBundleRecorder {
|
|
90
|
+
bundle;
|
|
91
|
+
encoder;
|
|
92
|
+
constructor(bundle, encoder) {
|
|
93
|
+
this.bundle = bundle;
|
|
94
|
+
this.encoder = encoder;
|
|
95
|
+
}
|
|
96
|
+
draw(drawable, opts = {}) {
|
|
97
|
+
// Blend/writeMask are constructor-only draw pipeline state. If they ever become mutable or per-call,
|
|
98
|
+
// bundles need a new staleness dimension beyond the target signature checked at replay.
|
|
99
|
+
const draw = drawable instanceof InternalEffect ? effectDraw(drawable) : drawable;
|
|
100
|
+
// The blend constant is render-pass state; GPURenderBundleEncoder has no setBlendConstant, so reject at recording.
|
|
101
|
+
if (drawUsesBlendConstant(draw))
|
|
102
|
+
throw bundleBlendConstantError(this.bundle.id, draw.label);
|
|
103
|
+
// Likewise the stencil reference: GPURenderBundleEncoder has no setStencilReference. Stencil pipeline state without ref records fine.
|
|
104
|
+
if (drawUsesStencilReference(draw))
|
|
105
|
+
throw bundleStencilReferenceError(this.bundle.id, draw.label);
|
|
106
|
+
this.bundle.remember(draw);
|
|
107
|
+
encodeDraw(draw, this.encoder, this.bundle.signature, opts);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function normalizeBundleSignature(target) {
|
|
111
|
+
const signature = normalizeSignature(target);
|
|
112
|
+
validateTargetSignature(signature, "bundle");
|
|
113
|
+
return signature;
|
|
114
|
+
}
|
|
115
|
+
function targetSignatureStaleMessage(id, recordedKey, actualKey) {
|
|
116
|
+
return `bundle '${id}' is stale: the replay target signature does not match the recorded signature. Bundles freeze format/depth/sampleCount and bind groups.\n Recorded signature: ${recordedKey}\n Actual signature: ${actualKey}\n Fix: re-record the bundle for this target → ${id} = bundle(gpu, { target: scene }, ...)\n (re-recording is always your responsibility; the library only detects this).`;
|
|
117
|
+
}
|
|
118
|
+
function staleEventMessage(id, event) {
|
|
119
|
+
if (event.kind === "group-claim") {
|
|
120
|
+
return `bundle '${id}' is stale: group ${event.group} of draw\n '${event.drawLabel}' changed bind group after recording. Bundles freeze commands and bind groups.\n Fix: re-record it → ${id} = bundle(gpu, { target: scene }, ...)\n (re-recording is always your responsibility; the library only detects this).`;
|
|
121
|
+
}
|
|
122
|
+
return `bundle '${id}' is stale: binding \`${event.bindingName}\` (@group(${event.group}) @binding(${event.binding})) of draw\n '${event.drawLabel}' changed resource after recording. Bundles freeze commands and bind groups.\n Fix: re-record it → ${id} = bundle(gpu, { target: scene }, ...)\n (re-recording is always your responsibility; the library only detects this).`;
|
|
123
|
+
}
|
|
124
|
+
function bundleStaleError(id, message) {
|
|
125
|
+
return new AIGpuError({ code: "AIGPU-R3-BUNDLE-STALE", message, where: `bundle '${id}' replay` });
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Device } from "@aigpu/core";
|
|
2
|
+
import { type ClaimedGroupValidationContext, type ClaimedGroupValidationResult } from "./claim-validation.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Ends a render pass and maps native end-time failures back to raw group claims.
|
|
5
|
+
*
|
|
6
|
+
* Raw WebGPU validation scopes are device-global, so this abort helper drains
|
|
7
|
+
* only scopes still open after a failing pass end and suppresses every collected
|
|
8
|
+
* validation promise before rethrowing. Callers pass the fallback context they
|
|
9
|
+
* already used before this extraction so end-failure diagnostics stay unchanged.
|
|
10
|
+
*
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export declare function endRenderPassWithClaimValidation(device: Device, pass: GPURenderPassEncoder, validations: ClaimedGroupValidationResult[], fallbackContext?: ClaimedGroupValidationContext): void;
|
|
14
|
+
//# sourceMappingURL=claim-validation-encode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim-validation-encode.d.ts","sourceRoot":"","sources":["../src/claim-validation-encode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAGL,KAAK,6BAA6B,EAClC,KAAK,4BAA4B,EAClC,MAAM,uBAAuB,CAAC;AAG/B;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,oBAAoB,EAC1B,WAAW,EAAE,4BAA4B,EAAE,EAC3C,eAAe,CAAC,EAAE,6BAA6B,GAC9C,IAAI,CAYN"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { discardClaimedGroupValidationResults, popClaimedGroupValidationScopes, } from "./claim-validation.js";
|
|
2
|
+
import { claimedGroupNativeValidationError } from "./errors.js";
|
|
3
|
+
/**
|
|
4
|
+
* Ends a render pass and maps native end-time failures back to raw group claims.
|
|
5
|
+
*
|
|
6
|
+
* Raw WebGPU validation scopes are device-global, so this abort helper drains
|
|
7
|
+
* only scopes still open after a failing pass end and suppresses every collected
|
|
8
|
+
* validation promise before rethrowing. Callers pass the fallback context they
|
|
9
|
+
* already used before this extraction so end-failure diagnostics stay unchanged.
|
|
10
|
+
*
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export function endRenderPassWithClaimValidation(device, pass, validations, fallbackContext) {
|
|
14
|
+
try {
|
|
15
|
+
pass.end();
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
const scopes = popClaimedGroupValidationScopes(device);
|
|
19
|
+
discardClaimedGroupValidationResults(validations);
|
|
20
|
+
discardClaimedGroupValidationResults(scopes);
|
|
21
|
+
validations.length = 0;
|
|
22
|
+
const context = scopes[0]?.context ?? fallbackContext;
|
|
23
|
+
if (context)
|
|
24
|
+
throw claimedGroupNativeValidationError(context.label, context.group, error);
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=claim-validation-encode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim-validation-encode.js","sourceRoot":"","sources":["../src/claim-validation-encode.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oCAAoC,EACpC,+BAA+B,GAGhC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAC;AAEhE;;;;;;;;;GASG;AACH,MAAM,UAAU,gCAAgC,CAC9C,MAAc,EACd,IAA0B,EAC1B,WAA2C,EAC3C,eAA+C;IAE/C,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,+BAA+B,CAAC,MAAM,CAAC,CAAC;QACvD,oCAAoC,CAAC,WAAW,CAAC,CAAC;QAClD,oCAAoC,CAAC,MAAM,CAAC,CAAC;QAC7C,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,eAAe,CAAC;QACtD,IAAI,OAAO;YAAE,MAAM,iCAAiC,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1F,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { Device } from "@aigpu/core";
|
|
2
|
+
import { type AIGpuError } from "./errors.ts";
|
|
3
|
+
export interface ClaimedGroupValidationContext {
|
|
4
|
+
readonly label: string;
|
|
5
|
+
readonly group: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ClaimedGroupValidationResult {
|
|
8
|
+
readonly context: ClaimedGroupValidationContext;
|
|
9
|
+
readonly error: Promise<GPUError | null>;
|
|
10
|
+
}
|
|
11
|
+
export type ValidationErrorSink = (error: AIGpuError) => void | Promise<void>;
|
|
12
|
+
export interface ClaimedGroupValidationDoneOptions {
|
|
13
|
+
readonly errorSink?: ValidationErrorSink;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Opens a native WebGPU validation scope for one raw claimed bind group.
|
|
17
|
+
*
|
|
18
|
+
* WebGPU error scopes are device-global and strictly LIFO, so callers must pair
|
|
19
|
+
* this with `popLastClaimedGroupValidationScope()` immediately after the small
|
|
20
|
+
* protected encode operation. Metadata-backed claims bypass this helper because
|
|
21
|
+
* aigpu can validate their layout synchronously and the normal path should not
|
|
22
|
+
* pay for native error scopes.
|
|
23
|
+
*/
|
|
24
|
+
export declare function pushClaimedGroupValidationScope(device: Device, context: ClaimedGroupValidationContext): void;
|
|
25
|
+
/**
|
|
26
|
+
* Pops the most recent raw-claim scope in native LIFO order and returns its promise.
|
|
27
|
+
*
|
|
28
|
+
* The returned promise is delivered through `gpu.onError` and tracked by
|
|
29
|
+
* `Frame.done` / `gpu.settled()` after submit. Popping immediately keeps the device-global WebGPU scope stack from
|
|
30
|
+
* being shared accidentally by overlapping frames or one-shot draws.
|
|
31
|
+
*/
|
|
32
|
+
export declare function popLastClaimedGroupValidationScope(device: Device): ClaimedGroupValidationResult | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Pops every currently open raw-claim scope for this device in native LIFO order.
|
|
35
|
+
*
|
|
36
|
+
* Device-global WebGPU error scopes are not an ownership/collection boundary;
|
|
37
|
+
* this exists only for abort paths that must drain scopes left open by a failed
|
|
38
|
+
* protected encode region before rethrowing.
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
export declare function popClaimedGroupValidationScopes(device: Device): readonly ClaimedGroupValidationResult[];
|
|
43
|
+
/** Discards one open raw-claim scope after a synchronous encode failure. */
|
|
44
|
+
export declare function discardLastClaimedGroupValidationScope(device: Device): void;
|
|
45
|
+
/**
|
|
46
|
+
* Discards every currently open raw-claim scope for this device after aborting an encode region.
|
|
47
|
+
*
|
|
48
|
+
* This is intentionally device-global and abort-only: normal validation owners
|
|
49
|
+
* pop scopes immediately and store the returned promises on their frame/draw.
|
|
50
|
+
*
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
53
|
+
export declare function discardClaimedGroupValidationScopes(device: Device): void;
|
|
54
|
+
/** Suppresses already-popped validation promises when their frame/draw will not submit. */
|
|
55
|
+
export declare function discardClaimedGroupValidationResults(results: readonly ClaimedGroupValidationResult[]): void;
|
|
56
|
+
/**
|
|
57
|
+
* Resolves after the device queue reports submitted work completion, when supported.
|
|
58
|
+
*
|
|
59
|
+
* This is feature-guarded because the mock and some compatibility environments
|
|
60
|
+
* may omit `onSubmittedWorkDone`.
|
|
61
|
+
*/
|
|
62
|
+
export declare function submittedWorkDone(device: Device): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Awaits raw claimed-bind-group validation collected during encode.
|
|
65
|
+
*
|
|
66
|
+
* No scopes remain open here: native scopes were already popped in LIFO order
|
|
67
|
+
* immediately after each protected encode operation. Validation errors are
|
|
68
|
+
* delivered to the supplied device-level error sink as `AIGPU-R4-GROUP-VALIDATION`;
|
|
69
|
+
* this promise resolves after delivery and never rejects.
|
|
70
|
+
*/
|
|
71
|
+
export declare function claimedGroupValidationDone(device: Device, results?: readonly ClaimedGroupValidationResult[], opts?: ClaimedGroupValidationDoneOptions): Promise<void>;
|
|
72
|
+
export declare function preferClaimedGroupValidationResult(preferred: ClaimedGroupValidationResult, fallback: ClaimedGroupValidationResult): ClaimedGroupValidationResult;
|
|
73
|
+
//# sourceMappingURL=claim-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim-validation.d.ts","sourceRoot":"","sources":["../src/claim-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjF,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,6BAA6B,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9E,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC;CAC1C;AAID;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,6BAA6B,GAAG,IAAI,CAM5G;AAED;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS,CAM3G;AAED;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,4BAA4B,EAAE,CAQvG;AAED,4EAA4E;AAC5E,wBAAgB,sCAAsC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG3E;AAED;;;;;;;GAOG;AACH,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAExE;AAED,2FAA2F;AAC3F,wBAAgB,oCAAoC,CAAC,OAAO,EAAE,SAAS,4BAA4B,EAAE,GAAG,IAAI,CAE3G;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/D;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,SAAS,4BAA4B,EAAO,EAAE,IAAI,GAAE,iCAAsC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7K;AAED,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,4BAA4B,EAAE,QAAQ,EAAE,4BAA4B,GAAG,4BAA4B,CAKhK"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { claimedGroupNativeValidationError } from "./errors.js";
|
|
2
|
+
const pendingScopes = new WeakMap();
|
|
3
|
+
/**
|
|
4
|
+
* Opens a native WebGPU validation scope for one raw claimed bind group.
|
|
5
|
+
*
|
|
6
|
+
* WebGPU error scopes are device-global and strictly LIFO, so callers must pair
|
|
7
|
+
* this with `popLastClaimedGroupValidationScope()` immediately after the small
|
|
8
|
+
* protected encode operation. Metadata-backed claims bypass this helper because
|
|
9
|
+
* aigpu can validate their layout synchronously and the normal path should not
|
|
10
|
+
* pay for native error scopes.
|
|
11
|
+
*/
|
|
12
|
+
export function pushClaimedGroupValidationScope(device, context) {
|
|
13
|
+
if (!device.gpu.pushErrorScope || !device.gpu.popErrorScope)
|
|
14
|
+
return;
|
|
15
|
+
device.gpu.pushErrorScope("validation");
|
|
16
|
+
const pending = pendingScopes.get(device.gpu);
|
|
17
|
+
if (pending)
|
|
18
|
+
pending.push(context);
|
|
19
|
+
else
|
|
20
|
+
pendingScopes.set(device.gpu, [context]);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Pops the most recent raw-claim scope in native LIFO order and returns its promise.
|
|
24
|
+
*
|
|
25
|
+
* The returned promise is delivered through `gpu.onError` and tracked by
|
|
26
|
+
* `Frame.done` / `gpu.settled()` after submit. Popping immediately keeps the device-global WebGPU scope stack from
|
|
27
|
+
* being shared accidentally by overlapping frames or one-shot draws.
|
|
28
|
+
*/
|
|
29
|
+
export function popLastClaimedGroupValidationScope(device) {
|
|
30
|
+
const pending = pendingScopes.get(device.gpu);
|
|
31
|
+
if (!pending?.length || !device.gpu.popErrorScope)
|
|
32
|
+
return undefined;
|
|
33
|
+
const context = pending.pop();
|
|
34
|
+
if (!pending.length)
|
|
35
|
+
pendingScopes.delete(device.gpu);
|
|
36
|
+
return { context, error: device.gpu.popErrorScope() };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Pops every currently open raw-claim scope for this device in native LIFO order.
|
|
40
|
+
*
|
|
41
|
+
* Device-global WebGPU error scopes are not an ownership/collection boundary;
|
|
42
|
+
* this exists only for abort paths that must drain scopes left open by a failed
|
|
43
|
+
* protected encode region before rethrowing.
|
|
44
|
+
*
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
export function popClaimedGroupValidationScopes(device) {
|
|
48
|
+
const results = [];
|
|
49
|
+
let result = popLastClaimedGroupValidationScope(device);
|
|
50
|
+
while (result) {
|
|
51
|
+
results.push(result);
|
|
52
|
+
result = popLastClaimedGroupValidationScope(device);
|
|
53
|
+
}
|
|
54
|
+
return results;
|
|
55
|
+
}
|
|
56
|
+
/** Discards one open raw-claim scope after a synchronous encode failure. */
|
|
57
|
+
export function discardLastClaimedGroupValidationScope(device) {
|
|
58
|
+
const result = popLastClaimedGroupValidationScope(device);
|
|
59
|
+
if (result)
|
|
60
|
+
suppressClaimedGroupValidationResult(result);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Discards every currently open raw-claim scope for this device after aborting an encode region.
|
|
64
|
+
*
|
|
65
|
+
* This is intentionally device-global and abort-only: normal validation owners
|
|
66
|
+
* pop scopes immediately and store the returned promises on their frame/draw.
|
|
67
|
+
*
|
|
68
|
+
* @internal
|
|
69
|
+
*/
|
|
70
|
+
export function discardClaimedGroupValidationScopes(device) {
|
|
71
|
+
for (const result of popClaimedGroupValidationScopes(device))
|
|
72
|
+
suppressClaimedGroupValidationResult(result);
|
|
73
|
+
}
|
|
74
|
+
/** Suppresses already-popped validation promises when their frame/draw will not submit. */
|
|
75
|
+
export function discardClaimedGroupValidationResults(results) {
|
|
76
|
+
for (const result of results)
|
|
77
|
+
suppressClaimedGroupValidationResult(result);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Resolves after the device queue reports submitted work completion, when supported.
|
|
81
|
+
*
|
|
82
|
+
* This is feature-guarded because the mock and some compatibility environments
|
|
83
|
+
* may omit `onSubmittedWorkDone`.
|
|
84
|
+
*/
|
|
85
|
+
export function submittedWorkDone(device) {
|
|
86
|
+
return device.gpu.queue.onSubmittedWorkDone?.() ?? Promise.resolve();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Awaits raw claimed-bind-group validation collected during encode.
|
|
90
|
+
*
|
|
91
|
+
* No scopes remain open here: native scopes were already popped in LIFO order
|
|
92
|
+
* immediately after each protected encode operation. Validation errors are
|
|
93
|
+
* delivered to the supplied device-level error sink as `AIGPU-R4-GROUP-VALIDATION`;
|
|
94
|
+
* this promise resolves after delivery and never rejects.
|
|
95
|
+
*/
|
|
96
|
+
export function claimedGroupValidationDone(device, results = [], opts = {}) {
|
|
97
|
+
return settleClaimedGroupValidations(device, results, opts.errorSink ?? defaultErrorSink);
|
|
98
|
+
}
|
|
99
|
+
export function preferClaimedGroupValidationResult(preferred, fallback) {
|
|
100
|
+
return {
|
|
101
|
+
context: preferred.context,
|
|
102
|
+
error: preferValidationError(preferred.error, fallback.error),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
async function preferValidationError(preferred, fallback) {
|
|
106
|
+
const results = await Promise.allSettled([preferred, fallback]);
|
|
107
|
+
for (const result of results) {
|
|
108
|
+
if (result.status === "fulfilled" && result.value)
|
|
109
|
+
return result.value;
|
|
110
|
+
}
|
|
111
|
+
const rejection = results.find((result) => result.status === "rejected");
|
|
112
|
+
if (rejection?.status === "rejected")
|
|
113
|
+
throw rejection.reason;
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
async function settleClaimedGroupValidations(device, results, errorSink) {
|
|
117
|
+
await submittedWorkDone(device);
|
|
118
|
+
for (const result of results) {
|
|
119
|
+
try {
|
|
120
|
+
const error = await result.error;
|
|
121
|
+
if (error)
|
|
122
|
+
await errorSink(claimedGroupNativeValidationError(result.context.label, result.context.group, error));
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
await errorSink(claimedGroupNativeValidationError(result.context.label, result.context.group, error));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function suppressClaimedGroupValidationResult(result) {
|
|
130
|
+
void result.error.catch(() => undefined);
|
|
131
|
+
}
|
|
132
|
+
function defaultErrorSink(error) {
|
|
133
|
+
console.error(error);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=claim-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim-validation.js","sourceRoot":"","sources":["../src/claim-validation.ts"],"names":[],"mappings":"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"}
|