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.
Files changed (491) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +85 -0
  3. package/bin/aigpu.js +15 -0
  4. package/client.d.ts +15 -0
  5. package/dist/agent-tools.d.ts +61 -0
  6. package/dist/agent-tools.d.ts.map +1 -0
  7. package/dist/agent-tools.js +107 -0
  8. package/dist/agent-tools.js.map +1 -0
  9. package/dist/agent.d.ts +56 -0
  10. package/dist/agent.d.ts.map +1 -0
  11. package/dist/agent.js +243 -0
  12. package/dist/agent.js.map +1 -0
  13. package/dist/api-types.d.ts +56 -0
  14. package/dist/api-types.d.ts.map +1 -0
  15. package/dist/api-types.js +2 -0
  16. package/dist/api-types.js.map +1 -0
  17. package/dist/bind-cache.d.ts +19 -0
  18. package/dist/bind-cache.d.ts.map +1 -0
  19. package/dist/bind-cache.js +43 -0
  20. package/dist/bind-cache.js.map +1 -0
  21. package/dist/bundle.d.ts +30 -0
  22. package/dist/bundle.d.ts.map +1 -0
  23. package/dist/bundle.js +127 -0
  24. package/dist/bundle.js.map +1 -0
  25. package/dist/claim-validation-encode.d.ts +14 -0
  26. package/dist/claim-validation-encode.d.ts.map +1 -0
  27. package/dist/claim-validation-encode.js +28 -0
  28. package/dist/claim-validation-encode.js.map +1 -0
  29. package/dist/claim-validation.d.ts +73 -0
  30. package/dist/claim-validation.d.ts.map +1 -0
  31. package/dist/claim-validation.js +135 -0
  32. package/dist/claim-validation.js.map +1 -0
  33. package/dist/cli/bin/aigpu.js +101 -0
  34. package/dist/cli/lib/check/run.js +153 -0
  35. package/dist/cli/lib/docs/commands/cat.js +12 -0
  36. package/dist/cli/lib/docs/commands/find.js +180 -0
  37. package/dist/cli/lib/docs/commands/grep.js +49 -0
  38. package/dist/cli/lib/docs/commands/ls.js +41 -0
  39. package/dist/cli/lib/docs/commands/path.js +12 -0
  40. package/dist/cli/lib/docs/commands/resolve.js +41 -0
  41. package/dist/cli/lib/docs/commands/shared.js +13 -0
  42. package/dist/cli/lib/docs/commands/symbols.js +25 -0
  43. package/dist/cli/lib/docs/errors.js +8 -0
  44. package/dist/cli/lib/docs/generate/check-drift.js +61 -0
  45. package/dist/cli/lib/docs/generate/cli.js +12 -0
  46. package/dist/cli/lib/docs/generate/generate.js +113 -0
  47. package/dist/cli/lib/docs/generate/manifest.js +218 -0
  48. package/dist/cli/lib/docs/generate/skill.js +150 -0
  49. package/dist/cli/lib/docs/help.js +21 -0
  50. package/dist/cli/lib/docs/index.js +62 -0
  51. package/dist/cli/lib/docs/model.js +7 -0
  52. package/dist/cli/lib/docs/run.js +24 -0
  53. package/dist/cli/lib/docs/service.js +119 -0
  54. package/dist/cli/lib/doctor/run.js +236 -0
  55. package/dist/cli/lib/examples/errors.js +13 -0
  56. package/dist/cli/lib/examples/hashing.js +9 -0
  57. package/dist/cli/lib/examples/help.js +13 -0
  58. package/dist/cli/lib/examples/local-source.js +142 -0
  59. package/dist/cli/lib/examples/paths.js +12 -0
  60. package/dist/cli/lib/examples/pull.js +58 -0
  61. package/dist/cli/lib/examples/run.js +71 -0
  62. package/dist/cli/lib/examples/search.js +6 -0
  63. package/dist/cli/lib/examples/service.js +118 -0
  64. package/dist/cli/lib/generated/docs-manifest.generated.js +4758 -0
  65. package/dist/cli/lib/install-dawn/run.js +24 -0
  66. package/dist/cli/lib/install-software-renderer/run.js +17 -0
  67. package/dist/cli/lib/mcp/http.js +93 -0
  68. package/dist/cli/lib/mcp/server.js +258 -0
  69. package/dist/cli/lib/mcp/stdio.js +34 -0
  70. package/dist/cli/lib/snapshot/png.js +62 -0
  71. package/dist/cli/lib/snapshot/render.js +22 -0
  72. package/dist/cli/lib/snapshot/run.js +79 -0
  73. package/dist/cli/lib/snapshot/shaders.js +11 -0
  74. package/dist/cli/package.json +4 -0
  75. package/dist/client.d.ts +12 -0
  76. package/dist/client.d.ts.map +1 -0
  77. package/dist/client.js +2 -0
  78. package/dist/client.js.map +1 -0
  79. package/dist/clock.d.ts +26 -0
  80. package/dist/clock.d.ts.map +1 -0
  81. package/dist/clock.js +50 -0
  82. package/dist/clock.js.map +1 -0
  83. package/dist/compute.d.ts +41 -0
  84. package/dist/compute.d.ts.map +1 -0
  85. package/dist/compute.js +132 -0
  86. package/dist/compute.js.map +1 -0
  87. package/dist/core/render-bundle.d.ts +30 -0
  88. package/dist/core/render-bundle.d.ts.map +1 -0
  89. package/dist/core/render-bundle.js +39 -0
  90. package/dist/core/render-bundle.js.map +1 -0
  91. package/dist/core/storage-buffer.d.ts +81 -0
  92. package/dist/core/storage-buffer.d.ts.map +1 -0
  93. package/dist/core/storage-buffer.js +91 -0
  94. package/dist/core/storage-buffer.js.map +1 -0
  95. package/dist/core/structured-uniform.d.ts +33 -0
  96. package/dist/core/structured-uniform.d.ts.map +1 -0
  97. package/dist/core/structured-uniform.js +110 -0
  98. package/dist/core/structured-uniform.js.map +1 -0
  99. package/dist/core/uniform-pool-internals.d.ts +12 -0
  100. package/dist/core/uniform-pool-internals.d.ts.map +1 -0
  101. package/dist/core/uniform-pool-internals.js +24 -0
  102. package/dist/core/uniform-pool-internals.js.map +1 -0
  103. package/dist/core/uniform-pool-types.d.ts +22 -0
  104. package/dist/core/uniform-pool-types.d.ts.map +1 -0
  105. package/dist/core/uniform-pool-types.js +2 -0
  106. package/dist/core/uniform-pool-types.js.map +1 -0
  107. package/dist/core/uniform-pool.d.ts +22 -0
  108. package/dist/core/uniform-pool.d.ts.map +1 -0
  109. package/dist/core/uniform-pool.js +128 -0
  110. package/dist/core/uniform-pool.js.map +1 -0
  111. package/dist/core/uniform.d.ts +55 -0
  112. package/dist/core/uniform.d.ts.map +1 -0
  113. package/dist/core/uniform.js +64 -0
  114. package/dist/core/uniform.js.map +1 -0
  115. package/dist/core/wgsl-alignment.d.ts +24 -0
  116. package/dist/core/wgsl-alignment.d.ts.map +1 -0
  117. package/dist/core/wgsl-alignment.js +81 -0
  118. package/dist/core/wgsl-alignment.js.map +1 -0
  119. package/dist/core.d.ts +13 -0
  120. package/dist/core.d.ts.map +1 -0
  121. package/dist/core.js +7 -0
  122. package/dist/core.js.map +1 -0
  123. package/dist/dom.d.ts +37 -0
  124. package/dist/dom.d.ts.map +1 -0
  125. package/dist/dom.js +81 -0
  126. package/dist/dom.js.map +1 -0
  127. package/dist/draw-protocols.d.ts +36 -0
  128. package/dist/draw-protocols.d.ts.map +1 -0
  129. package/dist/draw-protocols.js +10 -0
  130. package/dist/draw-protocols.js.map +1 -0
  131. package/dist/draw.d.ts +248 -0
  132. package/dist/draw.d.ts.map +1 -0
  133. package/dist/draw.js +890 -0
  134. package/dist/draw.js.map +1 -0
  135. package/dist/effect.d.ts +53 -0
  136. package/dist/effect.d.ts.map +1 -0
  137. package/dist/effect.js +75 -0
  138. package/dist/effect.js.map +1 -0
  139. package/dist/entry-metadata.d.ts +16 -0
  140. package/dist/entry-metadata.d.ts.map +1 -0
  141. package/dist/entry-metadata.js +27 -0
  142. package/dist/entry-metadata.js.map +1 -0
  143. package/dist/errors.d.ts +96 -0
  144. package/dist/errors.d.ts.map +1 -0
  145. package/dist/errors.js +616 -0
  146. package/dist/errors.js.map +1 -0
  147. package/dist/frame-protocols.d.ts +107 -0
  148. package/dist/frame-protocols.d.ts.map +1 -0
  149. package/dist/frame-protocols.js +20 -0
  150. package/dist/frame-protocols.js.map +1 -0
  151. package/dist/frame-state.d.ts +32 -0
  152. package/dist/frame-state.d.ts.map +1 -0
  153. package/dist/frame-state.js +62 -0
  154. package/dist/frame-state.js.map +1 -0
  155. package/dist/frame.d.ts +127 -0
  156. package/dist/frame.d.ts.map +1 -0
  157. package/dist/frame.js +645 -0
  158. package/dist/frame.js.map +1 -0
  159. package/dist/group-claim.d.ts +9 -0
  160. package/dist/group-claim.d.ts.map +1 -0
  161. package/dist/group-claim.js +7 -0
  162. package/dist/group-claim.js.map +1 -0
  163. package/dist/index.d.ts +41 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +27 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/indirect.d.ts +39 -0
  168. package/dist/indirect.d.ts.map +1 -0
  169. package/dist/indirect.js +61 -0
  170. package/dist/indirect.js.map +1 -0
  171. package/dist/init-from-device.d.ts +11 -0
  172. package/dist/init-from-device.d.ts.map +1 -0
  173. package/dist/init-from-device.js +56 -0
  174. package/dist/init-from-device.js.map +1 -0
  175. package/dist/init.d.ts +12 -0
  176. package/dist/init.d.ts.map +1 -0
  177. package/dist/init.js +7 -0
  178. package/dist/init.js.map +1 -0
  179. package/dist/kernel.d.ts +104 -0
  180. package/dist/kernel.d.ts.map +1 -0
  181. package/dist/kernel.js +151 -0
  182. package/dist/kernel.js.map +1 -0
  183. package/dist/lifecycle.d.ts +10 -0
  184. package/dist/lifecycle.d.ts.map +1 -0
  185. package/dist/lifecycle.js +21 -0
  186. package/dist/lifecycle.js.map +1 -0
  187. package/dist/live-kernel.d.ts +48 -0
  188. package/dist/live-kernel.d.ts.map +1 -0
  189. package/dist/live-kernel.js +67 -0
  190. package/dist/live-kernel.js.map +1 -0
  191. package/dist/mock.d.ts +42 -0
  192. package/dist/mock.d.ts.map +1 -0
  193. package/dist/mock.js +29 -0
  194. package/dist/mock.js.map +1 -0
  195. package/dist/node.d.ts +48 -0
  196. package/dist/node.d.ts.map +1 -0
  197. package/dist/node.js +36 -0
  198. package/dist/node.js.map +1 -0
  199. package/dist/ping-pong.d.ts +19 -0
  200. package/dist/ping-pong.d.ts.map +1 -0
  201. package/dist/ping-pong.js +67 -0
  202. package/dist/ping-pong.js.map +1 -0
  203. package/dist/pipeline-store.d.ts +89 -0
  204. package/dist/pipeline-store.d.ts.map +1 -0
  205. package/dist/pipeline-store.js +366 -0
  206. package/dist/pipeline-store.js.map +1 -0
  207. package/dist/query-ring.d.ts +91 -0
  208. package/dist/query-ring.d.ts.map +1 -0
  209. package/dist/query-ring.js +178 -0
  210. package/dist/query-ring.js.map +1 -0
  211. package/dist/render-service.d.ts +23 -0
  212. package/dist/render-service.d.ts.map +1 -0
  213. package/dist/render-service.js +37 -0
  214. package/dist/render-service.js.map +1 -0
  215. package/dist/sampler.d.ts +19 -0
  216. package/dist/sampler.d.ts.map +1 -0
  217. package/dist/sampler.js +46 -0
  218. package/dist/sampler.js.map +1 -0
  219. package/dist/scene/camera.d.ts +91 -0
  220. package/dist/scene/camera.d.ts.map +1 -0
  221. package/dist/scene/camera.js +221 -0
  222. package/dist/scene/camera.js.map +1 -0
  223. package/dist/scene/geometries.d.ts +26 -0
  224. package/dist/scene/geometries.d.ts.map +1 -0
  225. package/dist/scene/geometries.js +26 -0
  226. package/dist/scene/geometries.js.map +1 -0
  227. package/dist/scene/geometry-descriptor.d.ts +120 -0
  228. package/dist/scene/geometry-descriptor.d.ts.map +1 -0
  229. package/dist/scene/geometry-descriptor.js +378 -0
  230. package/dist/scene/geometry-descriptor.js.map +1 -0
  231. package/dist/scene/geometry-recipe.d.ts +41 -0
  232. package/dist/scene/geometry-recipe.d.ts.map +1 -0
  233. package/dist/scene/geometry-recipe.js +40 -0
  234. package/dist/scene/geometry-recipe.js.map +1 -0
  235. package/dist/scene/geometry-src/camera-math.d.ts +6 -0
  236. package/dist/scene/geometry-src/camera-math.d.ts.map +1 -0
  237. package/dist/scene/geometry-src/camera-math.js +47 -0
  238. package/dist/scene/geometry-src/camera-math.js.map +1 -0
  239. package/dist/scene/geometry-src/camera.d.ts +10 -0
  240. package/dist/scene/geometry-src/camera.d.ts.map +1 -0
  241. package/dist/scene/geometry-src/camera.js +2 -0
  242. package/dist/scene/geometry-src/camera.js.map +1 -0
  243. package/dist/scene/geometry-src/capsule-data.d.ts +10 -0
  244. package/dist/scene/geometry-src/capsule-data.d.ts.map +1 -0
  245. package/dist/scene/geometry-src/capsule-data.js +61 -0
  246. package/dist/scene/geometry-src/capsule-data.js.map +1 -0
  247. package/dist/scene/geometry-src/cone-data.d.ts +13 -0
  248. package/dist/scene/geometry-src/cone-data.d.ts.map +1 -0
  249. package/dist/scene/geometry-src/cone-data.js +52 -0
  250. package/dist/scene/geometry-src/cone-data.js.map +1 -0
  251. package/dist/scene/geometry-src/cylinder-data.d.ts +14 -0
  252. package/dist/scene/geometry-src/cylinder-data.d.ts.map +1 -0
  253. package/dist/scene/geometry-src/cylinder-data.js +58 -0
  254. package/dist/scene/geometry-src/cylinder-data.js.map +1 -0
  255. package/dist/scene/geometry-src/deg-to-rad.d.ts +2 -0
  256. package/dist/scene/geometry-src/deg-to-rad.d.ts.map +1 -0
  257. package/dist/scene/geometry-src/deg-to-rad.js +4 -0
  258. package/dist/scene/geometry-src/deg-to-rad.js.map +1 -0
  259. package/dist/scene/geometry-src/disk-data.d.ts +12 -0
  260. package/dist/scene/geometry-src/disk-data.d.ts.map +1 -0
  261. package/dist/scene/geometry-src/disk-data.js +21 -0
  262. package/dist/scene/geometry-src/disk-data.js.map +1 -0
  263. package/dist/scene/geometry-src/errors.d.ts +3 -0
  264. package/dist/scene/geometry-src/errors.d.ts.map +1 -0
  265. package/dist/scene/geometry-src/errors.js +5 -0
  266. package/dist/scene/geometry-src/errors.js.map +1 -0
  267. package/dist/scene/geometry-src/icosphere-data.d.ts +8 -0
  268. package/dist/scene/geometry-src/icosphere-data.d.ts.map +1 -0
  269. package/dist/scene/geometry-src/icosphere-data.js +58 -0
  270. package/dist/scene/geometry-src/icosphere-data.js.map +1 -0
  271. package/dist/scene/geometry-src/index.d.ts +36 -0
  272. package/dist/scene/geometry-src/index.d.ts.map +1 -0
  273. package/dist/scene/geometry-src/index.js +21 -0
  274. package/dist/scene/geometry-src/index.js.map +1 -0
  275. package/dist/scene/geometry-src/mesh-box.d.ts +8 -0
  276. package/dist/scene/geometry-src/mesh-box.d.ts.map +1 -0
  277. package/dist/scene/geometry-src/mesh-box.js +57 -0
  278. package/dist/scene/geometry-src/mesh-box.js.map +1 -0
  279. package/dist/scene/geometry-src/mesh-cache.d.ts +4 -0
  280. package/dist/scene/geometry-src/mesh-cache.d.ts.map +1 -0
  281. package/dist/scene/geometry-src/mesh-cache.js +14 -0
  282. package/dist/scene/geometry-src/mesh-cache.js.map +1 -0
  283. package/dist/scene/geometry-src/mesh-capsule.d.ts +14 -0
  284. package/dist/scene/geometry-src/mesh-capsule.d.ts.map +1 -0
  285. package/dist/scene/geometry-src/mesh-capsule.js +52 -0
  286. package/dist/scene/geometry-src/mesh-capsule.js.map +1 -0
  287. package/dist/scene/geometry-src/mesh-cone.d.ts +16 -0
  288. package/dist/scene/geometry-src/mesh-cone.d.ts.map +1 -0
  289. package/dist/scene/geometry-src/mesh-cone.js +54 -0
  290. package/dist/scene/geometry-src/mesh-cone.js.map +1 -0
  291. package/dist/scene/geometry-src/mesh-cylinder.d.ts +18 -0
  292. package/dist/scene/geometry-src/mesh-cylinder.d.ts.map +1 -0
  293. package/dist/scene/geometry-src/mesh-cylinder.js +67 -0
  294. package/dist/scene/geometry-src/mesh-cylinder.js.map +1 -0
  295. package/dist/scene/geometry-src/mesh-disk.d.ts +11 -0
  296. package/dist/scene/geometry-src/mesh-disk.d.ts.map +1 -0
  297. package/dist/scene/geometry-src/mesh-disk.js +45 -0
  298. package/dist/scene/geometry-src/mesh-disk.js.map +1 -0
  299. package/dist/scene/geometry-src/mesh-dodecahedron.d.ts +4 -0
  300. package/dist/scene/geometry-src/mesh-dodecahedron.d.ts.map +1 -0
  301. package/dist/scene/geometry-src/mesh-dodecahedron.js +10 -0
  302. package/dist/scene/geometry-src/mesh-dodecahedron.js.map +1 -0
  303. package/dist/scene/geometry-src/mesh-fullscreen-quad.d.ts +7 -0
  304. package/dist/scene/geometry-src/mesh-fullscreen-quad.d.ts.map +1 -0
  305. package/dist/scene/geometry-src/mesh-fullscreen-quad.js +39 -0
  306. package/dist/scene/geometry-src/mesh-fullscreen-quad.js.map +1 -0
  307. package/dist/scene/geometry-src/mesh-icosahedron.d.ts +4 -0
  308. package/dist/scene/geometry-src/mesh-icosahedron.d.ts.map +1 -0
  309. package/dist/scene/geometry-src/mesh-icosahedron.js +10 -0
  310. package/dist/scene/geometry-src/mesh-icosahedron.js.map +1 -0
  311. package/dist/scene/geometry-src/mesh-icosphere.d.ts +11 -0
  312. package/dist/scene/geometry-src/mesh-icosphere.d.ts.map +1 -0
  313. package/dist/scene/geometry-src/mesh-icosphere.js +47 -0
  314. package/dist/scene/geometry-src/mesh-icosphere.js.map +1 -0
  315. package/dist/scene/geometry-src/mesh-octahedron.d.ts +4 -0
  316. package/dist/scene/geometry-src/mesh-octahedron.d.ts.map +1 -0
  317. package/dist/scene/geometry-src/mesh-octahedron.js +10 -0
  318. package/dist/scene/geometry-src/mesh-octahedron.js.map +1 -0
  319. package/dist/scene/geometry-src/mesh-plane.d.ts +13 -0
  320. package/dist/scene/geometry-src/mesh-plane.d.ts.map +1 -0
  321. package/dist/scene/geometry-src/mesh-plane.js +51 -0
  322. package/dist/scene/geometry-src/mesh-plane.js.map +1 -0
  323. package/dist/scene/geometry-src/mesh-ring.d.ts +12 -0
  324. package/dist/scene/geometry-src/mesh-ring.d.ts.map +1 -0
  325. package/dist/scene/geometry-src/mesh-ring.js +47 -0
  326. package/dist/scene/geometry-src/mesh-ring.js.map +1 -0
  327. package/dist/scene/geometry-src/mesh-sphere.d.ts +10 -0
  328. package/dist/scene/geometry-src/mesh-sphere.d.ts.map +1 -0
  329. package/dist/scene/geometry-src/mesh-sphere.js +51 -0
  330. package/dist/scene/geometry-src/mesh-sphere.js.map +1 -0
  331. package/dist/scene/geometry-src/mesh-tetrahedron.d.ts +5 -0
  332. package/dist/scene/geometry-src/mesh-tetrahedron.d.ts.map +1 -0
  333. package/dist/scene/geometry-src/mesh-tetrahedron.js +10 -0
  334. package/dist/scene/geometry-src/mesh-tetrahedron.js.map +1 -0
  335. package/dist/scene/geometry-src/mesh-torus.d.ts +17 -0
  336. package/dist/scene/geometry-src/mesh-torus.d.ts.map +1 -0
  337. package/dist/scene/geometry-src/mesh-torus.js +56 -0
  338. package/dist/scene/geometry-src/mesh-torus.js.map +1 -0
  339. package/dist/scene/geometry-src/mesh-types.d.ts +38 -0
  340. package/dist/scene/geometry-src/mesh-types.d.ts.map +1 -0
  341. package/dist/scene/geometry-src/mesh-types.js +2 -0
  342. package/dist/scene/geometry-src/mesh-types.js.map +1 -0
  343. package/dist/scene/geometry-src/mesh.d.ts +61 -0
  344. package/dist/scene/geometry-src/mesh.d.ts.map +1 -0
  345. package/dist/scene/geometry-src/mesh.js +49 -0
  346. package/dist/scene/geometry-src/mesh.js.map +1 -0
  347. package/dist/scene/geometry-src/orthographic-camera.d.ts +14 -0
  348. package/dist/scene/geometry-src/orthographic-camera.d.ts.map +1 -0
  349. package/dist/scene/geometry-src/orthographic-camera.js +9 -0
  350. package/dist/scene/geometry-src/orthographic-camera.js.map +1 -0
  351. package/dist/scene/geometry-src/perspective-camera.d.ts +12 -0
  352. package/dist/scene/geometry-src/perspective-camera.d.ts.map +1 -0
  353. package/dist/scene/geometry-src/perspective-camera.js +9 -0
  354. package/dist/scene/geometry-src/perspective-camera.js.map +1 -0
  355. package/dist/scene/geometry-src/plane-data.d.ts +12 -0
  356. package/dist/scene/geometry-src/plane-data.d.ts.map +1 -0
  357. package/dist/scene/geometry-src/plane-data.js +25 -0
  358. package/dist/scene/geometry-src/plane-data.js.map +1 -0
  359. package/dist/scene/geometry-src/polyhedron-data.d.ts +7 -0
  360. package/dist/scene/geometry-src/polyhedron-data.d.ts.map +1 -0
  361. package/dist/scene/geometry-src/polyhedron-data.js +42 -0
  362. package/dist/scene/geometry-src/polyhedron-data.js.map +1 -0
  363. package/dist/scene/geometry-src/polyhedron-mesh.d.ts +10 -0
  364. package/dist/scene/geometry-src/polyhedron-mesh.d.ts.map +1 -0
  365. package/dist/scene/geometry-src/polyhedron-mesh.js +37 -0
  366. package/dist/scene/geometry-src/polyhedron-mesh.js.map +1 -0
  367. package/dist/scene/geometry-src/polyhedron-seeds.d.ts +6 -0
  368. package/dist/scene/geometry-src/polyhedron-seeds.d.ts.map +1 -0
  369. package/dist/scene/geometry-src/polyhedron-seeds.js +51 -0
  370. package/dist/scene/geometry-src/polyhedron-seeds.js.map +1 -0
  371. package/dist/scene/geometry-src/primitive-data-utils.d.ts +9 -0
  372. package/dist/scene/geometry-src/primitive-data-utils.d.ts.map +1 -0
  373. package/dist/scene/geometry-src/primitive-data-utils.js +36 -0
  374. package/dist/scene/geometry-src/primitive-data-utils.js.map +1 -0
  375. package/dist/scene/geometry-src/ring-data.d.ts +13 -0
  376. package/dist/scene/geometry-src/ring-data.d.ts.map +1 -0
  377. package/dist/scene/geometry-src/ring-data.js +24 -0
  378. package/dist/scene/geometry-src/ring-data.js.map +1 -0
  379. package/dist/scene/geometry-src/sphere-data.d.ts +11 -0
  380. package/dist/scene/geometry-src/sphere-data.d.ts.map +1 -0
  381. package/dist/scene/geometry-src/sphere-data.js +31 -0
  382. package/dist/scene/geometry-src/sphere-data.js.map +1 -0
  383. package/dist/scene/geometry-src/srgb.d.ts +5 -0
  384. package/dist/scene/geometry-src/srgb.d.ts.map +1 -0
  385. package/dist/scene/geometry-src/srgb.js +23 -0
  386. package/dist/scene/geometry-src/srgb.js.map +1 -0
  387. package/dist/scene/geometry-src/torus-data.d.ts +11 -0
  388. package/dist/scene/geometry-src/torus-data.d.ts.map +1 -0
  389. package/dist/scene/geometry-src/torus-data.js +38 -0
  390. package/dist/scene/geometry-src/torus-data.js.map +1 -0
  391. package/dist/scene/geometry-src/vertex-layout.d.ts +2 -0
  392. package/dist/scene/geometry-src/vertex-layout.d.ts.map +1 -0
  393. package/dist/scene/geometry-src/vertex-layout.js +2 -0
  394. package/dist/scene/geometry-src/vertex-layout.js.map +1 -0
  395. package/dist/scene/geometry.d.ts +70 -0
  396. package/dist/scene/geometry.d.ts.map +1 -0
  397. package/dist/scene/geometry.js +71 -0
  398. package/dist/scene/geometry.js.map +1 -0
  399. package/dist/scene/orbit.d.ts +9 -0
  400. package/dist/scene/orbit.d.ts.map +1 -0
  401. package/dist/scene/orbit.js +15 -0
  402. package/dist/scene/orbit.js.map +1 -0
  403. package/dist/scene/tree/errors.d.ts +4 -0
  404. package/dist/scene/tree/errors.d.ts.map +1 -0
  405. package/dist/scene/tree/errors.js +19 -0
  406. package/dist/scene/tree/errors.js.map +1 -0
  407. package/dist/scene/tree/light.d.ts +42 -0
  408. package/dist/scene/tree/light.d.ts.map +1 -0
  409. package/dist/scene/tree/light.js +102 -0
  410. package/dist/scene/tree/light.js.map +1 -0
  411. package/dist/scene/tree/material.d.ts +79 -0
  412. package/dist/scene/tree/material.d.ts.map +1 -0
  413. package/dist/scene/tree/material.js +117 -0
  414. package/dist/scene/tree/material.js.map +1 -0
  415. package/dist/scene/tree/math.d.ts +26 -0
  416. package/dist/scene/tree/math.d.ts.map +1 -0
  417. package/dist/scene/tree/math.js +217 -0
  418. package/dist/scene/tree/math.js.map +1 -0
  419. package/dist/scene/tree/mesh-node.d.ts +17 -0
  420. package/dist/scene/tree/mesh-node.d.ts.map +1 -0
  421. package/dist/scene/tree/mesh-node.js +24 -0
  422. package/dist/scene/tree/mesh-node.js.map +1 -0
  423. package/dist/scene/tree/node.d.ts +70 -0
  424. package/dist/scene/tree/node.d.ts.map +1 -0
  425. package/dist/scene/tree/node.js +220 -0
  426. package/dist/scene/tree/node.js.map +1 -0
  427. package/dist/scene/tree/orbit-controls.d.ts +69 -0
  428. package/dist/scene/tree/orbit-controls.d.ts.map +1 -0
  429. package/dist/scene/tree/orbit-controls.js +226 -0
  430. package/dist/scene/tree/orbit-controls.js.map +1 -0
  431. package/dist/scene.d.ts +21 -0
  432. package/dist/scene.d.ts.map +1 -0
  433. package/dist/scene.js +11 -0
  434. package/dist/scene.js.map +1 -0
  435. package/dist/set-core.d.ts +50 -0
  436. package/dist/set-core.d.ts.map +1 -0
  437. package/dist/set-core.js +268 -0
  438. package/dist/set-core.js.map +1 -0
  439. package/dist/set-layouts.d.ts +20 -0
  440. package/dist/set-layouts.d.ts.map +1 -0
  441. package/dist/set-layouts.js +103 -0
  442. package/dist/set-layouts.js.map +1 -0
  443. package/dist/set-packing.d.ts +4 -0
  444. package/dist/set-packing.d.ts.map +1 -0
  445. package/dist/set-packing.js +82 -0
  446. package/dist/set-packing.js.map +1 -0
  447. package/dist/set-resources.d.ts +20 -0
  448. package/dist/set-resources.d.ts.map +1 -0
  449. package/dist/set-resources.js +140 -0
  450. package/dist/set-resources.js.map +1 -0
  451. package/dist/shader-source.d.ts +4 -0
  452. package/dist/shader-source.d.ts.map +1 -0
  453. package/dist/shader-source.js +21 -0
  454. package/dist/shader-source.js.map +1 -0
  455. package/dist/storage.d.ts +38 -0
  456. package/dist/storage.d.ts.map +1 -0
  457. package/dist/storage.js +76 -0
  458. package/dist/storage.js.map +1 -0
  459. package/dist/surface.d.ts +89 -0
  460. package/dist/surface.d.ts.map +1 -0
  461. package/dist/surface.js +243 -0
  462. package/dist/surface.js.map +1 -0
  463. package/dist/target-offscreen.d.ts +41 -0
  464. package/dist/target-offscreen.d.ts.map +1 -0
  465. package/dist/target-offscreen.js +115 -0
  466. package/dist/target-offscreen.js.map +1 -0
  467. package/dist/target-utils.d.ts +37 -0
  468. package/dist/target-utils.d.ts.map +1 -0
  469. package/dist/target-utils.js +103 -0
  470. package/dist/target-utils.js.map +1 -0
  471. package/dist/target.d.ts +65 -0
  472. package/dist/target.d.ts.map +1 -0
  473. package/dist/target.js +2 -0
  474. package/dist/target.js.map +1 -0
  475. package/dist/timer.d.ts +78 -0
  476. package/dist/timer.d.ts.map +1 -0
  477. package/dist/timer.js +261 -0
  478. package/dist/timer.js.map +1 -0
  479. package/dist/uniforms-layout.d.ts +8 -0
  480. package/dist/uniforms-layout.d.ts.map +1 -0
  481. package/dist/uniforms-layout.js +84 -0
  482. package/dist/uniforms-layout.js.map +1 -0
  483. package/dist/uniforms.d.ts +43 -0
  484. package/dist/uniforms.d.ts.map +1 -0
  485. package/dist/uniforms.js +176 -0
  486. package/dist/uniforms.js.map +1 -0
  487. package/dist/visibility.d.ts +118 -0
  488. package/dist/visibility.d.ts.map +1 -0
  489. package/dist/visibility.js +290 -0
  490. package/dist/visibility.js.map +1 -0
  491. package/package.json +131 -0
package/dist/clock.js ADDED
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The frame clock of a gpu, as a free function over the lazy frame-state service.
3
+ *
4
+ * `clock(gpu)` is the only public clock: `Frame` does not duplicate it. Reading it never creates
5
+ * anything a frame would not have created anyway, and a program that never opens a frame and never
6
+ * calls `clock()` never allocates the service.
7
+ */
8
+ import { frameState } from "./frame-state.js";
9
+ import { assertDeviceUsable } from "./lifecycle.js";
10
+ import { gpuDisposedError, liveKernel } from "./live-kernel.js";
11
+ import { clockDeltaInvalidError } from "./errors.js";
12
+ import { serviceToken } from "./kernel.js";
13
+ /** One clock facade per gpu, so `clock(gpu) === clock(gpu)`. */
14
+ const clockToken = serviceToken("clock");
15
+ /**
16
+ * The frame clock of `gpu`.
17
+ *
18
+ * Without `advance()`, every `frame()` moves `time` forward by the wall-clock delta since the last
19
+ * frame — the default 0.1.x behavior. With `advance(dt)`, you own the clock for that frame.
20
+ *
21
+ * Throws `AIGPU-GPU-DISPOSED` after `gpu.dispose()`.
22
+ */
23
+ export function clock(gpu) {
24
+ return createClock(liveKernel(gpu, "clock"));
25
+ }
26
+ function createClock(kernel) {
27
+ return kernel.service(clockToken, (self) => {
28
+ const state = frameState(self);
29
+ const assertLive = (where) => {
30
+ if (self.disposed)
31
+ throw gpuDisposedError(where);
32
+ // The clock is the frame-state entry point, and a retained external device can be lost or
33
+ // destroyed by its owner while this gpu still looks alive. Reading or advancing then reports
34
+ // state that can no longer reach a device, so re-check the device itself.
35
+ assertDeviceUsable(self.device, where);
36
+ };
37
+ return {
38
+ get time() { assertLive("clock.time"); return state.time; },
39
+ get deltaTime() { assertLive("clock.deltaTime"); return state.deltaTime; },
40
+ get frameCount() { assertLive("clock.frameCount"); return state.frameCount; },
41
+ advance(dtSeconds) {
42
+ assertLive("clock.advance");
43
+ if (typeof dtSeconds !== "number" || !Number.isFinite(dtSeconds) || dtSeconds < 0)
44
+ throw clockDeltaInvalidError(dtSeconds);
45
+ state.advanceBy(dtSeconds);
46
+ },
47
+ };
48
+ });
49
+ }
50
+ //# sourceMappingURL=clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAkBlE,gEAAgE;AAChE,MAAM,UAAU,GAAG,YAAY,CAAQ,OAAO,CAAC,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,UAAU,KAAK,CAAC,GAAQ;IAC5B,OAAO,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE;YACnC,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACjD,0FAA0F;YAC1F,6FAA6F;YAC7F,0EAA0E;YAC1E,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC,CAAC;QACF,OAAO;YACL,IAAI,IAAI,KAAa,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,IAAI,SAAS,KAAa,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAClF,IAAI,UAAU,KAAa,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,SAAiB;gBACvB,UAAU,CAAC,eAAe,CAAC,CAAC;gBAC5B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC;oBAAE,MAAM,sBAAsB,CAAC,SAAS,CAAC,CAAC;gBAC3H,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { Device } from "@aigpu/core";
2
+ import type { ShaderSource } from "@aigpu/wgsl";
3
+ import { type Reflection } from "@aigpu/wgsl/reflect-source";
4
+ import { type BindGroupCache } from "./bind-cache.ts";
5
+ import { type SetBag, type SetCore } from "./set-core.ts";
6
+ import type { Compute, ComputeOptions, DispatchOptions } from "./api-types.ts";
7
+ import type { Gpu } from "./kernel.ts";
8
+ /**
9
+ * Compute pipeline for this gpu, ready to `set()` bindings and `dispatch()`.
10
+ *
11
+ * Each compute owns its own pipeline (no shared pipeline store), but it resolves the gpu's single
12
+ * lazy bind group cache through the kernel, so a bind group built for a draw and one built here are
13
+ * the same object when the resources match — and the cache is torn down once, in the service phase.
14
+ */
15
+ export declare function compute(gpu: Gpu, source: string | ShaderSource, opts?: ComputeOptions): Compute;
16
+ /**
17
+ * Internal Ring-1 compute implementation behind `compute(gpu, source, opts)`.
18
+ *
19
+ * @internal
20
+ */
21
+ export declare class ComputePipeline implements Compute {
22
+ #private;
23
+ private readonly device;
24
+ readonly source: string;
25
+ readonly opts: ComputeOptions;
26
+ private readonly cache;
27
+ readonly id: number;
28
+ readonly label: string;
29
+ readonly reflection: Reflection;
30
+ readonly entryPoint: string;
31
+ readonly setCore: SetCore;
32
+ readonly bindGroupLayouts: ReadonlyMap<number, GPUBindGroupLayout>;
33
+ readonly pipelineLayout: GPUPipelineLayout;
34
+ readonly shaderModule: GPUShaderModule;
35
+ readonly pipeline: GPUComputePipeline;
36
+ constructor(device: Device, source: string, opts?: ComputeOptions, cache?: BindGroupCache);
37
+ set(values: SetBag): this;
38
+ dispatch(x: number, y?: number, z?: number): void;
39
+ dispatch(opts: DispatchOptions): void;
40
+ }
41
+ //# sourceMappingURL=compute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAwD,KAAK,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEnH,OAAO,EAAqC,KAAK,cAAc,EAA8B,MAAM,iBAAiB,CAAC;AACrH,OAAO,EAAmE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAE3H,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAI/E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAMvC;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAGnG;AAID;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,OAAO;;IAa3C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,cAAc;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAfxB,QAAQ,CAAC,EAAE,SAAmB;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACnE,QAAQ,CAAC,cAAc,EAAE,iBAAiB,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;gBAInB,MAAM,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,cAAmB,EACjB,KAAK,GAAE,cAAuC;IA0BjE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMzB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IACjD,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;CAsCtC"}
@@ -0,0 +1,132 @@
1
+ import { reflectSource } from "@aigpu/wgsl/reflect-source";
2
+ import { entryMetadata } from "./entry-metadata.js";
3
+ import { createBindGroupCache, identityKey } from "./bind-cache.js";
4
+ import { createSetCore, bindGroupLayoutsForReflection, pipelineLayoutFor } from "./set-core.js";
5
+ import { visibilityForEntries } from "./set-layouts.js";
6
+ import { normalizeConstantsOptions, selectEntryPoint } from "./pipeline-store.js";
7
+ import { indirectInvalidError, unsupportedError, writableStorageAliasingError } from "./errors.js";
8
+ import { assertDeviceUsable } from "./lifecycle.js";
9
+ import { liveKernel } from "./live-kernel.js";
10
+ import { renderService } from "./render-service.js";
11
+ import { toWgsl } from "./shader-source.js";
12
+ import { resolveIndirect } from "./indirect.js";
13
+ /**
14
+ * Compute pipeline for this gpu, ready to `set()` bindings and `dispatch()`.
15
+ *
16
+ * Each compute owns its own pipeline (no shared pipeline store), but it resolves the gpu's single
17
+ * lazy bind group cache through the kernel, so a bind group built for a draw and one built here are
18
+ * the same object when the resources match — and the cache is torn down once, in the service phase.
19
+ */
20
+ export function compute(gpu, source, opts = {}) {
21
+ const kernel = liveKernel(gpu, "compute");
22
+ return new ComputePipeline(kernel.device, toWgsl(source), opts, renderService(kernel).binds);
23
+ }
24
+ let nextComputeId = 1;
25
+ /**
26
+ * Internal Ring-1 compute implementation behind `compute(gpu, source, opts)`.
27
+ *
28
+ * @internal
29
+ */
30
+ export class ComputePipeline {
31
+ device;
32
+ source;
33
+ opts;
34
+ cache;
35
+ id = nextComputeId++;
36
+ label;
37
+ reflection;
38
+ entryPoint;
39
+ setCore;
40
+ bindGroupLayouts;
41
+ pipelineLayout;
42
+ shaderModule;
43
+ pipeline;
44
+ #storageBindings;
45
+ constructor(device, source, opts = {}, cache = createBindGroupCache()) {
46
+ this.device = device;
47
+ this.source = source;
48
+ this.opts = opts;
49
+ this.cache = cache;
50
+ assertDeviceUsable(device, "Compute.constructor");
51
+ this.label = opts.label ?? "compute";
52
+ this.reflection = reflectSource(source, `${this.label}.wgsl`);
53
+ // Entry selection runs before everything derived from the selected entry — binding visibility, bind group
54
+ // layouts, and the active-binding set for storage aliasing all reflect the chosen variant.
55
+ const entry = computeEntryPoint(this.reflection, this.label, opts.entry);
56
+ this.entryPoint = entry.name;
57
+ const { constants } = normalizeConstantsOptions(this.label, opts.constants, this.reflection.overrides, "compute");
58
+ this.bindGroupLayouts = bindGroupLayoutsForReflection(device, this.label, this.reflection, visibilityForEntries(this.reflection.bindings, [entry]));
59
+ this.pipelineLayout = pipelineLayoutFor(device, this.bindGroupLayouts);
60
+ this.shaderModule = device.gpu.createShaderModule({ label: `${this.label}.shader`, code: source });
61
+ // Each Compute owns its pipeline (no shared store), so constants join the descriptor directly; the record is
62
+ // omitted when the option is absent to keep the descriptor byte-identical to before.
63
+ this.pipeline = device.gpu.createComputePipeline({
64
+ label: `${this.label}.pipeline`,
65
+ layout: this.pipelineLayout,
66
+ compute: { module: this.shaderModule, entryPoint: this.entryPoint, ...(constants ? { constants } : {}) },
67
+ });
68
+ this.setCore = createSetCore({ device, label: this.label, drawId: this.id, reflection: this.reflection, bindGroupLayouts: this.bindGroupLayouts, cache: this.cache });
69
+ const active = new Set(entryMetadata(entry, "bindings", this.label).map((binding) => `${binding.group}:${binding.binding}`));
70
+ this.#storageBindings = this.reflection.bindings.filter((binding) => binding.kind === "buffer" && binding.addressSpace === "storage" && active.has(`${binding.group}:${binding.binding}`));
71
+ if (opts.set)
72
+ this.set(opts.set);
73
+ }
74
+ set(values) {
75
+ assertDeviceUsable(this.device, `${this.label}.set`);
76
+ this.setCore.set(values);
77
+ return this;
78
+ }
79
+ dispatch(x, y, z) {
80
+ assertDeviceUsable(this.device, `${this.label}.dispatch`);
81
+ const indirect = typeof x === "object" && x !== null ? this.#resolveIndirectDispatch(x, y, z) : undefined;
82
+ this.#preflightAliasing();
83
+ const encoder = this.device.gpu.createCommandEncoder({ label: `${this.label}.encoder` });
84
+ const pass = encoder.beginComputePass({ label: `${this.label}.pass` });
85
+ pass.setPipeline(this.pipeline);
86
+ for (const binding of this.setCore.bindGroups())
87
+ pass.setBindGroup(binding.group, binding.bindGroup, binding.offsets);
88
+ if (indirect)
89
+ pass.dispatchWorkgroupsIndirect(indirect.buffer, indirect.offset);
90
+ else
91
+ pass.dispatchWorkgroups(x, y ?? 1, z ?? 1);
92
+ pass.end();
93
+ this.device.gpu.queue.submit([encoder.finish()]);
94
+ }
95
+ /** The GPU reads the workgroup counts from the buffer, so explicit counts alongside indirect are dead options and throw. */
96
+ #resolveIndirectDispatch(opts, y, z) {
97
+ const where = `${this.label}.dispatch`;
98
+ if (y !== undefined || z !== undefined)
99
+ throw indirectInvalidError(this.label, `indirect cannot be combined with explicit workgroup counts in the same call; the GPU reads the counts from the buffer, so the CPU-side values would be ignored.`, where);
100
+ return resolveIndirect(this.label, where, opts.indirect, "dispatchWorkgroupsIndirect");
101
+ }
102
+ #preflightAliasing() {
103
+ if (!this.#storageBindings.length)
104
+ return;
105
+ const buckets = new Map();
106
+ for (const binding of this.#storageBindings) {
107
+ const state = this.setCore.bindingState(binding.name);
108
+ if (!state)
109
+ continue;
110
+ const key = identityKey(state.identity);
111
+ if (!buckets.has(key))
112
+ buckets.set(key, []);
113
+ buckets.get(key).push({ identity: state.identity, writable: binding.access !== "read" });
114
+ }
115
+ for (const bucket of buckets.values()) {
116
+ if (bucket.length < 2)
117
+ continue;
118
+ if (!bucket.some((entry) => entry.writable))
119
+ continue;
120
+ throw writableStorageAliasingError(`${this.label}.dispatch`);
121
+ }
122
+ }
123
+ }
124
+ function computeEntryPoint(reflection, label, name) {
125
+ // A named entry validates existence and stage inside selectEntryPoint (AIGPU-ENTRY-INVALID); only the
126
+ // no-name case can come back undefined, keeping today's error for a shader without any @compute entry.
127
+ const entry = selectEntryPoint(label, reflection.entryPoints, "compute", name, "compute");
128
+ if (!entry)
129
+ throw unsupportedError(`${label}.compute`, "The compute shader requires a @compute entry point.");
130
+ return entry;
131
+ }
132
+ //# sourceMappingURL=compute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute.js","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Buffer } from "@aigpu/core";
2
+ export interface RenderPassDrawOptions {
3
+ readonly vertexCount: number;
4
+ readonly instanceCount?: number;
5
+ readonly firstVertex?: number;
6
+ readonly firstInstance?: number;
7
+ }
8
+ export type RenderPassDynamicOffsets = readonly GPUBufferDynamicOffset[] | Uint32Array;
9
+ export interface RenderBundleOptions {
10
+ readonly label?: string;
11
+ readonly colorFormats: readonly (GPUTextureFormat | null)[];
12
+ readonly depthStencilFormat?: GPUTextureFormat;
13
+ readonly sampleCount?: number;
14
+ readonly depthReadOnly?: boolean;
15
+ readonly stencilReadOnly?: boolean;
16
+ readonly record: (bundle: RenderBundleRecorder) => void;
17
+ }
18
+ export declare class RenderBundleRecorder {
19
+ readonly gpu: GPURenderBundleEncoder;
20
+ constructor(gpu: GPURenderBundleEncoder);
21
+ setPipeline(pipeline: GPURenderPipeline): void;
22
+ setBindGroup(index: number, group: GPUBindGroup | null, dynamicOffsets?: RenderPassDynamicOffsets): void;
23
+ setVertexBuffer(slot: number, buffer: Buffer | GPUBuffer | null, offset?: number, size?: GPUSize64): void;
24
+ draw(options: RenderPassDrawOptions): void;
25
+ draw(vertexCount: number, instanceCount?: number, firstVertex?: number, firstInstance?: number): void;
26
+ }
27
+ export declare function createRenderBundle(device: {
28
+ readonly gpu: GPUDevice;
29
+ }, opts: RenderBundleOptions): GPURenderBundle;
30
+ //# sourceMappingURL=render-bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-bundle.d.ts","sourceRoot":"","sources":["../../src/core/render-bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,MAAM,wBAAwB,GAAG,SAAS,sBAAsB,EAAE,GAAG,WAAW,CAAC;AAEvF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,EAAE,CAAC;IAC5D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,gBAAgB,CAAC;IAC/C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACzD;AAED,qBAAa,oBAAoB;IACnB,QAAQ,CAAC,GAAG,EAAE,sBAAsB;gBAA3B,GAAG,EAAE,sBAAsB;IAEhD,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAI9C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,EAAE,cAAc,CAAC,EAAE,wBAAwB,GAAG,IAAI;IAIxG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,MAAM,SAAI,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI;IAIpG,IAAI,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAC1C,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;CAatG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;CAAE,EAAE,IAAI,EAAE,mBAAmB,GAAG,eAAe,CAWlH"}
@@ -0,0 +1,39 @@
1
+ import { Buffer } from "@aigpu/core";
2
+ export class RenderBundleRecorder {
3
+ gpu;
4
+ constructor(gpu) {
5
+ this.gpu = gpu;
6
+ }
7
+ setPipeline(pipeline) {
8
+ this.gpu.setPipeline(pipeline);
9
+ }
10
+ setBindGroup(index, group, dynamicOffsets) {
11
+ this.gpu.setBindGroup(index, group, dynamicOffsets);
12
+ }
13
+ setVertexBuffer(slot, buffer, offset = 0, size) {
14
+ this.gpu.setVertexBuffer(slot, gpuBuffer(buffer), offset, size);
15
+ }
16
+ draw(optionsOrVertexCount, instanceCount = 1, firstVertex = 0, firstInstance = 0) {
17
+ if (typeof optionsOrVertexCount === "number") {
18
+ this.gpu.draw(optionsOrVertexCount, instanceCount, firstVertex, firstInstance);
19
+ return;
20
+ }
21
+ this.gpu.draw(optionsOrVertexCount.vertexCount, optionsOrVertexCount.instanceCount ?? 1, optionsOrVertexCount.firstVertex ?? 0, optionsOrVertexCount.firstInstance ?? 0);
22
+ }
23
+ }
24
+ export function createRenderBundle(device, opts) {
25
+ const encoder = device.gpu.createRenderBundleEncoder({
26
+ label: opts.label,
27
+ colorFormats: opts.colorFormats,
28
+ depthStencilFormat: opts.depthStencilFormat,
29
+ sampleCount: opts.sampleCount,
30
+ depthReadOnly: opts.depthReadOnly,
31
+ stencilReadOnly: opts.stencilReadOnly,
32
+ });
33
+ opts.record(new RenderBundleRecorder(encoder));
34
+ return encoder.finish({ label: opts.label });
35
+ }
36
+ function gpuBuffer(buffer) {
37
+ return buffer instanceof Buffer ? buffer.gpu : buffer;
38
+ }
39
+ //# sourceMappingURL=render-bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-bundle.js","sourceRoot":"","sources":["../../src/core/render-bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAqBrC,MAAM,OAAO,oBAAoB;IACV;IAArB,YAAqB,GAA2B;QAA3B,QAAG,GAAH,GAAG,CAAwB;IAAG,CAAC;IAEpD,WAAW,CAAC,QAA2B;QACrC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,KAAa,EAAE,KAA0B,EAAE,cAAyC;QAC/F,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IACtD,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,MAAiC,EAAE,MAAM,GAAG,CAAC,EAAE,IAAgB;QAC3F,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IAID,IAAI,CAAC,oBAAoD,EAAE,aAAa,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC;QAC9G,IAAI,OAAO,oBAAoB,KAAK,QAAQ,EAAE,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;YAC/E,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,oBAAoB,CAAC,WAAW,EAChC,oBAAoB,CAAC,aAAa,IAAI,CAAC,EACvC,oBAAoB,CAAC,WAAW,IAAI,CAAC,EACrC,oBAAoB,CAAC,aAAa,IAAI,CAAC,CACxC,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAmC,EAAE,IAAyB;IAC/F,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC;QACnD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,eAAe,EAAE,IAAI,CAAC,eAAe;KACtC,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,SAAS,CAAC,MAAiC;IAClD,OAAO,MAAM,YAAY,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AACxD,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { Buffer, type Device } from "@aigpu/core";
2
+ export interface StorageBufferOptions {
3
+ /** Byte size of the storage buffer. Must be a positive number. Storage buffers may be far larger than uniforms (up to the adapter's `maxStorageBufferBindingSize`, typically 128 MiB). */
4
+ readonly size: number;
5
+ /** Optional debug label forwarded to the buffer, bind group layout, and bind group. */
6
+ readonly label?: string;
7
+ /**
8
+ * Whether the shader only reads the buffer (`"read"`, the default → `var<storage, read>`)
9
+ * or also writes it (`"read-write"` → `var<storage, read_write>`). This selects the
10
+ * bind group layout entry type (`"read-only-storage"` vs `"storage"`) and changes the
11
+ * default {@link StorageBufferOptions.visibility}.
12
+ */
13
+ readonly access?: "read" | "read-write";
14
+ /**
15
+ * Shader stages that access binding 0. Defaults to `FRAGMENT | COMPUTE` for both access modes —
16
+ * no `VERTEX`. Read-write storage is forbidden in the vertex stage; read-only storage is allowed
17
+ * there but `maxStorageBuffersInVertexStage` is 0 on many adapters (software/CI Vulkan, some
18
+ * mobile GPUs), so vertex-stage storage is opt-in: pass `visibility` explicitly and raise that
19
+ * limit via `requiredLimits`. Ignored when {@link StorageBufferOptions.bindGroupLayout} is provided.
20
+ */
21
+ readonly visibility?: GPUShaderStageFlags;
22
+ /**
23
+ * Reuse a pipeline-owned bind group layout instead of creating one.
24
+ * The layout's binding 0 must be a storage buffer compatible with `size` and `access`.
25
+ */
26
+ readonly bindGroupLayout?: GPUBindGroupLayout;
27
+ }
28
+ /**
29
+ * A single stable storage buffer for one render (or compute) pass, rewritten as needed.
30
+ *
31
+ * @remarks
32
+ * `StorageBuffer` is the storage-buffer counterpart to {@link Uniform}. Reach for it when
33
+ * the data is too large or too dynamic for a uniform: arrays, runtime-sized data, particle
34
+ * state, lookup tables. Storage buffers can be much bigger than uniforms (up to the adapter's
35
+ * `maxStorageBufferBindingSize`, typically 128 MiB, versus a uniform's 64 KiB) and can be
36
+ * written by the shader when `access: "read-write"`.
37
+ *
38
+ * Like `Uniform`, it owns exactly one buffer at binding 0 with a fixed (non-dynamic) offset,
39
+ * and the caller decides when to {@link StorageBuffer.write}. Unlike {@link UniformPool} — a
40
+ * dynamic-offset ring allocator for many small per-draw uniforms — there is no dynamic offset
41
+ * and the bind group never moves.
42
+ *
43
+ * `access` controls the layout entry type; both modes default to `FRAGMENT | COMPUTE` visibility:
44
+ * - `"read"` (default) → `var<storage, read>`, layout type `"read-only-storage"`.
45
+ * - `"read-write"` → `var<storage, read_write>`, layout type `"storage"`.
46
+ * Neither default includes `VERTEX`: read-write storage is forbidden in the vertex stage, and
47
+ * read-only storage — though legal there — needs `maxStorageBuffersInVertexStage > 0`, which is 0
48
+ * on many adapters (software/CI Vulkan, some mobile GPUs). For vertex-stage read-only storage, pass
49
+ * `visibility: VERTEX | …` explicitly and raise the limit via `requiredLimits`; do not rely on the default.
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * // A read-only array the fragment shader samples (var<storage, read> values: array<f32>):
54
+ * const storage = new StorageBuffer(device, { size: 4 * count, label: "values" });
55
+ * storage.write(new Float32Array(values));
56
+ * pass.setBindGroup(0, storage.bindGroup);
57
+ *
58
+ * // A compute-written scratch buffer (var<storage, read_write> out: array<u32>):
59
+ * const scratch = new StorageBuffer(device, { size: 4 * count, access: "read-write" });
60
+ * ```
61
+ */
62
+ export declare class StorageBuffer {
63
+ #private;
64
+ readonly device: Device;
65
+ readonly size: number;
66
+ readonly access: "read" | "read-write";
67
+ readonly buffer: Buffer;
68
+ readonly bindGroupLayout: GPUBindGroupLayout;
69
+ readonly bindGroup: GPUBindGroup;
70
+ constructor(device: Device, opts: StorageBufferOptions);
71
+ /** The underlying storage `GPUBuffer`. */
72
+ get gpu(): GPUBuffer;
73
+ /**
74
+ * Upload `data` to the buffer via `queue.writeBuffer`. No dynamic offset; the
75
+ * bind group is unchanged. Call only when the contents actually change.
76
+ */
77
+ write(data: BufferSource, offset?: number): void;
78
+ destroy(): void;
79
+ dispose(): void;
80
+ }
81
+ //# sourceMappingURL=storage-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-buffer.d.ts","sourceRoot":"","sources":["../../src/core/storage-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAA0C,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAEhG,MAAM,WAAW,oBAAoB;IACnC,0LAA0L;IAC1L,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uFAAuF;IACvF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IACxC;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC;IAC1C;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,kBAAkB,CAAC;CAC/C;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,qBAAa,aAAa;;IAQZ,QAAQ,CAAC,MAAM,EAAE,MAAM;IAPnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;gBAGZ,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB;IAmB/D,0CAA0C;IAC1C,IAAI,GAAG,IAAI,SAAS,CAEnB;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,SAAI,GAAG,IAAI;IAI3C,OAAO,IAAI,IAAI;IAMf,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,91 @@
1
+ import { bind, createBindGroup, createBindGroupLayout } from "@aigpu/core";
2
+ // Both access modes default to FRAGMENT | COMPUTE (no VERTEX):
3
+ // - read-write storage is ILLEGAL in the vertex stage (WebGPU forbids it).
4
+ // - read-only storage IS legal in vertex, but maxStorageBuffersInVertexStage is 0 on many adapters
5
+ // (software/CI Vulkan, some mobile GPUs), so a VERTEX-visible default would silently invalidate
6
+ // the layout there (the draw no-ops). Vertex-stage read-only storage is opt-in: pass `visibility`
7
+ // explicitly AND raise the limit via requiredLimits when requesting the device.
8
+ const defaultVisibility = ((globalThis.GPUShaderStage?.FRAGMENT ?? 2) | (globalThis.GPUShaderStage?.COMPUTE ?? 4));
9
+ /**
10
+ * A single stable storage buffer for one render (or compute) pass, rewritten as needed.
11
+ *
12
+ * @remarks
13
+ * `StorageBuffer` is the storage-buffer counterpart to {@link Uniform}. Reach for it when
14
+ * the data is too large or too dynamic for a uniform: arrays, runtime-sized data, particle
15
+ * state, lookup tables. Storage buffers can be much bigger than uniforms (up to the adapter's
16
+ * `maxStorageBufferBindingSize`, typically 128 MiB, versus a uniform's 64 KiB) and can be
17
+ * written by the shader when `access: "read-write"`.
18
+ *
19
+ * Like `Uniform`, it owns exactly one buffer at binding 0 with a fixed (non-dynamic) offset,
20
+ * and the caller decides when to {@link StorageBuffer.write}. Unlike {@link UniformPool} — a
21
+ * dynamic-offset ring allocator for many small per-draw uniforms — there is no dynamic offset
22
+ * and the bind group never moves.
23
+ *
24
+ * `access` controls the layout entry type; both modes default to `FRAGMENT | COMPUTE` visibility:
25
+ * - `"read"` (default) → `var<storage, read>`, layout type `"read-only-storage"`.
26
+ * - `"read-write"` → `var<storage, read_write>`, layout type `"storage"`.
27
+ * Neither default includes `VERTEX`: read-write storage is forbidden in the vertex stage, and
28
+ * read-only storage — though legal there — needs `maxStorageBuffersInVertexStage > 0`, which is 0
29
+ * on many adapters (software/CI Vulkan, some mobile GPUs). For vertex-stage read-only storage, pass
30
+ * `visibility: VERTEX | …` explicitly and raise the limit via `requiredLimits`; do not rely on the default.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * // A read-only array the fragment shader samples (var<storage, read> values: array<f32>):
35
+ * const storage = new StorageBuffer(device, { size: 4 * count, label: "values" });
36
+ * storage.write(new Float32Array(values));
37
+ * pass.setBindGroup(0, storage.bindGroup);
38
+ *
39
+ * // A compute-written scratch buffer (var<storage, read_write> out: array<u32>):
40
+ * const scratch = new StorageBuffer(device, { size: 4 * count, access: "read-write" });
41
+ * ```
42
+ */
43
+ export class StorageBuffer {
44
+ device;
45
+ size;
46
+ access;
47
+ buffer;
48
+ bindGroupLayout;
49
+ bindGroup;
50
+ #destroyed = false;
51
+ constructor(device, opts) {
52
+ this.device = device;
53
+ this.size = opts.size;
54
+ this.access = opts.access ?? "read";
55
+ this.buffer = device.createBuffer({ size: opts.size, usage: ["storage", "copy_dst"], label: opts.label });
56
+ const visibility = opts.visibility ?? defaultVisibility;
57
+ const entry = this.access === "read-write"
58
+ ? bind.storage(0, visibility, { minBindingSize: opts.size })
59
+ : bind.readonlyStorage(0, visibility, { minBindingSize: opts.size });
60
+ this.bindGroupLayout = opts.bindGroupLayout ?? createBindGroupLayout(device, {
61
+ label: opts.label ? `${opts.label}.bgl` : undefined,
62
+ entries: [entry],
63
+ });
64
+ this.bindGroup = createBindGroup(device, {
65
+ label: opts.label ? `${opts.label}.bg` : undefined,
66
+ layout: this.bindGroupLayout,
67
+ entries: [bind.resource(0, this.buffer)],
68
+ });
69
+ }
70
+ /** The underlying storage `GPUBuffer`. */
71
+ get gpu() {
72
+ return this.buffer.gpu;
73
+ }
74
+ /**
75
+ * Upload `data` to the buffer via `queue.writeBuffer`. No dynamic offset; the
76
+ * bind group is unchanged. Call only when the contents actually change.
77
+ */
78
+ write(data, offset = 0) {
79
+ this.buffer.write(data, offset);
80
+ }
81
+ destroy() {
82
+ if (this.#destroyed)
83
+ return;
84
+ this.#destroyed = true;
85
+ this.buffer.destroy();
86
+ }
87
+ dispose() {
88
+ this.destroy();
89
+ }
90
+ }
91
+ //# sourceMappingURL=storage-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-buffer.js","sourceRoot":"","sources":["../../src/core/storage-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAU,eAAe,EAAE,qBAAqB,EAAe,MAAM,aAAa,CAAC;AA6BhG,+DAA+D;AAC/D,2EAA2E;AAC3E,mGAAmG;AACnG,kGAAkG;AAClG,oGAAoG;AACpG,kFAAkF;AAClF,MAAM,iBAAiB,GAAG,CAAC,CAAC,UAAU,CAAC,cAAc,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,IAAI,CAAC,CAAC,CAAwB,CAAC;AAE1I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,OAAO,aAAa;IAQH;IAPZ,IAAI,CAAS;IACb,MAAM,CAAwB;IAC9B,MAAM,CAAS;IACf,eAAe,CAAqB;IACpC,SAAS,CAAe;IACjC,UAAU,GAAG,KAAK,CAAC;IAEnB,YAAqB,MAAc,EAAE,IAA0B;QAA1C,WAAM,GAAN,MAAM,CAAQ;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1G,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,iBAAiB,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,YAAY;YACxC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5D,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,qBAAqB,CAAC,MAAM,EAAE;YAC3E,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS;YACnD,OAAO,EAAE,CAAC,KAAK,CAAC;SACjB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC,MAAM,EAAE;YACvC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS;YAClD,MAAM,EAAE,IAAI,CAAC,eAAe;YAC5B,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IAED,0CAA0C;IAC1C,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAkB,EAAE,MAAM,GAAG,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import { Buffer, type BindVisibility, type Device } from "@aigpu/core";
2
+ import { type UniformLayoutInfo, type WgslUniformType } from "./wgsl-alignment.ts";
3
+ export type ScalarUniformType = "f32" | "u32" | "i32";
4
+ export type VectorUniformInput = readonly number[] | Float32Array | Uint32Array | Int32Array;
5
+ export type UniformValues<S extends Record<string, WgslUniformType>> = {
6
+ [K in keyof S]: S[K] extends ScalarUniformType ? number : VectorUniformInput;
7
+ };
8
+ export interface StructuredUniformOptions<S extends Record<string, WgslUniformType>> {
9
+ /** Field insertion order = WGSL member order. Offsets come from alignUniforms. */
10
+ readonly schema: S;
11
+ readonly label?: string;
12
+ /** Used only by the lazy bindGroupLayout getter. Default VERTEX | FRAGMENT. */
13
+ readonly visibility?: BindVisibility;
14
+ }
15
+ export declare class StructuredUniform<S extends Record<string, WgslUniformType>> {
16
+ #private;
17
+ readonly device: Device;
18
+ readonly schema: S;
19
+ readonly layout: UniformLayoutInfo;
20
+ readonly byteSize: number;
21
+ readonly offsets: Readonly<Record<keyof S, number>>;
22
+ readonly buffer: Buffer;
23
+ constructor(device: Device, opts: StructuredUniformOptions<S>);
24
+ get gpu(): GPUBuffer;
25
+ get bindGroupLayout(): GPUBindGroupLayout;
26
+ get bindGroup(): GPUBindGroup;
27
+ write(values: Partial<UniformValues<S>>): void;
28
+ wgsl(structName?: string): string;
29
+ destroy(): void;
30
+ dispose(): void;
31
+ [Symbol.dispose](): void;
32
+ }
33
+ //# sourceMappingURL=structured-uniform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured-uniform.d.ts","sourceRoot":"","sources":["../../src/core/structured-uniform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAA2D,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACtI,OAAO,EAOL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACtD,MAAM,MAAM,kBAAkB,GAAG,SAAS,MAAM,EAAE,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,CAAC;AAC7F,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI;KACpE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,iBAAiB,GAAG,MAAM,GAAG,kBAAkB;CAC7E,CAAC;AAEF,MAAM,WAAW,wBAAwB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IACjF,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC;CACtC;AAED,qBAAa,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;;IAe1D,QAAQ,CAAC,MAAM,EAAE,MAAM;IAdnC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAUH,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC;IActE,IAAI,GAAG,IAAI,SAAS,CAEnB;IAED,IAAI,eAAe,IAAI,kBAAkB,CAOxC;IAED,IAAI,SAAS,IAAI,YAAY,CAQ5B;IAED,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAgB9C,IAAI,CAAC,UAAU,SAAa,GAAG,MAAM;IAKrC,OAAO,IAAI,IAAI;IAMf,OAAO,IAAI,IAAI;IAIf,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAQzB"}