typegpu 0.11.9 → 0.12.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 (366) hide show
  1. package/bin.mjs +28 -6
  2. package/builtin.d.ts +51 -53
  3. package/builtin.js +30 -34
  4. package/common/fullScreenTriangle.d.ts +2 -10
  5. package/common/fullScreenTriangle.js +20 -28
  6. package/common/index.d.ts +2 -9
  7. package/common/index.js +3 -12
  8. package/common/writeSoA.d.ts +11 -12
  9. package/common/writeSoA.js +88 -76
  10. package/core/buffer/buffer.d.ts +79 -62
  11. package/core/buffer/buffer.js +283 -205
  12. package/core/buffer/bufferBinding.d.ts +71 -0
  13. package/core/buffer/bufferBinding.js +154 -0
  14. package/core/buffer/bufferUsage.d.ts +14 -45
  15. package/core/buffer/bufferUsage.js +1 -171
  16. package/core/buffer/laidOutBuffer.d.ts +25 -0
  17. package/core/buffer/laidOutBuffer.js +55 -0
  18. package/core/commandEncoder/attachments.d.ts +125 -0
  19. package/core/commandEncoder/attachments.js +29 -0
  20. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  21. package/core/commandEncoder/commandEncoder.js +56 -0
  22. package/core/commandEncoder/computePass.d.ts +58 -0
  23. package/core/commandEncoder/computePass.js +63 -0
  24. package/core/commandEncoder/renderPass.d.ts +121 -0
  25. package/core/commandEncoder/renderPass.js +196 -0
  26. package/core/constant/tgpuConstant.d.ts +26 -26
  27. package/core/constant/tgpuConstant.js +76 -65
  28. package/core/declare/tgpuDeclare.d.ts +3 -6
  29. package/core/declare/tgpuDeclare.js +36 -36
  30. package/core/function/autoIO.d.ts +61 -33
  31. package/core/function/autoIO.js +68 -73
  32. package/core/function/comptime.d.ts +11 -13
  33. package/core/function/comptime.js +60 -52
  34. package/core/function/createCallableSchema.d.ts +16 -0
  35. package/core/function/createCallableSchema.js +50 -40
  36. package/core/function/dualImpl.d.ts +44 -0
  37. package/core/function/dualImpl.js +71 -50
  38. package/core/function/entryInputRouter.d.ts +26 -0
  39. package/core/function/entryInputRouter.js +31 -33
  40. package/core/function/extractArgs.d.ts +38 -0
  41. package/core/function/extractArgs.js +202 -200
  42. package/core/function/fnCore.d.ts +44 -5
  43. package/core/function/fnCore.js +148 -93
  44. package/core/function/fnTypes.d.ts +31 -29
  45. package/core/function/fnTypes.js +1 -0
  46. package/core/function/ioSchema.d.ts +12 -10
  47. package/core/function/ioSchema.js +65 -47
  48. package/core/function/shelllessImpl.d.ts +9 -12
  49. package/core/function/shelllessImpl.js +17 -22
  50. package/core/function/templateUtils.d.ts +2 -0
  51. package/core/function/templateUtils.js +9 -8
  52. package/core/function/tgpuComputeFn.d.ts +26 -28
  53. package/core/function/tgpuComputeFn.js +47 -48
  54. package/core/function/tgpuFn.d.ts +34 -37
  55. package/core/function/tgpuFn.js +179 -153
  56. package/core/function/tgpuFragmentFn.d.ts +52 -53
  57. package/core/function/tgpuFragmentFn.js +63 -56
  58. package/core/function/tgpuVertexFn.d.ts +36 -39
  59. package/core/function/tgpuVertexFn.js +56 -53
  60. package/core/pipeline/computePipeline.d.ts +141 -53
  61. package/core/pipeline/computePipeline.js +291 -225
  62. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  63. package/core/pipeline/connectAttachmentToShader.js +25 -22
  64. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  65. package/core/pipeline/connectTargetsToShader.js +29 -27
  66. package/core/pipeline/drawState.d.ts +52 -0
  67. package/core/pipeline/drawState.js +225 -0
  68. package/core/pipeline/performanceTracker.d.ts +14 -0
  69. package/core/pipeline/performanceTracker.js +34 -0
  70. package/core/pipeline/pipelineUtils.d.ts +18 -0
  71. package/core/pipeline/pipelineUtils.js +54 -25
  72. package/core/pipeline/priors.d.ts +1 -0
  73. package/core/pipeline/priors.js +12 -0
  74. package/core/pipeline/renderPipeline.d.ts +246 -261
  75. package/core/pipeline/renderPipeline.js +487 -480
  76. package/core/pipeline/timeable.d.ts +28 -18
  77. package/core/pipeline/timeable.js +90 -52
  78. package/core/pipeline/typeGuards.d.ts +17 -0
  79. package/core/pipeline/typeGuards.js +52 -22
  80. package/core/pipeline/webgpuLimitations.d.ts +10 -0
  81. package/core/pipeline/webgpuLimitations.js +81 -0
  82. package/core/querySet/querySet.d.ts +26 -21
  83. package/core/querySet/querySet.js +127 -103
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  85. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  86. package/core/resolve/externals.d.ts +25 -8
  87. package/core/resolve/externals.js +78 -54
  88. package/core/resolve/namespace.d.ts +22 -25
  89. package/core/resolve/namespace.js +16 -21
  90. package/core/resolve/resolvableString.d.ts +7 -0
  91. package/core/resolve/resolvableString.js +13 -0
  92. package/core/resolve/resolveData.d.ts +10 -0
  93. package/core/resolve/resolveData.js +162 -121
  94. package/core/resolve/stitch.d.ts +8 -0
  95. package/core/resolve/stitch.js +23 -21
  96. package/core/resolve/tgpuResolve.d.ts +55 -53
  97. package/core/resolve/tgpuResolve.js +106 -53
  98. package/core/root/configurableImpl.d.ts +10 -0
  99. package/core/root/configurableImpl.js +17 -19
  100. package/core/root/init.d.ts +76 -38
  101. package/core/root/init.js +346 -455
  102. package/core/root/rootTypes.d.ts +461 -636
  103. package/core/root/rootTypes.js +1 -0
  104. package/core/sampler/sampler.d.ts +50 -31
  105. package/core/sampler/sampler.js +120 -113
  106. package/core/simulate/tgpuSimulate.d.ts +9 -12
  107. package/core/simulate/tgpuSimulate.js +68 -71
  108. package/core/slot/accessor.d.ts +36 -13
  109. package/core/slot/accessor.js +138 -91
  110. package/core/slot/internalSlots.d.ts +2 -0
  111. package/core/slot/internalSlots.js +1 -6
  112. package/core/slot/lazy.d.ts +2 -6
  113. package/core/slot/lazy.js +71 -39
  114. package/core/slot/slot.d.ts +2 -6
  115. package/core/slot/slot.js +45 -38
  116. package/core/slot/slotTypes.d.ts +78 -80
  117. package/core/slot/slotTypes.js +11 -16
  118. package/core/texture/externalTexture.d.ts +20 -11
  119. package/core/texture/externalTexture.js +46 -46
  120. package/core/texture/texture.d.ts +152 -97
  121. package/core/texture/texture.js +407 -314
  122. package/core/texture/textureFormats.d.ts +42 -23
  123. package/core/texture/textureFormats.js +104 -75
  124. package/core/texture/textureProps.d.ts +7 -10
  125. package/core/texture/textureProps.js +1 -0
  126. package/core/texture/textureUtils.d.ts +8 -0
  127. package/core/texture/textureUtils.js +185 -179
  128. package/core/texture/usageExtension.d.ts +21 -18
  129. package/core/texture/usageExtension.js +13 -17
  130. package/core/unroll/tgpuUnroll.d.ts +20 -19
  131. package/core/unroll/tgpuUnroll.js +82 -91
  132. package/core/valueProxyUtils.d.ts +3 -0
  133. package/core/valueProxyUtils.js +52 -41
  134. package/core/variable/tgpuVariable.d.ts +26 -27
  135. package/core/variable/tgpuVariable.js +93 -96
  136. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  137. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  138. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  139. package/core/vertexLayout/vertexAttribute.js +1 -0
  140. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  141. package/core/vertexLayout/vertexLayout.js +130 -99
  142. package/core/whitespaces.d.ts +2 -0
  143. package/core/whitespaces.js +16 -0
  144. package/data/alignIO.d.ts +7 -0
  145. package/data/alignIO.js +13 -13
  146. package/data/alignmentOf.d.ts +5 -8
  147. package/data/alignmentOf.js +90 -75
  148. package/data/array.d.ts +17 -9
  149. package/data/array.js +57 -40
  150. package/data/atomic.d.ts +2 -7
  151. package/data/atomic.js +26 -23
  152. package/data/attributes.d.ts +19 -21
  153. package/data/attributes.js +192 -132
  154. package/data/autoStruct.d.ts +36 -3
  155. package/data/autoStruct.js +84 -81
  156. package/data/compiledIO.d.ts +5 -0
  157. package/data/compiledIO.js +231 -215
  158. package/data/dataIO.d.ts +13 -11
  159. package/data/dataIO.js +643 -589
  160. package/data/dataTypes.d.ts +83 -65
  161. package/data/dataTypes.js +66 -68
  162. package/data/deepEqual.d.ts +2 -7
  163. package/data/deepEqual.js +80 -55
  164. package/data/disarray.d.ts +6 -10
  165. package/data/disarray.js +52 -46
  166. package/data/float16Conversion.d.ts +4 -0
  167. package/data/float16Conversion.js +7 -0
  168. package/data/generalizeFn.d.ts +25 -0
  169. package/data/generalizeFn.js +89 -0
  170. package/data/getLongestContiguousPrefix.d.ts +4 -8
  171. package/data/getLongestContiguousPrefix.js +6 -11
  172. package/data/index.d.ts +30 -31
  173. package/data/index.js +39 -172
  174. package/data/instanceToSchema.d.ts +24 -27
  175. package/data/instanceToSchema.js +1 -0
  176. package/data/isContiguous.d.ts +4 -8
  177. package/data/isContiguous.js +6 -11
  178. package/data/matrix.d.ts +21 -21
  179. package/data/matrix.js +513 -505
  180. package/data/numberOps.d.ts +5 -0
  181. package/data/numberOps.js +21 -21
  182. package/data/numeric.d.ts +21 -12
  183. package/data/numeric.js +287 -197
  184. package/data/offsetUtils.d.ts +9 -13
  185. package/data/offsetUtils.js +204 -144
  186. package/data/offsets.d.ts +8 -0
  187. package/data/offsets.js +33 -33
  188. package/data/partialIO.d.ts +13 -8
  189. package/data/partialIO.js +124 -113
  190. package/data/ptr.d.ts +12 -12
  191. package/data/ptr.js +42 -44
  192. package/data/ref.d.ts +40 -27
  193. package/data/ref.js +125 -95
  194. package/data/sampler.d.ts +99 -101
  195. package/data/sampler.js +17 -21
  196. package/data/schemaCallWrapper.d.ts +19 -0
  197. package/data/schemaCallWrapper.js +31 -26
  198. package/data/schemaMemoryLayout.d.ts +8 -0
  199. package/data/schemaMemoryLayout.js +213 -185
  200. package/data/sizeOf.d.ts +4 -8
  201. package/data/sizeOf.js +6 -11
  202. package/data/snippet.d.ts +96 -20
  203. package/data/snippet.js +75 -86
  204. package/data/struct.d.ts +4 -7
  205. package/data/struct.js +51 -39
  206. package/data/texture.d.ts +253 -250
  207. package/data/texture.js +238 -200
  208. package/data/unstruct.d.ts +2 -7
  209. package/data/unstruct.js +43 -37
  210. package/data/vector.d.ts +33 -21
  211. package/data/vector.js +234 -221
  212. package/data/vectorImpl.d.ts +231 -0
  213. package/data/vectorImpl.js +563 -515
  214. package/data/vectorOps.d.ts +25 -0
  215. package/data/vectorOps.js +118 -669
  216. package/data/vertexFormatData.d.ts +181 -184
  217. package/data/vertexFormatData.js +104 -106
  218. package/data/wgslTypes.d.ts +665 -600
  219. package/data/wgslTypes.js +220 -198
  220. package/errors.d.ts +50 -24
  221. package/errors.js +146 -126
  222. package/execMode.d.ts +16 -0
  223. package/execMode.js +47 -40
  224. package/extension.d.ts +13 -8
  225. package/extension.js +10 -16
  226. package/getGPUValue.d.ts +1 -0
  227. package/getGPUValue.js +2 -7
  228. package/index.d.ts +28 -68
  229. package/index.js +8 -28
  230. package/indexNamedExports.d.ts +69 -42
  231. package/indexNamedExports.js +25 -0
  232. package/internal.d.ts +16 -0
  233. package/internal.js +12 -0
  234. package/mathUtils.d.ts +5 -0
  235. package/mathUtils.js +7 -11
  236. package/memo.d.ts +11 -0
  237. package/memo.js +20 -22
  238. package/minify.d.ts +5 -0
  239. package/minify.js +93 -0
  240. package/nameUtils.d.ts +29 -0
  241. package/nameUtils.js +427 -394
  242. package/package.json +5 -1
  243. package/resolutionCtx.d.ts +162 -22
  244. package/resolutionCtx.js +911 -629
  245. package/serial/registry.d.ts +15 -0
  246. package/serial/registry.js +106 -0
  247. package/serial/restore.d.ts +49 -0
  248. package/serial/restore.js +68 -0
  249. package/serial/schema.d.ts +58 -0
  250. package/serial/schema.js +209 -0
  251. package/serial/types.d.ts +5 -0
  252. package/serial/types.js +1 -0
  253. package/shared/env.d.ts +9 -0
  254. package/shared/env.js +9 -12
  255. package/shared/generators.d.ts +4 -0
  256. package/shared/generators.js +10 -12
  257. package/shared/meta.d.ts +29 -14
  258. package/shared/meta.js +71 -55
  259. package/shared/normalizeMetadata.d.ts +32 -27
  260. package/shared/normalizeMetadata.js +23 -36
  261. package/shared/repr.d.ts +73 -55
  262. package/shared/repr.js +1 -0
  263. package/shared/soul.d.ts +17 -0
  264. package/shared/soul.js +1 -0
  265. package/shared/stringify.d.ts +2 -0
  266. package/shared/stringify.js +29 -20
  267. package/shared/symbols.d.ts +26 -20
  268. package/shared/symbols.js +79 -79
  269. package/shared/tseynit.d.ts +2 -0
  270. package/shared/tseynit.js +160 -75
  271. package/shared/utilityTypes.d.ts +30 -14
  272. package/shared/utilityTypes.js +2 -6
  273. package/shared/vertexFormat.d.ts +41 -43
  274. package/shared/vertexFormat.js +59 -62
  275. package/std/array.d.ts +2 -7
  276. package/std/array.js +18 -23
  277. package/std/atomic.d.ts +14 -18
  278. package/std/atomic.js +96 -95
  279. package/std/bitcast.d.ts +193 -10
  280. package/std/bitcast.js +309 -39
  281. package/std/boolean.d.ts +19 -33
  282. package/std/boolean.js +296 -292
  283. package/std/copy.d.ts +2 -7
  284. package/std/copy.js +27 -24
  285. package/std/derivative.d.ts +11 -15
  286. package/std/derivative.js +56 -79
  287. package/std/discard.d.ts +1 -6
  288. package/std/discard.js +7 -14
  289. package/std/environment.d.ts +19 -14
  290. package/std/environment.js +71 -51
  291. package/std/extensions.d.ts +2 -8
  292. package/std/extensions.js +10 -11
  293. package/std/index.d.ts +20 -24
  294. package/std/index.js +32 -187
  295. package/std/matrix.d.ts +6 -12
  296. package/std/matrix.js +60 -69
  297. package/std/numeric.d.ts +150 -146
  298. package/std/numeric.js +771 -727
  299. package/std/operators.d.ts +19 -27
  300. package/std/operators.js +195 -194
  301. package/std/packing.d.ts +5 -11
  302. package/std/packing.js +67 -75
  303. package/std/range.d.ts +6 -11
  304. package/std/range.js +48 -36
  305. package/std/subgroup.d.ts +33 -37
  306. package/std/subgroup.js +180 -217
  307. package/std/texture.d.ts +70 -38
  308. package/std/texture.js +176 -172
  309. package/taskQueue.d.ts +6 -0
  310. package/taskQueue.js +30 -0
  311. package/tgpu.d.ts +16 -0
  312. package/tgpu.js +17 -44
  313. package/tgpuBindGroupLayout.d.ts +132 -152
  314. package/tgpuBindGroupLayout.js +346 -268
  315. package/tgpuLogger.d.ts +34 -0
  316. package/tgpuLogger.js +64 -0
  317. package/tgpuUnstable.d.ts +16 -22
  318. package/tgpuUnstable.js +13 -35
  319. package/tgsl/accessIndex.d.ts +2 -0
  320. package/tgsl/accessIndex.js +76 -33
  321. package/tgsl/accessProp.d.ts +2 -0
  322. package/tgsl/accessProp.js +142 -101
  323. package/tgsl/accessStructProp.d.ts +5 -0
  324. package/tgsl/accessStructProp.js +13 -15
  325. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  326. package/tgsl/consoleLog/deserializers.js +119 -103
  327. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  328. package/tgsl/consoleLog/logGenerator.js +85 -80
  329. package/tgsl/consoleLog/serializers.d.ts +21 -0
  330. package/tgsl/consoleLog/serializers.js +119 -100
  331. package/tgsl/consoleLog/types.d.ts +40 -39
  332. package/tgsl/consoleLog/types.js +1 -0
  333. package/tgsl/conversion.d.ts +33 -0
  334. package/tgsl/conversion.js +271 -216
  335. package/tgsl/forOfUtils.d.ts +15 -0
  336. package/tgsl/forOfUtils.js +85 -70
  337. package/tgsl/generationHelpers.d.ts +22 -39
  338. package/tgsl/generationHelpers.js +85 -58
  339. package/tgsl/infixDispatch.d.ts +70 -0
  340. package/tgsl/infixDispatch.js +48 -46
  341. package/tgsl/jsPolyfills.d.ts +16 -19
  342. package/tgsl/jsPolyfills.js +44 -42
  343. package/tgsl/makeDereferenceable.d.ts +48 -0
  344. package/tgsl/makeDereferenceable.js +86 -0
  345. package/tgsl/makeResolvable.d.ts +22 -0
  346. package/tgsl/makeResolvable.js +33 -0
  347. package/tgsl/shaderGenerator.d.ts +77 -17
  348. package/tgsl/shaderGenerator.js +1 -0
  349. package/tgsl/shellless.d.ts +6 -9
  350. package/tgsl/shellless.js +73 -43
  351. package/tgsl/wgslGenerator.d.ts +66 -59
  352. package/tgsl/wgslGenerator.js +1345 -760
  353. package/types.d.ts +287 -222
  354. package/types.js +61 -44
  355. package/unwrapper.d.ts +31 -26
  356. package/unwrapper.js +1 -0
  357. package/wgslExtensions.d.ts +3 -5
  358. package/wgslExtensions.js +12 -16
  359. package/_virtual/rolldown_runtime.js +0 -13
  360. package/core/buffer/bufferShorthand.d.ts +0 -50
  361. package/core/buffer/bufferShorthand.js +0 -55
  362. package/core/pipeline/applyPipelineState.js +0 -37
  363. package/core/pipeline/limitsOverflow.js +0 -13
  364. package/package.js +0 -5
  365. package/tgsl/shaderGenerator_members.d.ts +0 -33
  366. package/tgsl/shaderGenerator_members.js +0 -12
package/core/root/init.js CHANGED
@@ -1,473 +1,364 @@
1
- import { $getNameForward, $internal } from "../../shared/symbols.js";
2
- import { getName, setName } from "../../shared/meta.js";
3
- import { invariant } from "../../errors.js";
4
- import { isAccessor, isMutableAccessor } from "../slot/slotTypes.js";
5
- import { u32 } from "../../data/numeric.js";
6
- import { vec3f, vec3u } from "../../data/vector.js";
7
- import { fn } from "../function/tgpuFn.js";
8
- import { ConfigurableImpl } from "./configurableImpl.js";
9
- import { INTERNAL_createBuffer, isBuffer } from "../buffer/buffer.js";
10
- import { INTERNAL_createComparisonSampler, INTERNAL_createSampler, isComparisonSampler, isSampler } from "../sampler/sampler.js";
11
- import { clearTextureUtilsCache } from "../texture/textureUtils.js";
12
- import { INTERNAL_createTexture, isTexture, isTextureView } from "../texture/texture.js";
13
- import { TgpuBindGroupImpl, isBindGroup, isBindGroupLayout } from "../../tgpuBindGroupLayout.js";
14
- import { ceil } from "../../std/numeric.js";
15
- import { allEq } from "../../std/boolean.js";
16
- import { isComputePipeline, isRenderPipeline } from "../pipeline/typeGuards.js";
17
1
  import { builtin } from "../../builtin.js";
18
- import { INTERNAL_createQuerySet, isQuerySet } from "../querySet/querySet.js";
2
+ import { INTERNAL_createQuerySet } from "../querySet/querySet.js";
19
3
  import { WeakMemo } from "../../memo.js";
20
- import { TgpuBufferShorthandImpl } from "../buffer/bufferShorthand.js";
4
+ import { clearTextureUtilsCache } from "../texture/textureUtils.js";
5
+ import { $getNameForward, $internal, $soul } from "../../shared/symbols.js";
6
+ import { isBindGroup, isBindGroupLayout, TgpuBindGroupImpl } from "../../tgpuBindGroupLayout.js";
7
+ import { INTERNAL_createBuffer } from "../buffer/buffer.js";
8
+ import { isBufferBinding, TgpuBufferBindingImpl, } from "../buffer/bufferBinding.js";
21
9
  import { computeFn } from "../function/tgpuComputeFn.js";
22
- import { applyBindGroups, applyVertexBuffers } from "../pipeline/applyPipelineState.js";
23
- import { INTERNAL_createComputePipeline } from "../pipeline/computePipeline.js";
10
+ import { fn } from "../function/tgpuFn.js";
11
+ import { INTERNAL_createComputePipeline, } from "../pipeline/computePipeline.js";
12
+ import { INTERNAL_createRenderPipeline, } from "../pipeline/renderPipeline.js";
13
+ import { isTgpuCommandEncoder, isTgpuComputePass, isTgpuRenderCommands, } from "../pipeline/typeGuards.js";
14
+ import { INTERNAL_createCommandEncoder, } from "../commandEncoder/commandEncoder.js";
15
+ import { INTERNAL_createRenderBundleEncoder, } from "../commandEncoder/renderPass.js";
16
+ import { INTERNAL_createComparisonSampler, INTERNAL_createSampler, isComparisonSampler, isSampler, } from "../sampler/sampler.js";
17
+ import { isAccessor, isMutableAccessor, } from "../slot/slotTypes.js";
18
+ import { INTERNAL_createTexture, isTextureView, } from "../texture/texture.js";
24
19
  import { isVertexLayout } from "../vertexLayout/vertexLayout.js";
25
- import { INTERNAL_createRenderPipeline } from "../pipeline/renderPipeline.js";
26
-
27
- //#region src/core/root/init.ts
20
+ import { ConfigurableImpl } from "./configurableImpl.js";
21
+ import { vec3f, vec3u } from "../../data/vector.js";
22
+ import { u32 } from "../../data/numeric.js";
23
+ import { ceil } from "../../std/numeric.js";
24
+ import { allEq } from "../../std/boolean.js";
25
+ import { getName, setName } from "../../shared/meta.js";
26
+ import { logger } from "../../tgpuLogger.js";
27
+ import { safeStringify } from "../../shared/stringify.js";
28
28
  /**
29
- * Changes the given array to a vec of 3 numbers, filling missing values with 1.
30
- */
29
+ * Changes the given array to a vec of 3 numbers, filling missing values with 1.
30
+ */
31
31
  function toVec3(arr) {
32
- if (arr.includes(0)) throw new Error("Size and workgroupSize cannot contain zeroes.");
33
- return vec3u(arr[0] ?? 1, arr[1] ?? 1, arr[2] ?? 1);
32
+ if (arr.includes(0)) {
33
+ throw new Error('Size and workgroupSize cannot contain zeroes.');
34
+ }
35
+ return vec3u(arr[0] ?? 1, arr[1] ?? 1, arr[2] ?? 1);
34
36
  }
35
37
  const workgroupSizeConfigs = [
36
- vec3u(1, 1, 1),
37
- vec3u(256, 1, 1),
38
- vec3u(16, 16, 1),
39
- vec3u(8, 8, 4)
38
+ vec3u(1, 1, 1),
39
+ vec3u(256, 1, 1),
40
+ vec3u(16, 16, 1),
41
+ vec3u(8, 8, 4),
40
42
  ];
41
- var TgpuGuardedComputePipelineImpl = class TgpuGuardedComputePipelineImpl {
42
- #root;
43
- #pipeline;
44
- #sizeUniform;
45
- #workgroupSize;
46
- #lastSize;
47
- constructor(root, pipeline, sizeUniform, workgroupSize) {
48
- this.#root = root;
49
- this.#pipeline = pipeline;
50
- this.#sizeUniform = sizeUniform;
51
- this.#workgroupSize = workgroupSize;
52
- this.#lastSize = vec3u();
53
- }
54
- with(bindGroupOrEncoder) {
55
- return new TgpuGuardedComputePipelineImpl(this.#root, this.#pipeline.with(bindGroupOrEncoder), this.#sizeUniform, this.#workgroupSize);
56
- }
57
- withPerformanceCallback(callback) {
58
- return new TgpuGuardedComputePipelineImpl(this.#root, this.#pipeline.withPerformanceCallback(callback), this.#sizeUniform, this.#workgroupSize);
59
- }
60
- withTimestampWrites(options) {
61
- return new TgpuGuardedComputePipelineImpl(this.#root, this.#pipeline.withTimestampWrites(options), this.#sizeUniform, this.#workgroupSize);
62
- }
63
- dispatchThreads(...threads) {
64
- const sanitizedSize = toVec3(threads);
65
- const workgroupCount = ceil(vec3f(sanitizedSize).div(vec3f(this.#workgroupSize)));
66
- if (!allEq(sanitizedSize, this.#lastSize)) {
67
- this.#lastSize = sanitizedSize;
68
- this.#sizeUniform.write(sanitizedSize);
69
- }
70
- this.#pipeline.dispatchWorkgroups(workgroupCount.x, workgroupCount.y, workgroupCount.z);
71
- }
72
- get pipeline() {
73
- return this.#pipeline;
74
- }
75
- get sizeUniform() {
76
- return this.#sizeUniform;
77
- }
78
- [$internal] = true;
79
- get [$getNameForward]() {
80
- return this.#pipeline;
81
- }
82
- $name(label) {
83
- setName(this, label);
84
- return this;
85
- }
86
- };
87
- var WithBindingImpl = class WithBindingImpl {
88
- #getRoot;
89
- #slotBindings;
90
- constructor(getRoot, slotBindings) {
91
- this.#getRoot = getRoot;
92
- this.#slotBindings = slotBindings;
93
- }
94
- with(slot, value) {
95
- return new WithBindingImpl(this.#getRoot, [...this.#slotBindings, [isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot, value]]);
96
- }
97
- withCompute(entryFn) {
98
- return new WithComputeImpl(this.#getRoot(), this.#slotBindings, entryFn);
99
- }
100
- createComputePipeline(descriptor) {
101
- return INTERNAL_createComputePipeline(this.#getRoot(), this.#slotBindings, descriptor);
102
- }
103
- createRenderPipeline(descriptor) {
104
- return INTERNAL_createRenderPipeline({
105
- root: this.#getRoot(),
106
- slotBindings: this.#slotBindings,
107
- descriptor
108
- });
109
- }
110
- createGuardedComputePipeline(callback) {
111
- const root = this.#getRoot();
112
- if (callback.length >= 4) throw new Error("Guarded compute callback only supports up to three dimensions.");
113
- const workgroupSize = workgroupSizeConfigs[callback.length];
114
- const wrappedCallback = fn([
115
- u32,
116
- u32,
117
- u32
118
- ])(callback);
119
- if (getName(wrappedCallback) === void 0) wrappedCallback.$name("wrappedCallback");
120
- const sizeUniform = root.createUniform(vec3u);
121
- const mainCompute = computeFn({
122
- workgroupSize,
123
- in: { id: builtin.globalInvocationId }
124
- })`{
43
+ export class TgpuGuardedComputePipelineImpl {
44
+ resourceType = 'guarded-compute-pipeline';
45
+ [$soul];
46
+ #root;
47
+ #lastSize;
48
+ constructor(root, pipeline, sizeUniform, workgroupSize) {
49
+ this.#root = root;
50
+ this.#lastSize = vec3u();
51
+ this[$soul] = {
52
+ type: 'guarded-compute-pipeline',
53
+ device: root.device,
54
+ pipeline,
55
+ sizeUniform,
56
+ workgroupSize,
57
+ label: undefined,
58
+ };
59
+ }
60
+ with(bindGroup) {
61
+ if (!isBindGroup(bindGroup)) {
62
+ throw new Error('Guarded pipelines only accept bind groups in .with(). To record into passes or encoders, use a regular compute pipeline.');
63
+ }
64
+ return new TgpuGuardedComputePipelineImpl(this.#root, this[$soul].pipeline.with(bindGroup), this[$soul].sizeUniform, this[$soul].workgroupSize);
65
+ }
66
+ withPerformanceCallback(callback) {
67
+ return new TgpuGuardedComputePipelineImpl(this.#root, this[$soul].pipeline.withPerformanceCallback(callback), this[$soul].sizeUniform, this[$soul].workgroupSize);
68
+ }
69
+ withTimestampWrites(options) {
70
+ return new TgpuGuardedComputePipelineImpl(this.#root, this[$soul].pipeline.withTimestampWrites(options), this[$soul].sizeUniform, this[$soul].workgroupSize);
71
+ }
72
+ dispatchThreads(...threads) {
73
+ const sanitizedSize = toVec3(threads);
74
+ const workgroupCount = ceil(vec3f(sanitizedSize).div(vec3f(this[$soul].workgroupSize)));
75
+ if (!allEq(sanitizedSize, this.#lastSize)) {
76
+ // Only updating the size if it has changed from the last
77
+ // invocation. This removes the need for flushing.
78
+ this.#lastSize = sanitizedSize;
79
+ this[$soul].sizeUniform.write(sanitizedSize);
80
+ }
81
+ this[$soul].pipeline.dispatchWorkgroups(workgroupCount.x, workgroupCount.y, workgroupCount.z);
82
+ }
83
+ initAsync() {
84
+ return this[$soul].pipeline.initAsync();
85
+ }
86
+ initSync() {
87
+ this[$soul].pipeline.initSync();
88
+ }
89
+ get pipeline() {
90
+ return this[$soul].pipeline;
91
+ }
92
+ get sizeUniform() {
93
+ return this[$soul].sizeUniform;
94
+ }
95
+ [$internal] = true;
96
+ get [$getNameForward]() {
97
+ return this[$soul].pipeline;
98
+ }
99
+ $name(label) {
100
+ setName(this, label);
101
+ return this;
102
+ }
103
+ }
104
+ export function INTERNAL_restoreRoot(soul, ctx) {
105
+ return ctx.getRoot(soul.device);
106
+ }
107
+ export function INTERNAL_restoreGuardedComputePipeline(soul, ctx) {
108
+ return new TgpuGuardedComputePipelineImpl(ctx.getRoot(soul.device), soul.pipeline, soul.sizeUniform, soul.workgroupSize);
109
+ }
110
+ class WithBindingImpl {
111
+ #getRoot;
112
+ #slotBindings;
113
+ constructor(getRoot, slotBindings) {
114
+ this.#getRoot = getRoot;
115
+ this.#slotBindings = slotBindings;
116
+ }
117
+ with(slot, value) {
118
+ return new WithBindingImpl(this.#getRoot, [
119
+ ...this.#slotBindings,
120
+ [isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot, value],
121
+ ]);
122
+ }
123
+ createComputePipeline(descriptor) {
124
+ return INTERNAL_createComputePipeline(this.#getRoot(), this.#slotBindings, descriptor);
125
+ }
126
+ createRenderPipeline(descriptor) {
127
+ return INTERNAL_createRenderPipeline({
128
+ root: this.#getRoot(),
129
+ slotBindings: this.#slotBindings,
130
+ descriptor,
131
+ });
132
+ }
133
+ createGuardedComputePipeline(callback) {
134
+ const root = this.#getRoot();
135
+ if (callback.length >= 4) {
136
+ throw new Error('Guarded compute callback only supports up to three dimensions.');
137
+ }
138
+ const workgroupSize = workgroupSizeConfigs[callback.length];
139
+ const wrappedCallback = fn([u32, u32, u32])(callback);
140
+ if (getName(wrappedCallback) === undefined) {
141
+ wrappedCallback.$name('wrappedCallback');
142
+ }
143
+ const sizeUniform = root.createUniform(vec3u);
144
+ // WGSL instead of JS because we do not run unplugin
145
+ // before shipping the typegpu package
146
+ const mainCompute = computeFn({
147
+ workgroupSize,
148
+ in: { id: builtin.globalInvocationId },
149
+ }) `{
125
150
  if (any(in.id >= sizeUniform)) {
126
151
  return;
127
152
  }
128
153
  wrappedCallback(in.id.x, in.id.y, in.id.z);
129
- }`.$uses({
130
- sizeUniform,
131
- wrappedCallback
132
- });
133
- return new TgpuGuardedComputePipelineImpl(root, (() => this.createComputePipeline({ compute: mainCompute }))(), sizeUniform, workgroupSize);
134
- }
135
- withVertex(entryFn, attribs) {
136
- return new WithVertexImpl(this.#getRoot(), this.#slotBindings, {
137
- vertex: entryFn,
138
- attribs
139
- });
140
- }
141
- pipe(transform) {
142
- const newCfg = transform(new ConfigurableImpl([]));
143
- return new WithBindingImpl(this.#getRoot, [...this.#slotBindings, ...newCfg.bindings]);
144
- }
145
- };
146
- var WithComputeImpl = class {
147
- #root;
148
- #slotBindings;
149
- #entryFn;
150
- constructor(root, slotBindings, entryFn) {
151
- this.#root = root;
152
- this.#slotBindings = slotBindings;
153
- this.#entryFn = entryFn;
154
- }
155
- createPipeline() {
156
- return INTERNAL_createComputePipeline(this.#root, this.#slotBindings, { compute: this.#entryFn });
157
- }
158
- };
159
- var WithVertexImpl = class WithVertexImpl {
160
- #root;
161
- #slotBindings;
162
- #partialDescriptor;
163
- constructor(root, slotBindings, partialDescriptor) {
164
- this.#root = root;
165
- this.#slotBindings = slotBindings;
166
- this.#partialDescriptor = partialDescriptor;
167
- }
168
- withFragment(fragmentFn, targets, _mismatch) {
169
- invariant(typeof fragmentFn !== "string", "Just type mismatch validation");
170
- invariant(targets === void 0 || typeof targets !== "string", "Just type mismatch validation");
171
- return new WithFragmentImpl(this.#root, this.#slotBindings, {
172
- ...this.#partialDescriptor,
173
- fragment: fragmentFn,
174
- targets
175
- });
176
- }
177
- withPrimitive(primitive) {
178
- return new WithVertexImpl(this.#root, this.#slotBindings, {
179
- ...this.#partialDescriptor,
180
- primitive
181
- });
182
- }
183
- withDepthStencil(depthStencil) {
184
- return new WithVertexImpl(this.#root, this.#slotBindings, {
185
- ...this.#partialDescriptor,
186
- depthStencil
187
- });
188
- }
189
- withMultisample(multisample) {
190
- return new WithVertexImpl(this.#root, this.#slotBindings, {
191
- ...this.#partialDescriptor,
192
- multisample
193
- });
194
- }
195
- createPipeline() {
196
- return INTERNAL_createRenderPipeline({
197
- root: this.#root,
198
- slotBindings: this.#slotBindings,
199
- descriptor: this.#partialDescriptor
200
- });
201
- }
202
- };
203
- var WithFragmentImpl = class WithFragmentImpl {
204
- #root;
205
- #slotBindings;
206
- #descriptor;
207
- constructor(root, slotBindings, descriptor) {
208
- this.#root = root;
209
- this.#slotBindings = slotBindings;
210
- this.#descriptor = descriptor;
211
- }
212
- withPrimitive(primitive) {
213
- return new WithFragmentImpl(this.#root, this.#slotBindings, {
214
- ...this.#descriptor,
215
- primitive
216
- });
217
- }
218
- withDepthStencil(depthStencil) {
219
- return new WithFragmentImpl(this.#root, this.#slotBindings, {
220
- ...this.#descriptor,
221
- depthStencil
222
- });
223
- }
224
- withMultisample(multisample) {
225
- return new WithFragmentImpl(this.#root, this.#slotBindings, {
226
- ...this.#descriptor,
227
- multisample
228
- });
229
- }
230
- createPipeline() {
231
- return INTERNAL_createRenderPipeline({
232
- root: this.#root,
233
- slotBindings: this.#slotBindings,
234
- descriptor: this.#descriptor
235
- });
236
- }
237
- };
154
+ }`.$uses({ sizeUniform, wrappedCallback });
155
+ // NOTE: in certain setups, unplugin can run on package typegpu, so we have to avoid auto-naming triggering here
156
+ const pipeline = (() => this.createComputePipeline({ compute: mainCompute }))();
157
+ return new TgpuGuardedComputePipelineImpl(root, pipeline, sizeUniform, workgroupSize);
158
+ }
159
+ pipe(transform) {
160
+ const newCfg = transform(new ConfigurableImpl([]));
161
+ return new WithBindingImpl(this.#getRoot, [...this.#slotBindings, ...newCfg.bindings]);
162
+ }
163
+ }
238
164
  /**
239
- * Holds all data that is necessary to facilitate CPU and GPU communication.
240
- * Programs that share a root can interact via GPU buffers.
241
- */
242
- var TgpuRootImpl = class extends WithBindingImpl {
243
- "~unstable";
244
- device;
245
- nameRegistrySetting;
246
- shaderGenerator;
247
- #unwrappedBindGroupLayouts = new WeakMemo((key) => key.unwrap(this));
248
- #unwrappedBindGroups = new WeakMemo((key) => key.unwrap(this));
249
- #ownDevice;
250
- [$internal];
251
- constructor(device, nameRegistrySetting, ownDevice, logOptions, shaderGenerator) {
252
- super(() => this, []);
253
- this.device = device;
254
- this.nameRegistrySetting = nameRegistrySetting;
255
- this.#ownDevice = ownDevice;
256
- this.shaderGenerator = shaderGenerator;
257
- this["~unstable"] = this;
258
- this[$internal] = { logOptions };
259
- }
260
- configureContext(options) {
261
- const context = options.canvas.getContext("webgpu");
262
- if (!context) throw new Error("Unable to initialize 'webgpu' context on the provided canvas.");
263
- context.configure({
264
- ...options,
265
- device: this.device,
266
- format: options.format ?? navigator.gpu.getPreferredCanvasFormat()
267
- });
268
- return context;
269
- }
270
- get enabledFeatures() {
271
- return new Set(this.device.features);
272
- }
273
- createBuffer(typeSchema, initialOrBuffer) {
274
- return INTERNAL_createBuffer(this, typeSchema, initialOrBuffer);
275
- }
276
- createUniform(typeSchema, initialOrBuffer) {
277
- return new TgpuBufferShorthandImpl("uniform", INTERNAL_createBuffer(this, typeSchema, initialOrBuffer).$usage("uniform"));
278
- }
279
- createMutable(typeSchema, initialOrBuffer) {
280
- return new TgpuBufferShorthandImpl("mutable", INTERNAL_createBuffer(this, typeSchema, initialOrBuffer).$usage("storage"));
281
- }
282
- createReadonly(typeSchema, initialOrBuffer) {
283
- return new TgpuBufferShorthandImpl("readonly", INTERNAL_createBuffer(this, typeSchema, initialOrBuffer).$usage("storage"));
284
- }
285
- createQuerySet(type, count, rawQuerySet) {
286
- return INTERNAL_createQuerySet(this, type, count, rawQuerySet);
287
- }
288
- createBindGroup(layout, entries) {
289
- return new TgpuBindGroupImpl(layout, entries);
290
- }
291
- destroy() {
292
- clearTextureUtilsCache(this.device);
293
- if (this.#ownDevice) this.device.destroy();
294
- }
295
- createTexture(props) {
296
- return INTERNAL_createTexture(props, this);
297
- }
298
- createSampler(props) {
299
- return INTERNAL_createSampler(props, this);
300
- }
301
- createComparisonSampler(props) {
302
- return INTERNAL_createComparisonSampler(props, this);
303
- }
304
- unwrap(resource) {
305
- if (isComputePipeline(resource)) return resource[$internal].rawPipeline;
306
- if (isRenderPipeline(resource)) return resource[$internal].core.unwrap().pipeline;
307
- if (isBindGroupLayout(resource)) return this.#unwrappedBindGroupLayouts.getOrMake(resource);
308
- if (isBindGroup(resource)) return this.#unwrappedBindGroups.getOrMake(resource);
309
- if (isBuffer(resource)) return resource.buffer;
310
- if (isTexture(resource)) return resource[$internal].unwrap();
311
- if (isTextureView(resource)) {
312
- if (!resource[$internal].unwrap) throw new Error("Cannot unwrap laid-out texture view as it has no underlying resource.");
313
- return resource[$internal].unwrap();
314
- }
315
- if (isVertexLayout(resource)) return resource.vertexLayout;
316
- if (isSampler(resource) || isComparisonSampler(resource)) {
317
- if (resource[$internal].unwrap) return resource[$internal].unwrap();
318
- throw new Error("Cannot unwrap laid-out sampler.");
319
- }
320
- if (isQuerySet(resource)) return resource.querySet;
321
- throw new Error(`Unknown resource type: ${resource}`);
322
- }
323
- createDrawablePassProxy(encoder) {
324
- const bindGroups = /* @__PURE__ */ new Map();
325
- const vertexBuffers = /* @__PURE__ */ new Map();
326
- let currentPipeline;
327
- let dirty = true;
328
- const applyPipelineState = () => {
329
- if (!currentPipeline) throw new Error("Cannot draw without a call to pass.setPipeline");
330
- if (!dirty) return;
331
- dirty = false;
332
- const { core, priors } = currentPipeline[$internal];
333
- const memo = core.unwrap();
334
- encoder.setPipeline(memo.pipeline);
335
- applyBindGroups(encoder, this, memo.usedBindGroupLayouts, memo.catchall, (layout) => priors.bindGroupLayoutMap?.get(layout) ?? bindGroups.get(layout));
336
- applyVertexBuffers(encoder, this, memo.usedVertexLayouts, (vertexLayout) => {
337
- const priorBuffer = priors.vertexLayoutMap?.get(vertexLayout);
338
- return priorBuffer ? {
339
- buffer: priorBuffer,
340
- offset: void 0,
341
- size: void 0
342
- } : vertexBuffers.get(vertexLayout);
343
- });
344
- };
345
- return {
346
- setPipeline(pipeline) {
347
- currentPipeline = pipeline;
348
- dirty = true;
349
- },
350
- setIndexBuffer: (buffer, indexFormat, offset, size) => {
351
- if (isBuffer(buffer)) encoder.setIndexBuffer(this.unwrap(buffer), indexFormat, offset, size);
352
- else encoder.setIndexBuffer(buffer, indexFormat, offset, size);
353
- },
354
- setVertexBuffer(vertexLayout, buffer, offset, size) {
355
- vertexBuffers.set(vertexLayout, {
356
- buffer,
357
- offset,
358
- size
359
- });
360
- dirty = true;
361
- },
362
- setBindGroup(bindGroupLayout, bindGroup) {
363
- bindGroups.set(bindGroupLayout, bindGroup);
364
- dirty = true;
365
- },
366
- draw(vertexCount, instanceCount, firstVertex, firstInstance) {
367
- applyPipelineState();
368
- encoder.draw(vertexCount, instanceCount, firstVertex, firstInstance);
369
- },
370
- drawIndexed(...args) {
371
- applyPipelineState();
372
- encoder.drawIndexed(...args);
373
- },
374
- drawIndirect(...args) {
375
- applyPipelineState();
376
- encoder.drawIndirect(...args);
377
- },
378
- drawIndexedIndirect(...args) {
379
- applyPipelineState();
380
- encoder.drawIndexedIndirect(...args);
381
- }
382
- };
383
- }
384
- beginRenderPass(descriptor, callback) {
385
- const commandEncoder = this.device.createCommandEncoder();
386
- const pass = commandEncoder.beginRenderPass(descriptor);
387
- callback({
388
- setViewport(...args) {
389
- pass.setViewport(...args);
390
- },
391
- setScissorRect(...args) {
392
- pass.setScissorRect(...args);
393
- },
394
- setBlendConstant(...args) {
395
- pass.setBlendConstant(...args);
396
- },
397
- setStencilReference(...args) {
398
- pass.setStencilReference(...args);
399
- },
400
- beginOcclusionQuery(...args) {
401
- pass.beginOcclusionQuery(...args);
402
- },
403
- endOcclusionQuery(...args) {
404
- pass.endOcclusionQuery(...args);
405
- },
406
- executeBundles(...args) {
407
- pass.executeBundles(...args);
408
- },
409
- ...this.createDrawablePassProxy(pass)
410
- });
411
- pass.end();
412
- this.device.queue.submit([commandEncoder.finish()]);
413
- }
414
- beginRenderBundleEncoder(descriptor, callback) {
415
- const bundleEncoder = this.device.createRenderBundleEncoder(descriptor);
416
- callback(this.createDrawablePassProxy(bundleEncoder));
417
- return bundleEncoder.finish();
418
- }
419
- flush() {
420
- console.warn("flush() has been deprecated, and has no effect.");
421
- }
422
- };
165
+ * Holds all data that is necessary to facilitate CPU and GPU communication.
166
+ * Programs that share a root can interact via GPU buffers.
167
+ */
168
+ class TgpuRootImpl extends WithBindingImpl {
169
+ '~unstable';
170
+ resourceType = 'root';
171
+ [$soul];
172
+ device;
173
+ nameRegistrySetting;
174
+ shaderGeneratorClass;
175
+ #unwrappedBindGroupLayouts = new WeakMemo((key) => key.unwrap(this));
176
+ #unwrappedBindGroups = new WeakMemo((key) => key.unwrap(this));
177
+ #ownDevice;
178
+ [$internal];
179
+ constructor(device, nameRegistrySetting, minify, ownDevice, logOptions, shaderGeneratorClass) {
180
+ super(() => this, []);
181
+ this.device = device;
182
+ this.nameRegistrySetting = nameRegistrySetting;
183
+ this.#ownDevice = ownDevice;
184
+ this.shaderGeneratorClass = shaderGeneratorClass;
185
+ this['~unstable'] = this;
186
+ this[$soul] = {
187
+ type: 'root',
188
+ device,
189
+ nameRegistrySetting,
190
+ logOptions,
191
+ minify,
192
+ nonTransferablePriors: shaderGeneratorClass ? ['shaderGeneratorClass'] : undefined,
193
+ label: undefined,
194
+ };
195
+ this[$internal] = {
196
+ logOptions,
197
+ };
198
+ }
199
+ configureContext(options) {
200
+ const context = options.canvas.getContext('webgpu');
201
+ if (!context) {
202
+ throw new Error("Unable to initialize 'webgpu' context on the provided canvas.");
203
+ }
204
+ context.configure({
205
+ ...options,
206
+ device: this.device,
207
+ format: options.format ?? navigator.gpu.getPreferredCanvasFormat(),
208
+ });
209
+ return context;
210
+ }
211
+ get enabledFeatures() {
212
+ return new Set(this.device.features);
213
+ }
214
+ get minify() {
215
+ return this[$soul].minify;
216
+ }
217
+ createBuffer(typeSchema, initialOrBuffer) {
218
+ return INTERNAL_createBuffer(this, typeSchema, initialOrBuffer);
219
+ }
220
+ createUniform(typeSchema, initialOrBuffer) {
221
+ const buffer = INTERNAL_createBuffer(this, typeSchema, initialOrBuffer)
222
+ // oxlint-disable-next-line typescript/no-explicit-any -- i'm sure it's fine
223
+ .$usage('uniform');
224
+ return new TgpuBufferBindingImpl('uniform', buffer);
225
+ }
226
+ createMutable(typeSchema, initialOrBuffer) {
227
+ const buffer = INTERNAL_createBuffer(this, typeSchema, initialOrBuffer)
228
+ // oxlint-disable-next-line typescript/no-explicit-any -- i'm sure it's fine
229
+ .$usage('storage');
230
+ return new TgpuBufferBindingImpl('mutable', buffer);
231
+ }
232
+ createReadonly(typeSchema, initialOrBuffer) {
233
+ const buffer = INTERNAL_createBuffer(this, typeSchema, initialOrBuffer)
234
+ // oxlint-disable-next-line typescript/no-explicit-any -- i'm sure it's fine
235
+ .$usage('storage');
236
+ return new TgpuBufferBindingImpl('readonly', buffer);
237
+ }
238
+ createQuerySet(type, count, rawQuerySet) {
239
+ return INTERNAL_createQuerySet(this, type, count, rawQuerySet);
240
+ }
241
+ createBindGroup(layout, entries) {
242
+ return new TgpuBindGroupImpl(this, layout, entries);
243
+ }
244
+ destroy() {
245
+ clearTextureUtilsCache(this.device);
246
+ if (this.#ownDevice) {
247
+ this.device.destroy();
248
+ }
249
+ }
250
+ createTexture(props) {
251
+ const texture = INTERNAL_createTexture(props, this);
252
+ // oxlint-disable-next-line typescript/no-explicit-any -- too much type wrangling
253
+ return texture;
254
+ }
255
+ createSampler(props) {
256
+ return INTERNAL_createSampler(props, this);
257
+ }
258
+ createComparisonSampler(props) {
259
+ return INTERNAL_createComparisonSampler(props, this);
260
+ }
261
+ unwrap(resource) {
262
+ if (isTgpuCommandEncoder(resource)) {
263
+ return resource[$internal].rawEncoder;
264
+ }
265
+ if (isTgpuRenderCommands(resource) || isTgpuComputePass(resource)) {
266
+ resource[$internal].state.rawAccessed = true;
267
+ return resource[$internal].rawPass;
268
+ }
269
+ if (isBindGroupLayout(resource)) {
270
+ return this.#unwrappedBindGroupLayouts.getOrMake(resource);
271
+ }
272
+ if (isBindGroup(resource)) {
273
+ return this.#unwrappedBindGroups.getOrMake(resource);
274
+ }
275
+ if (isBufferBinding(resource)) {
276
+ return resource.buffer.buffer;
277
+ }
278
+ if (isTextureView(resource)) {
279
+ if (!resource[$internal].unwrap) {
280
+ throw new Error('Cannot unwrap laid-out texture view as it has no underlying resource.');
281
+ }
282
+ return resource[$internal].unwrap();
283
+ }
284
+ if (isVertexLayout(resource)) {
285
+ return resource.vertexLayout;
286
+ }
287
+ const internals = resource[$internal];
288
+ if (internals?.materialize) {
289
+ return internals.materialize();
290
+ }
291
+ if (isSampler(resource) || isComparisonSampler(resource)) {
292
+ throw new Error('Cannot unwrap laid-out sampler.');
293
+ }
294
+ throw new Error(`Unknown resource type: ${safeStringify(resource)}`);
295
+ }
296
+ createCommandEncoder(descriptor) {
297
+ return INTERNAL_createCommandEncoder(this, descriptor);
298
+ }
299
+ createRenderBundleEncoder(descriptor) {
300
+ return INTERNAL_createRenderBundleEncoder(this, descriptor);
301
+ }
302
+ }
423
303
  /**
424
- * Requests a new GPU device and creates a root around it.
425
- * If a specific device should be used instead, use @see initFromDevice.
426
- *
427
- * @example
428
- * When given no options, the function will ask the browser for a suitable GPU device.
429
- * ```ts
430
- * const root = await tgpu.init();
431
- * ```
432
- *
433
- * @example
434
- * If there are specific options that should be used when requesting a device, you can pass those in.
435
- * ```ts
436
- * const adapterOptions: GPURequestAdapterOptions = ...;
437
- * const deviceDescriptor: GPUDeviceDescriptor = ...;
438
- * const root = await tgpu.init({ adapter: adapterOptions, device: deviceDescriptor });
439
- * ```
440
- */
441
- async function init(options) {
442
- const { adapter: adapterOpt, device: deviceOpt, unstable_names: names = "strict", unstable_logOptions } = options ?? {};
443
- if (!navigator.gpu) throw new Error("WebGPU is not supported by this browser.");
444
- const adapter = await navigator.gpu.requestAdapter(adapterOpt);
445
- if (!adapter) throw new Error("Could not find a compatible GPU");
446
- const availableFeatures = [];
447
- for (const feature of deviceOpt?.requiredFeatures ?? []) {
448
- if (!adapter.features.has(feature)) throw new Error(`Requested feature "${feature}" is not supported by the adapter.`);
449
- availableFeatures.push(feature);
450
- }
451
- for (const feature of deviceOpt?.optionalFeatures ?? []) if (adapter.features.has(feature)) availableFeatures.push(feature);
452
- else console.warn(`Optional feature "${feature}" is not supported by the adapter.`);
453
- return new TgpuRootImpl(await adapter.requestDevice({
454
- ...deviceOpt,
455
- requiredFeatures: availableFeatures
456
- }), names, true, unstable_logOptions ?? {}, options?.shaderGenerator);
304
+ * Requests a new GPU device and creates a root around it.
305
+ * If a specific device should be used instead, use @see initFromDevice.
306
+ *
307
+ * @example
308
+ * When given no options, the function will ask the browser for a suitable GPU device.
309
+ * ```ts
310
+ * const root = await tgpu.init();
311
+ * ```
312
+ *
313
+ * @example
314
+ * If there are specific options that should be used when requesting a device, you can pass those in.
315
+ * ```ts
316
+ * const adapterOptions: GPURequestAdapterOptions = ...;
317
+ * const deviceDescriptor: GPUDeviceDescriptor = ...;
318
+ * const root = await tgpu.init({ adapter: adapterOptions, device: deviceDescriptor });
319
+ * ```
320
+ */
321
+ export async function init(options) {
322
+ const { adapter: adapterOpt, device: deviceOpt, unstable_names: names = 'strict', unstable_minify: minify = false, unstable_logOptions: logOptions, unstable_shaderGeneratorClass: shaderGeneratorClass, } = options ?? {};
323
+ const { optionalFeatures, ...deviceDescriptor } = deviceOpt ?? {};
324
+ if (!navigator.gpu) {
325
+ throw new Error('WebGPU is not supported by this browser.');
326
+ }
327
+ const adapter = await navigator.gpu.requestAdapter(adapterOpt);
328
+ if (!adapter) {
329
+ throw new Error('Could not find a compatible GPU');
330
+ }
331
+ const availableFeatures = [];
332
+ for (const feature of deviceDescriptor.requiredFeatures ?? []) {
333
+ if (!adapter.features.has(feature)) {
334
+ throw new Error(`Requested feature "${feature}" is not supported by the adapter.`);
335
+ }
336
+ availableFeatures.push(feature);
337
+ }
338
+ for (const feature of optionalFeatures ?? []) {
339
+ if (adapter.features.has(feature)) {
340
+ availableFeatures.push(feature);
341
+ }
342
+ else {
343
+ logger.warn('webgpu-feature-missing', `Optional feature "${feature}" is not supported by the adapter.`);
344
+ }
345
+ }
346
+ const device = await adapter.requestDevice({
347
+ ...deviceDescriptor,
348
+ requiredFeatures: availableFeatures,
349
+ });
350
+ return new TgpuRootImpl(device, names, minify, true, logOptions ?? {}, shaderGeneratorClass);
457
351
  }
458
352
  /**
459
- * Creates a root from the given device, instead of requesting it like @see init.
460
- *
461
- * @example
462
- * ```ts
463
- * const device: GPUDevice = ...;
464
- * const root = tgpu.initFromDevice({ device });
465
- * ```
466
- */
467
- function initFromDevice(options) {
468
- const { device, unstable_names: names = "strict", unstable_logOptions } = options ?? {};
469
- return new TgpuRootImpl(device, names, false, unstable_logOptions ?? {}, options?.shaderGenerator);
353
+ * Creates a root from the given device, instead of requesting it like @see init.
354
+ *
355
+ * @example
356
+ * ```ts
357
+ * const device: GPUDevice = ...;
358
+ * const root = tgpu.initFromDevice({ device });
359
+ * ```
360
+ */
361
+ export function initFromDevice(options) {
362
+ const { device, unstable_names: names = 'strict', unstable_minify: minify = false, unstable_logOptions: logOptions, unstable_shaderGeneratorClass: shaderGeneratorClass, } = options ?? {};
363
+ return new TgpuRootImpl(device, names, minify, false, logOptions ?? {}, shaderGeneratorClass);
470
364
  }
471
-
472
- //#endregion
473
- export { init, initFromDevice };