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
@@ -0,0 +1,140 @@
1
+ import { Buffer, Texture } from "@aigpu/core";
2
+ import { incompatibleResourceError, textureFilterabilityError } from "./errors.js";
3
+ import { assertBufferUsable } from "./lifecycle.js";
4
+ import { BINDING_RESOURCE, bindingResourceOf } from "./draw-protocols.js";
5
+ let nextSyntheticResourceId = 1;
6
+ const syntheticIds = new WeakMap();
7
+ export function isPlainValue(value) {
8
+ if (value === null)
9
+ return true;
10
+ if (typeof value !== "object")
11
+ return true;
12
+ if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer || Array.isArray(value))
13
+ return true;
14
+ if (value instanceof Buffer || value instanceof Texture)
15
+ return false;
16
+ return !hasAnyResourceShape(value);
17
+ }
18
+ export function isPlainObject(value) {
19
+ if (typeof value !== "object" || value === null || Array.isArray(value) || ArrayBuffer.isView(value) || value instanceof ArrayBuffer)
20
+ return false;
21
+ if (value instanceof Buffer || value instanceof Texture)
22
+ return false;
23
+ return !hasAnyResourceShape(value);
24
+ }
25
+ /** Normalizes resources for the reflected binding kind and rejects incompatible values with aigpu fix-its. */
26
+ export function normalizeResource(binding, value, context) {
27
+ switch (binding.bindingLayout?.kind) {
28
+ case "buffer": return normalizeBufferResource(binding, value, context);
29
+ case "texture": return normalizeTextureResource(binding, value, context);
30
+ case "sampler": return normalizeSamplerResource(binding, value);
31
+ case "storageTexture": throw incompatibleResourceError(binding, "storage texture", "Pass a storage-compatible texture.");
32
+ case "externalTexture": throw incompatibleResourceError(binding, "external texture", "Pass a compatible GPUExternalTexture.");
33
+ default: throw incompatibleResourceError(binding, "reflected resource", "Fix shader reflection bindingLayout.");
34
+ }
35
+ }
36
+ function normalizeBufferResource(binding, value, context) {
37
+ // Nominal protocol, not an instanceof: recognizing a shared uniforms block must not link it.
38
+ const provider = bindingResourceOf(value);
39
+ if (provider)
40
+ return provider[BINDING_RESOURCE](binding, context.sourceHint);
41
+ if (value instanceof Buffer) {
42
+ assertBufferUsable(value, `${context.sourceHint}.set`);
43
+ validateBufferUsage(binding, value.options.usage);
44
+ return { resource: { buffer: value.gpu }, identity: value.resourceIdentity, unsubscribe: (cb) => value.onDestroy(cb) };
45
+ }
46
+ if (isUniformLike(value)) {
47
+ assertBufferUsable(value.buffer, `${context.sourceHint}.set`);
48
+ return { resource: { buffer: value.gpu, offset: 0, size: value.size }, identity: value.buffer.resourceIdentity, unsubscribe: (cb) => value.buffer.onDestroy(cb) };
49
+ }
50
+ if (isGPUBufferBinding(value))
51
+ return { resource: value, identity: syntheticIdentity(value.buffer) };
52
+ if (isRawGPUBuffer(value))
53
+ return { resource: { buffer: value }, identity: syntheticIdentity(value) };
54
+ throw incompatibleResourceError(binding, "buffer", `Pass a compatible Buffer/Uniform: ${binding.name}.set({ ${binding.name}: gpu.device.createBuffer(...) }).`);
55
+ }
56
+ function normalizeTextureResource(binding, value, context) {
57
+ const target = asTarget(value);
58
+ if (target) {
59
+ const color = target.color;
60
+ validateTextureFilterability(binding, color, context);
61
+ const onTexturesRecreated = target.onTexturesRecreated?.bind(target);
62
+ return { resource: color.createView(), identity: color.resourceIdentity, unsubscribe: (cb) => target.onDestroy(cb), onRecreate: onTexturesRecreated ? (cb) => onTexturesRecreated(cb) : undefined };
63
+ }
64
+ if (value instanceof Texture) {
65
+ validateTextureUsage(binding, value.usage);
66
+ validateTextureFilterability(binding, value, context);
67
+ return { resource: value.createView(), identity: value.resourceIdentity, unsubscribe: (cb) => value.onDestroy(cb) };
68
+ }
69
+ if (isTextureLike(value))
70
+ return { resource: value.createView(), identity: value.resourceIdentity ?? syntheticIdentity(value) };
71
+ if (typeof value === "object" && value !== null)
72
+ return { resource: value, identity: syntheticIdentity(value) };
73
+ throw incompatibleResourceError(binding, "texture/target", `Pass a Texture or Target: ${binding.name}.set({ ${binding.name}: scene.color }) or set({ ${binding.name}: scene }).`);
74
+ }
75
+ function normalizeSamplerResource(binding, value) {
76
+ if (isSamplerLike(value))
77
+ return { resource: value, identity: syntheticIdentity(value) };
78
+ throw incompatibleResourceError(binding, "sampler", `Use the cached sampler: set({ ${binding.name}: sampler(gpu) }).`);
79
+ }
80
+ function isSamplerLike(value) {
81
+ if (typeof value !== "object" || value === null)
82
+ return false;
83
+ if (value instanceof Buffer || value instanceof Texture)
84
+ return false;
85
+ return !isRawGPUBuffer(value) && !isGPUBufferBinding(value) && !isTextureLike(value) && !asTarget(value);
86
+ }
87
+ function validateBufferUsage(binding, usage) {
88
+ const expected = binding.bindingLayout?.kind === "buffer" ? binding.bindingLayout.buffer.type : undefined;
89
+ if (expected === "uniform" && !usage.includes("uniform"))
90
+ throw incompatibleResourceError(binding, "uniform buffer", "Create with usage: ['uniform','copy_dst'].");
91
+ if ((expected === "storage" || expected === "read-only-storage") && !usage.includes("storage"))
92
+ throw incompatibleResourceError(binding, "storage buffer", "Create with usage: ['storage','copy_dst'].");
93
+ }
94
+ function validateTextureUsage(binding, usage) {
95
+ if (!usage.includes("texture_binding") && !usage.includes("render_attachment")) {
96
+ throw incompatibleResourceError(binding, "sampled texture", "Use texture_binding usage or a sampleable Target.");
97
+ }
98
+ }
99
+ function validateTextureFilterability(binding, texture, context) {
100
+ if (!context.filterableTexture || context.float32Filterable)
101
+ return;
102
+ if (texture.format === "r32float" || texture.format === "rg32float" || texture.format === "rgba32float") {
103
+ throw textureFilterabilityError(context.sourceHint, binding, texture.format, texture.label ?? "texture", context.pairedSampler);
104
+ }
105
+ }
106
+ function asTarget(value) {
107
+ if (typeof value !== "object" || value === null)
108
+ return undefined;
109
+ const record = value;
110
+ if (!record.resourceIdentity || !record.color || typeof record.onDestroy !== "function")
111
+ return undefined;
112
+ return record;
113
+ }
114
+ function hasAnyResourceShape(value) {
115
+ const record = value;
116
+ return "gpu" in record || "bindGroup" in record || "createView" in record || "resourceIdentity" in record;
117
+ }
118
+ function syntheticIdentity(value) {
119
+ if (typeof value !== "object" || value === null)
120
+ return `value:${String(value)}`;
121
+ let id = syntheticIds.get(value);
122
+ if (!id) {
123
+ id = { kind: "external", id: nextSyntheticResourceId++ };
124
+ syntheticIds.set(value, id);
125
+ }
126
+ return id;
127
+ }
128
+ function isUniformLike(value) {
129
+ return typeof value === "object" && value !== null && "gpu" in value && "size" in value && "buffer" in value && value.buffer instanceof Buffer;
130
+ }
131
+ function isTextureLike(value) {
132
+ return typeof value === "object" && value !== null && typeof value.createView === "function";
133
+ }
134
+ function isGPUBufferBinding(value) {
135
+ return typeof value === "object" && value !== null && "buffer" in value && isRawGPUBuffer(value.buffer);
136
+ }
137
+ function isRawGPUBuffer(value) {
138
+ return typeof value === "object" && value !== null && "size" in value && "usage" in value && typeof value.destroy === "function";
139
+ }
140
+ //# sourceMappingURL=set-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-resources.js","sourceRoot":"","sources":["../src/set-resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ShaderSource } from "@aigpu/wgsl";
2
+ /** Normalizes public ring-1 shader inputs to raw WGSL. Strings remain first-class; ShaderSource is the loader artifact. */
3
+ export declare function toWgsl(input: string | ShaderSource): string;
4
+ //# sourceMappingURL=shader-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader-source.d.ts","sourceRoot":"","sources":["../src/shader-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,2HAA2H;AAC3H,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAS3D"}
@@ -0,0 +1,21 @@
1
+ import { malformedShaderSourceError } from "./errors.js";
2
+ /** Normalizes public ring-1 shader inputs to raw WGSL. Strings remain first-class; ShaderSource is the loader artifact. */
3
+ export function toWgsl(input) {
4
+ if (typeof input === "string")
5
+ return input;
6
+ if (!isObject(input))
7
+ throw malformedShaderSourceError(input);
8
+ if (!("version" in input))
9
+ throw malformedShaderSourceError(input);
10
+ const version = input.version;
11
+ if (version !== 1)
12
+ throw malformedShaderSourceError(input);
13
+ const wgsl = input.wgsl;
14
+ if (typeof wgsl !== "string")
15
+ throw malformedShaderSourceError(input);
16
+ return wgsl;
17
+ }
18
+ function isObject(value) {
19
+ return typeof value === "object" && value !== null;
20
+ }
21
+ //# sourceMappingURL=shader-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader-source.js","sourceRoot":"","sources":["../src/shader-source.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEzD,2HAA2H;AAC3H,MAAM,UAAU,MAAM,CAAC,KAA4B;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC;QAAE,MAAM,0BAA0B,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,OAAO,GAAI,KAAuC,CAAC,OAAO,CAAC;IACjE,IAAI,OAAO,KAAK,CAAC;QAAE,MAAM,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAI,KAAqC,CAAC,IAAI,CAAC;IACzD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,MAAM,0BAA0B,CAAC,KAAK,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { Buffer, type Device } from "@aigpu/core";
2
+ import type { StorageAccess, StorageBuffer, StorageOptions } from "./api-types.ts";
3
+ import type { Gpu } from "./kernel.ts";
4
+ /**
5
+ * Storage buffer owned by this gpu: `read()`/`write()` from the host, bindable from any shader.
6
+ *
7
+ * `access` accepts the shorthand string or the options bag; `{ indirect: true }` adds the "indirect"
8
+ * usage so the buffer can supply GPU-read draw/dispatch arguments. The buffer is destroyed by
9
+ * `gpu.dispose()` — or earlier, by hand, through the internal handle.
10
+ */
11
+ export declare function storage(gpu: Gpu, bytes: number, access?: StorageAccess | StorageOptions): StorageBuffer;
12
+ /**
13
+ * Ring-1 StorageBuffer facade backed by a core Buffer.
14
+ *
15
+ * @internal
16
+ */
17
+ export declare class RingStorageBuffer implements StorageBuffer {
18
+ readonly size: number;
19
+ readonly access: StorageAccess;
20
+ readonly buffer: Buffer;
21
+ constructor(buffer: Buffer, access: StorageAccess);
22
+ static create(device: Device, bytes: number, access: StorageAccess, label?: string, indirect?: boolean): RingStorageBuffer;
23
+ read(): Promise<ArrayBuffer>;
24
+ write(data: BufferSource, offset?: number): void;
25
+ get gpu(): GPUBuffer;
26
+ get resourceIdentity(): import("@aigpu/core").ResourceIdentity;
27
+ onDestroy(cb: (buffer: Buffer) => void): import("@aigpu/core").UnsubscribeResourceDestroy;
28
+ /** Frees the GPU allocation. Idempotent; bind groups holding it are invalidated through the buffer's destroy signal. */
29
+ destroy(): void;
30
+ }
31
+ export declare function createStorageBuffer(device: Device, bytes: number, access: StorageAccess, label?: string, indirect?: boolean): RingStorageBuffer;
32
+ /**
33
+ * Wraps an existing core buffer as an internal StorageBuffer facade.
34
+ *
35
+ * @internal
36
+ */
37
+ export declare function wrapStorageBuffer(buffer: Buffer, access: StorageAccess): RingStorageBuffer;
38
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA8C,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGvC;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,aAAa,GAAG,cAA6B,GAAG,aAAa,CAKrH;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa;IAMjD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,iBAAiB;IAUxH,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IAI5B,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,SAAI,GAAG,IAAI;IAI3C,IAAI,GAAG,IAAI,SAAS,CAEnB;IAED,IAAI,gBAAgB,2CAEnB;IAED,SAAS,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;IAItC,wHAAwH;IACxH,OAAO,IAAI,IAAI;CAGhB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,iBAAiB,CAE7I;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAE1F"}
@@ -0,0 +1,76 @@
1
+ import { liveKernel, ownResource } from "./live-kernel.js";
2
+ /**
3
+ * Storage buffer owned by this gpu: `read()`/`write()` from the host, bindable from any shader.
4
+ *
5
+ * `access` accepts the shorthand string or the options bag; `{ indirect: true }` adds the "indirect"
6
+ * usage so the buffer can supply GPU-read draw/dispatch arguments. The buffer is destroyed by
7
+ * `gpu.dispose()` — or earlier, by hand, through the internal handle.
8
+ */
9
+ export function storage(gpu, bytes, access = "read-write") {
10
+ const kernel = liveKernel(gpu, "storage");
11
+ const opts = typeof access === "string" ? { access } : access;
12
+ const buffer = createStorageBuffer(kernel.device, bytes, opts.access ?? "read-write", undefined, opts.indirect ?? false);
13
+ return ownResource(kernel, buffer, (owned) => owned.destroy(), (cb) => { buffer.onDestroy(cb); });
14
+ }
15
+ /**
16
+ * Ring-1 StorageBuffer facade backed by a core Buffer.
17
+ *
18
+ * @internal
19
+ */
20
+ export class RingStorageBuffer {
21
+ size;
22
+ access;
23
+ buffer;
24
+ constructor(buffer, access) {
25
+ this.buffer = buffer;
26
+ this.access = access;
27
+ this.size = buffer.options.size;
28
+ }
29
+ static create(device, bytes, access, label, indirect = false) {
30
+ const usage = indirect ? ["storage", "copy_dst", "copy_src", "indirect"] : ["storage", "copy_dst", "copy_src"];
31
+ const buffer = device.createBuffer({
32
+ size: bytes,
33
+ usage,
34
+ label,
35
+ });
36
+ return new RingStorageBuffer(buffer, access);
37
+ }
38
+ read() {
39
+ return this.buffer.read(this.size);
40
+ }
41
+ write(data, offset = 0) {
42
+ this.buffer.write(asWriteData(data), offset);
43
+ }
44
+ get gpu() {
45
+ return this.buffer.gpu;
46
+ }
47
+ get resourceIdentity() {
48
+ return this.buffer.resourceIdentity;
49
+ }
50
+ onDestroy(cb) {
51
+ return this.buffer.onDestroy(cb);
52
+ }
53
+ /** Frees the GPU allocation. Idempotent; bind groups holding it are invalidated through the buffer's destroy signal. */
54
+ destroy() {
55
+ this.buffer.destroy();
56
+ }
57
+ }
58
+ export function createStorageBuffer(device, bytes, access, label, indirect = false) {
59
+ return RingStorageBuffer.create(device, bytes, access, label, indirect);
60
+ }
61
+ /**
62
+ * Wraps an existing core buffer as an internal StorageBuffer facade.
63
+ *
64
+ * @internal
65
+ */
66
+ export function wrapStorageBuffer(buffer, access) {
67
+ return new RingStorageBuffer(buffer, access);
68
+ }
69
+ function asWriteData(data) {
70
+ if (data instanceof ArrayBuffer)
71
+ return data;
72
+ if (ArrayBuffer.isView(data))
73
+ return data;
74
+ throw new TypeError("StorageBuffer.write() requires ArrayBuffer or ArrayBufferView.");
75
+ }
76
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { Texture, type Device, type ResourceDestroyCallback, type ResourceIdentity, type UnsubscribeResourceDestroy } from "@aigpu/core";
2
+ import { type ClearColor } from "./target-utils.ts";
3
+ import type { RenderPassDescriptorOptions, Target } from "./target.ts";
4
+ import { type Gpu } from "./kernel.ts";
5
+ export interface SurfaceOptions {
6
+ readonly autoResize?: boolean;
7
+ /**
8
+ * Default clear color of this surface, used by passes that clear without naming a color.
9
+ * Defaults to `[0, 0, 0, 1]`; mutable at runtime through `surface.clearColor`.
10
+ */
11
+ readonly clearColor?: ClearColor;
12
+ readonly dpr?: number | readonly [number, number];
13
+ readonly size?: readonly [number, number];
14
+ readonly format?: GPUTextureFormat;
15
+ readonly alphaMode?: GPUCanvasAlphaMode;
16
+ readonly colorSpace?: PredefinedColorSpace;
17
+ readonly label?: string;
18
+ }
19
+ export interface SurfaceResizeEvent {
20
+ readonly width: number;
21
+ readonly height: number;
22
+ readonly dpr: number;
23
+ readonly surface: Surface;
24
+ }
25
+ export interface Surface extends Target {
26
+ readonly canvas: HTMLCanvasElement | OffscreenCanvas;
27
+ readonly context: GPUCanvasContext;
28
+ readonly autoResize: boolean;
29
+ readonly layoutBacked: boolean;
30
+ readonly dpr: number;
31
+ readonly disposed: boolean;
32
+ onResize(cb: (event: SurfaceResizeEvent) => void): () => void;
33
+ dispose(): void;
34
+ }
35
+ export type SurfaceCanvas = HTMLCanvasElement | OffscreenCanvas;
36
+ /**
37
+ * Canvas render target of this gpu: configures the canvas context and keeps it sized.
38
+ *
39
+ * One live surface per canvas — a second `surface(gpu, canvas)` on the same canvas throws
40
+ * `AIGPU-SURFACE-DUPLICATE`, because reconfiguring a context out from under a live surface silently
41
+ * invalidates its textures. Disposing the surface frees the canvas for a new one.
42
+ *
43
+ * Lifecycle: the surface resizes itself right after the frame clock advances (auto-resize is a
44
+ * frame-state hook, so no rAF of its own), and it goes down with the gpu in the `resource` phase —
45
+ * after the loops stopped, before the caches and the device.
46
+ */
47
+ export declare function surface(gpu: Gpu, canvas: SurfaceCanvas, opts?: SurfaceOptions): Surface;
48
+ export declare function isSurfaceResizeCallbackActive(): boolean;
49
+ export declare function isFrameActive(): boolean;
50
+ export declare function enterFrame(): void;
51
+ export declare function leaveFrame(): void;
52
+ export declare function isSurface(target: unknown): target is CanvasSurface;
53
+ export declare class CanvasSurface implements Surface {
54
+ #private;
55
+ private readonly device;
56
+ readonly canvas: SurfaceCanvas;
57
+ private readonly options;
58
+ private readonly unregister;
59
+ readonly resourceIdentity: ResourceIdentity;
60
+ readonly label: string | undefined;
61
+ readonly context: GPUCanvasContext;
62
+ readonly autoResize: boolean;
63
+ readonly layoutBacked: boolean;
64
+ readonly format: GPUTextureFormat;
65
+ constructor(device: Device, canvas: SurfaceCanvas, options: SurfaceOptions, unregister: (surface: CanvasSurface) => void);
66
+ get gpu(): unknown;
67
+ get size(): readonly [number, number];
68
+ get texelSize(): readonly [number, number];
69
+ get color(): Texture;
70
+ get colors(): readonly [Texture, ...Texture[]];
71
+ get depth(): undefined;
72
+ get sampleCount(): 1;
73
+ get dpr(): number;
74
+ /** Default clear color of this surface; passes that clear without naming a color use it. */
75
+ get clearColor(): ClearColor;
76
+ set clearColor(value: ClearColor);
77
+ get disposed(): boolean;
78
+ resize(size: readonly [number, number]): void;
79
+ applyAutoResize(): void;
80
+ onResize(cb: (event: SurfaceResizeEvent) => void): () => void;
81
+ read(): Promise<Uint8Array>;
82
+ readFloats(): Promise<Float32Array>;
83
+ onDestroy(cb: ResourceDestroyCallback<Target>): UnsubscribeResourceDestroy;
84
+ onTexturesRecreated(cb: () => void): () => void;
85
+ renderPassDescriptor(opts?: RenderPassDescriptorOptions): GPURenderPassDescriptor;
86
+ dispose(): void;
87
+ }
88
+ export declare function isLayoutBacked(canvas: unknown): boolean;
89
+ //# sourceMappingURL=surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../src/surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,243 @@
1
+ import { Texture, createResourceIdentity, DestroySignal } from "@aigpu/core";
2
+ import { BUILT_IN_CLEAR_COLOR, colorValue, copyClearColor, sameSize, validateClearColor } from "./target-utils.js";
3
+ import { surfaceAutoResizeUnsupportedError, surfaceContextError, surfaceDisposedError, surfaceDuplicateError, surfaceResizeReentrantError, } from "./errors.js";
4
+ import { frameState } from "./frame-state.js";
5
+ import { liveKernel } from "./live-kernel.js";
6
+ import { serviceToken } from "./kernel.js";
7
+ /**
8
+ * Canvas render target of this gpu: configures the canvas context and keeps it sized.
9
+ *
10
+ * One live surface per canvas — a second `surface(gpu, canvas)` on the same canvas throws
11
+ * `AIGPU-SURFACE-DUPLICATE`, because reconfiguring a context out from under a live surface silently
12
+ * invalidates its textures. Disposing the surface frees the canvas for a new one.
13
+ *
14
+ * Lifecycle: the surface resizes itself right after the frame clock advances (auto-resize is a
15
+ * frame-state hook, so no rAF of its own), and it goes down with the gpu in the `resource` phase —
16
+ * after the loops stopped, before the caches and the device.
17
+ */
18
+ export function surface(gpu, canvas, opts = {}) {
19
+ const kernel = liveKernel(gpu, "surface");
20
+ const open = openSurfaces(kernel);
21
+ const existing = open.get(canvas);
22
+ if (existing && !existing.disposed)
23
+ throw surfaceDuplicateError(existing.label);
24
+ const created = new CanvasSurface(kernel.device, canvas, opts, (disposed) => {
25
+ if (open.get(disposed.canvas) === disposed)
26
+ open.delete(disposed.canvas);
27
+ releaseAutoResize();
28
+ releaseOwnership();
29
+ });
30
+ const releaseAutoResize = frameState(kernel).onAdvance(() => created.applyAutoResize());
31
+ const releaseOwnership = kernel.own("resource", () => created.dispose());
32
+ open.set(canvas, created);
33
+ return created;
34
+ }
35
+ /** Live surfaces of a gpu, keyed by canvas: the duplicate-configure guard, created on first surface. */
36
+ const openSurfacesToken = serviceToken("surfaces");
37
+ function openSurfaces(kernel) {
38
+ return kernel.service(openSurfacesToken, () => new Map());
39
+ }
40
+ let resizeCallbackDepth = 0;
41
+ let frameDepth = 0;
42
+ export function isSurfaceResizeCallbackActive() { return resizeCallbackDepth > 0; }
43
+ export function isFrameActive() { return frameDepth > 0; }
44
+ export function enterFrame() { frameDepth += 1; }
45
+ export function leaveFrame() { frameDepth -= 1; }
46
+ export function isSurface(target) { return target instanceof CanvasSurface; }
47
+ export class CanvasSurface {
48
+ device;
49
+ canvas;
50
+ options;
51
+ unregister;
52
+ resourceIdentity = createResourceIdentity("render-target");
53
+ label;
54
+ context;
55
+ autoResize;
56
+ layoutBacked;
57
+ format;
58
+ #destroySignal = new DestroySignal();
59
+ #callbacks = new Set();
60
+ #texturesRecreatedCallbacks = new Set();
61
+ #currentDpr;
62
+ #clearColor;
63
+ #isDisposed = false;
64
+ #notifying = false;
65
+ constructor(device, canvas, options, unregister) {
66
+ this.device = device;
67
+ this.canvas = canvas;
68
+ this.options = options;
69
+ this.unregister = unregister;
70
+ this.label = options.label;
71
+ this.#clearColor = options.clearColor === undefined ? BUILT_IN_CLEAR_COLOR : validateClearColor(options.clearColor, "surface.clearColor");
72
+ const context = canvas.getContext("webgpu");
73
+ if (!context)
74
+ throw surfaceContextError();
75
+ this.context = context;
76
+ this.layoutBacked = isLayoutBacked(canvas);
77
+ if (options.autoResize === true && !this.layoutBacked)
78
+ throw surfaceAutoResizeUnsupportedError();
79
+ this.autoResize = options.autoResize ?? (options.size ? false : this.layoutBacked);
80
+ this.#currentDpr = effectiveDpr(options.dpr);
81
+ this.format = options.format ?? preferredCanvasFormat();
82
+ const initialSize = initialCanvasSize(canvas, options, this.layoutBacked, this.#currentDpr);
83
+ if (options.size || this.layoutBacked)
84
+ setCanvasSize(canvas, initialSize);
85
+ context.configure({
86
+ device: device.gpu,
87
+ format: this.format,
88
+ alphaMode: options.alphaMode ?? "premultiplied",
89
+ colorSpace: options.colorSpace ?? "srgb",
90
+ usage: canvasTextureUsage(),
91
+ });
92
+ }
93
+ get gpu() { return this.context; }
94
+ get size() { this.#assertLive(); return canvasSize(this.canvas); }
95
+ get texelSize() { const size = this.size; return [1 / size[0], 1 / size[1]]; }
96
+ get color() {
97
+ this.#assertLive();
98
+ return new Texture(this.device, this.context.getCurrentTexture(), {
99
+ size: this.size,
100
+ format: this.format,
101
+ usage: ["render_attachment", "texture_binding", "copy_src"],
102
+ label: this.options.label ? `${this.options.label}.color` : "surface.color",
103
+ }, "external");
104
+ }
105
+ get colors() { return [this.color]; }
106
+ get depth() { this.#assertLive(); return undefined; }
107
+ get sampleCount() { this.#assertLive(); return 1; }
108
+ get dpr() { return this.#currentDpr; }
109
+ /** Default clear color of this surface; passes that clear without naming a color use it. */
110
+ get clearColor() { return copyClearColor(this.#clearColor); }
111
+ set clearColor(value) { this.#clearColor = validateClearColor(value, "surface.clearColor"); }
112
+ get disposed() { return this.#isDisposed; }
113
+ resize(size) {
114
+ this.#assertLive();
115
+ if (this.#notifying)
116
+ throw surfaceResizeReentrantError(this.options.label);
117
+ this.#applyResize(sanitizeSize(size), this.#currentDpr, true);
118
+ }
119
+ applyAutoResize() {
120
+ if (this.#isDisposed || !this.autoResize || !this.layoutBacked)
121
+ return;
122
+ const nextDpr = effectiveDpr(this.options.dpr);
123
+ const nextSize = layoutCanvasSize(this.canvas, nextDpr);
124
+ this.#applyResize(nextSize, nextDpr, true);
125
+ }
126
+ onResize(cb) {
127
+ this.#assertLive();
128
+ this.#callbacks.add(cb);
129
+ this.#notifying = true;
130
+ resizeCallbackDepth += 1;
131
+ try {
132
+ cb(this.#event());
133
+ }
134
+ finally {
135
+ resizeCallbackDepth -= 1;
136
+ this.#notifying = false;
137
+ }
138
+ return () => { this.#callbacks.delete(cb); };
139
+ }
140
+ async read() { this.#assertLive(); return this.color.read(); }
141
+ async readFloats() { this.#assertLive(); return this.color.readFloats(); }
142
+ onDestroy(cb) { this.#assertLive(); return this.#destroySignal.onDestroy(this, cb); }
143
+ onTexturesRecreated(cb) { this.#assertLive(); this.#texturesRecreatedCallbacks.add(cb); return () => { this.#texturesRecreatedCallbacks.delete(cb); }; }
144
+ renderPassDescriptor(opts = {}) {
145
+ // Surfaces have no depth attachment; clearDepth, clearStencil, and depthReadOnly cannot apply.
146
+ const { clear = [0, 0, 0, 1], preserve } = opts;
147
+ this.#assertLive();
148
+ const attachment = { view: this.context.getCurrentTexture().createView(), loadOp: preserve ? "load" : "clear", storeOp: "store" };
149
+ if (!preserve)
150
+ attachment.clearValue = colorValue(clear);
151
+ return { colorAttachments: [attachment] };
152
+ }
153
+ dispose() {
154
+ if (this.#isDisposed)
155
+ return;
156
+ this.#isDisposed = true;
157
+ try {
158
+ this.context.unconfigure?.();
159
+ }
160
+ catch { /* ignore native cleanup failures */ }
161
+ this.unregister(this);
162
+ this.#callbacks.clear();
163
+ this.#texturesRecreatedCallbacks.clear();
164
+ this.#destroySignal.emit(this);
165
+ }
166
+ #applyResize(size, dpr, notify) {
167
+ const changed = !sameSize(canvasSize(this.canvas), size);
168
+ this.#currentDpr = dpr;
169
+ if (!changed)
170
+ return;
171
+ setCanvasSize(this.canvas, size);
172
+ this.#emitTexturesRecreated();
173
+ if (notify)
174
+ this.#notify();
175
+ }
176
+ #emitTexturesRecreated() {
177
+ for (const cb of [...this.#texturesRecreatedCallbacks])
178
+ cb();
179
+ }
180
+ #notify() {
181
+ this.#notifying = true;
182
+ resizeCallbackDepth += 1;
183
+ try {
184
+ const event = this.#event();
185
+ for (const cb of [...this.#callbacks])
186
+ cb(event);
187
+ }
188
+ finally {
189
+ resizeCallbackDepth -= 1;
190
+ this.#notifying = false;
191
+ }
192
+ }
193
+ #event() {
194
+ const size = canvasSize(this.canvas);
195
+ return { width: size[0], height: size[1], dpr: this.#currentDpr, surface: this };
196
+ }
197
+ #assertLive() {
198
+ if (this.#isDisposed)
199
+ throw surfaceDisposedError(this.options.label);
200
+ }
201
+ }
202
+ export function isLayoutBacked(canvas) {
203
+ return typeof canvas.clientWidth === "number";
204
+ }
205
+ function initialCanvasSize(canvas, options, layoutBacked, dpr) {
206
+ if (options.size)
207
+ return sanitizeSize(options.size);
208
+ if (layoutBacked)
209
+ return layoutCanvasSize(canvas, dpr);
210
+ return sanitizeSize(canvasSize(canvas));
211
+ }
212
+ function layoutCanvasSize(canvasLike, dpr) {
213
+ const canvas = canvasLike;
214
+ return sanitizeSize([Math.round(canvas.clientWidth * dpr), Math.round(canvas.clientHeight * dpr)]);
215
+ }
216
+ function canvasSize(canvasLike) {
217
+ const canvas = canvasLike;
218
+ return [canvas.width, canvas.height];
219
+ }
220
+ function setCanvasSize(canvasLike, size) {
221
+ const canvas = canvasLike;
222
+ canvas.width = size[0];
223
+ canvas.height = size[1];
224
+ }
225
+ function sanitizeSize(size) {
226
+ return [Math.max(1, Math.floor(size[0])), Math.max(1, Math.floor(size[1]))];
227
+ }
228
+ function effectiveDpr(dpr) {
229
+ const raw = globalThis.devicePixelRatio ?? 1;
230
+ if (Array.isArray(dpr))
231
+ return Math.min(dpr[1], Math.max(dpr[0], raw));
232
+ if (typeof dpr === "number")
233
+ return dpr;
234
+ return raw;
235
+ }
236
+ function preferredCanvasFormat() {
237
+ return globalThis.navigator?.gpu?.getPreferredCanvasFormat?.() ?? "bgra8unorm";
238
+ }
239
+ function canvasTextureUsage() {
240
+ const usage = globalThis.GPUTextureUsage;
241
+ return usage ? usage.RENDER_ATTACHMENT | usage.TEXTURE_BINDING | usage.COPY_SRC : undefined;
242
+ }
243
+ //# sourceMappingURL=surface.js.map