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
@@ -1,274 +1,352 @@
1
- import { $gpuValueOf, $internal } from "./shared/symbols.js";
2
- import { safeStringify } from "./shared/stringify.js";
3
- import { getName, setName } from "./shared/meta.js";
4
- import { NotUniformError } from "./errors.js";
5
- import { f32, i32, u32 } from "./data/numeric.js";
6
- import { NotStorageError, isUsableAsStorage } from "./extension.js";
7
- import { TgpuLaidOutBufferImpl, isUsableAsUniform } from "./core/buffer/bufferUsage.js";
8
- import { isBuffer } from "./core/buffer/buffer.js";
9
- import { comparisonSampler, sampler } from "./data/sampler.js";
10
- import { TgpuLaidOutSamplerImpl, isComparisonSampler, isSampler } from "./core/sampler/sampler.js";
11
- import { textureDescriptorToSchema } from "./data/texture.js";
1
+ import {} from "./core/buffer/buffer.js";
2
+ import { isBuffer, isUsableAsStorage, isUsableAsUniform } from "./types.js";
3
+ import { isComparisonSampler, isSampler, TgpuLaidOutSamplerImpl, } from "./core/sampler/sampler.js";
4
+ import { comparisonSampler as wgslComparisonSampler, sampler as wgslSampler, } from "./data/sampler.js";
12
5
  import { TgpuExternalTextureImpl } from "./core/texture/externalTexture.js";
13
- import { TgpuLaidOutTextureViewImpl, isTexture, isTextureView } from "./core/texture/texture.js";
14
- import { NotSampledError, isUsableAsSampled } from "./core/texture/usageExtension.js";
15
-
16
- //#region src/tgpuBindGroupLayout.ts
17
- /**
18
- * Converts legacy entries to new API format
19
- */
20
- function convertLegacyEntries(entries) {
21
- const result = {};
22
- for (const [key, entry] of Object.entries(entries)) {
23
- if (entry === null) {
24
- result[key] = null;
25
- continue;
26
- }
27
- if ("texture" in entry && typeof entry.texture === "string") {
28
- const sampleType = entry.texture;
29
- result[key] = {
30
- ...entry,
31
- texture: textureDescriptorToSchema({
32
- dimension: entry.viewDimension ?? "2d",
33
- sampleType: sampleType === "sint" ? i32 : sampleType === "uint" ? u32 : f32,
34
- multisampled: entry.multisampled ?? false
35
- })
36
- };
37
- } else if ("storageTexture" in entry && typeof entry.storageTexture === "string") {
38
- const accessMap = {
39
- readonly: "read-only",
40
- writeonly: "write-only",
41
- mutable: "read-write"
42
- };
43
- result[key] = {
44
- ...entry,
45
- storageTexture: textureDescriptorToSchema({
46
- access: accessMap[entry.access ?? "writeonly"],
47
- format: entry.storageTexture,
48
- dimension: entry.viewDimension ?? "2d"
49
- })
50
- };
51
- } else if ("externalTexture" in entry && Object.keys(entry.externalTexture).length === 0) result[key] = {
52
- ...entry,
53
- externalTexture: {
54
- type: "texture_external",
55
- dimension: "2d"
56
- }
57
- };
58
- else result[key] = entry;
59
- }
60
- return result;
6
+ import { isTexture, isTextureView, TgpuLaidOutTextureViewImpl, } from "./core/texture/texture.js";
7
+ import { isUsableAsSampled, NotSampledError, } from "./core/texture/usageExtension.js";
8
+ import {} from "./data/texture.js";
9
+ import { invariant, NotUniformError } from "./errors.js";
10
+ import { NotStorageError } from "./extension.js";
11
+ import { getName, setName } from "./shared/meta.js";
12
+ import { safeStringify } from "./shared/stringify.js";
13
+ import { $gpuValueOf, $internal, $soul } from "./shared/symbols.js";
14
+ import { TgpuLaidOutBufferImpl } from "./core/buffer/laidOutBuffer.js";
15
+ import { isMutableBinding, isReadonlyBinding, isUniformBinding, } from "./core/buffer/bufferBinding.js";
16
+ export function bindGroupLayout(entries) {
17
+ return new TgpuBindGroupLayoutImpl({ ...entries });
61
18
  }
62
- function bindGroupLayout(entries) {
63
- return new TgpuBindGroupLayoutImpl(convertLegacyEntries(entries));
19
+ export function INTERNAL_restoreBindGroupLayout(soul) {
20
+ return bindGroupLayout({ ...soul.entries }).$idx(soul.index);
64
21
  }
65
- function isBindGroupLayout(value) {
66
- return !!value && value.resourceType === "bind-group-layout";
22
+ export function INTERNAL_restoreBindGroup(soul, ctx) {
23
+ invariant(soul.raw, 'A bind group soul is only complete once materialized.');
24
+ return new TgpuBindGroupImpl(ctx.getRoot(soul.device), soul.layout, {}, soul.raw);
67
25
  }
68
- function isBindGroup(value) {
69
- return !!value && value.resourceType === "bind-group";
26
+ export function isBindGroupLayout(value) {
27
+ return !!value && value.resourceType === 'bind-group-layout';
28
+ }
29
+ export function isBindGroup(value) {
30
+ return !!value && value.resourceType === 'bind-group';
70
31
  }
71
32
  /**
72
- * @category Errors
73
- */
74
- var MissingBindingError = class MissingBindingError extends Error {
75
- constructor(groupLabel, key) {
76
- super(`Bind group '${groupLabel ?? "<unnamed>"}' is missing a required binding '${key}'`);
77
- Object.setPrototypeOf(this, MissingBindingError.prototype);
78
- }
79
- };
80
- const DEFAULT_MUTABLE_VISIBILITY = ["compute", "fragment"];
81
- const DEFAULT_READONLY_VISIBILITY = [
82
- "compute",
83
- "vertex",
84
- "fragment"
85
- ];
86
- var TgpuBindGroupLayoutImpl = class {
87
- #index;
88
- [$internal];
89
- resourceType = "bind-group-layout";
90
- value = {};
91
- $ = this.value;
92
- entries;
93
- get [$gpuValueOf]() {
94
- return this.$;
95
- }
96
- constructor(entries) {
97
- this.entries = entries;
98
- let idx = 0;
99
- const bound = {};
100
- this[$internal] = { bound };
101
- for (const [key, entry] of Object.entries(entries)) {
102
- if (entry === null) {
103
- idx++;
104
- continue;
105
- }
106
- const membership = {
107
- layout: this,
108
- key,
109
- idx
110
- };
111
- if ("uniform" in entry) bound[key] = new TgpuLaidOutBufferImpl("uniform", entry.uniform, membership);
112
- if ("storage" in entry) {
113
- const dataType = "type" in entry.storage ? entry.storage : entry.storage(0);
114
- bound[key] = new TgpuLaidOutBufferImpl(entry.access ?? "readonly", dataType, membership);
115
- }
116
- if ("texture" in entry) bound[key] = new TgpuLaidOutTextureViewImpl(entry.texture, membership);
117
- if ("storageTexture" in entry) bound[key] = new TgpuLaidOutTextureViewImpl(entry.storageTexture, membership);
118
- if ("externalTexture" in entry) bound[key] = new TgpuExternalTextureImpl(entry.externalTexture, membership);
119
- if ("sampler" in entry) bound[key] = new TgpuLaidOutSamplerImpl(entry.sampler === "comparison" ? comparisonSampler() : sampler(), membership);
120
- Object.defineProperty(this.value, key, { get: () => {
121
- return bound[key].value;
122
- } });
123
- idx++;
124
- }
125
- }
126
- toString() {
127
- return `bindGroupLayout:${getName(this) ?? "<unnamed>"}`;
128
- }
129
- get index() {
130
- return this.#index;
131
- }
132
- $name(label) {
133
- setName(this, label);
134
- return this;
135
- }
136
- get bound() {
137
- return this[$internal].bound;
138
- }
139
- $idx(index) {
140
- this.#index = index;
141
- return this;
142
- }
143
- unwrap(unwrapper) {
144
- return unwrapper.device.createBindGroupLayout({
145
- label: getName(this) ?? "<unnamed>",
146
- entries: Object.values(this.entries).map((entry, idx) => {
147
- if (entry === null) return null;
148
- let visibility = entry.visibility;
149
- const binding = {
150
- binding: idx,
151
- visibility: 0
152
- };
153
- if ("uniform" in entry) {
154
- visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;
155
- binding.buffer = { type: "uniform" };
156
- } else if ("storage" in entry) {
157
- visibility = visibility ?? (entry.access === "mutable" ? DEFAULT_MUTABLE_VISIBILITY : DEFAULT_READONLY_VISIBILITY);
158
- binding.buffer = { type: entry.access === "mutable" ? "storage" : "read-only-storage" };
159
- } else if ("sampler" in entry) {
160
- visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;
161
- binding.sampler = { type: entry.sampler };
162
- } else if ("texture" in entry) {
163
- visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;
164
- const { multisampled, dimension, bindingSampleType } = entry.texture;
165
- binding.texture = {
166
- sampleType: entry.sampleType ?? bindingSampleType[0],
167
- viewDimension: dimension,
168
- multisampled
169
- };
170
- } else if ("storageTexture" in entry) {
171
- visibility = visibility ?? DEFAULT_MUTABLE_VISIBILITY;
172
- const { dimension, access, format } = entry.storageTexture;
173
- binding.storageTexture = {
174
- access,
175
- format,
176
- viewDimension: dimension
177
- };
178
- } else if ("externalTexture" in entry) {
179
- visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;
180
- binding.externalTexture = {};
181
- }
182
- if (visibility?.includes("compute")) binding.visibility |= GPUShaderStage.COMPUTE;
183
- if (visibility?.includes("vertex")) binding.visibility |= GPUShaderStage.VERTEX;
184
- if (visibility?.includes("fragment")) binding.visibility |= GPUShaderStage.FRAGMENT;
185
- return binding;
186
- }).filter((v) => v !== null)
187
- });
188
- }
189
- };
190
- var TgpuBindGroupImpl = class {
191
- resourceType = "bind-group";
192
- layout;
193
- entries;
194
- constructor(layout, entries) {
195
- this.layout = layout;
196
- this.entries = entries;
197
- for (const key of Object.keys(layout.entries)) if (layout.entries[key] !== null && !(key in entries)) throw new MissingBindingError(getName(layout), key);
198
- }
199
- unwrap(unwrapper) {
200
- return unwrapper.device.createBindGroup({
201
- label: getName(this.layout) ?? "<unnamed>",
202
- layout: unwrapper.unwrap(this.layout),
203
- entries: Object.entries(this.layout.entries).map(([key, entry], idx) => {
204
- if (entry === null) return null;
205
- const value = this.entries[key];
206
- if (value === void 0) throw new Error(`'${key}' is a resource required to populate bind group layout '${getName(this.layout) ?? "<unnamed>"}'.`);
207
- if ("uniform" in entry) {
208
- let resource;
209
- if (isBuffer(value)) {
210
- if (!isUsableAsUniform(value)) throw new NotUniformError(value);
211
- resource = { buffer: unwrapper.unwrap(value) };
212
- } else resource = { buffer: value };
213
- return {
214
- binding: idx,
215
- resource
216
- };
217
- }
218
- if ("storage" in entry) {
219
- let resource;
220
- if (isBuffer(value)) {
221
- if (!isUsableAsStorage(value)) throw new NotStorageError(value);
222
- resource = { buffer: unwrapper.unwrap(value) };
223
- } else resource = { buffer: value };
224
- return {
225
- binding: idx,
226
- resource
227
- };
228
- }
229
- if ("texture" in entry) {
230
- let resource;
231
- if (isTexture(value)) {
232
- if (!isUsableAsSampled(value)) throw new NotSampledError(value);
233
- resource = unwrapper.unwrap(value.createView(entry.texture));
234
- } else if (isTextureView(value)) resource = unwrapper.unwrap(value);
235
- else resource = value;
236
- return {
237
- binding: idx,
238
- resource
239
- };
240
- }
241
- if ("storageTexture" in entry) {
242
- let resource;
243
- if (isTexture(value)) {
244
- if (!isUsableAsStorage(value)) throw new NotStorageError(value);
245
- resource = unwrapper.unwrap(value.createView(entry.storageTexture));
246
- } else if (isTextureView(value)) resource = unwrapper.unwrap(value);
247
- else resource = value;
248
- return {
249
- binding: idx,
250
- resource
251
- };
252
- }
253
- if ("sampler" in entry) {
254
- if (isComparisonSampler(value) || isSampler(value)) return {
255
- binding: idx,
256
- resource: unwrapper.unwrap(value)
257
- };
258
- return {
259
- binding: idx,
260
- resource: value
261
- };
262
- }
263
- if ("externalTexture" in entry) return {
264
- binding: idx,
265
- resource: value
266
- };
267
- throw new Error(`Malformed bind group entry: ${safeStringify(value)}`);
268
- }).filter((v) => v !== null)
269
- });
270
- }
271
- };
272
-
273
- //#endregion
274
- export { TgpuBindGroupImpl, bindGroupLayout, isBindGroup, isBindGroupLayout };
33
+ * @category Errors
34
+ */
35
+ export class MissingBindingError extends Error {
36
+ constructor(groupLabel, key) {
37
+ super(`Bind group '${groupLabel ?? '<unnamed>'}' is missing a required binding '${key}'`);
38
+ // Set the prototype explicitly.
39
+ Object.setPrototypeOf(this, MissingBindingError.prototype);
40
+ }
41
+ }
42
+ // --------------
43
+ // Implementation
44
+ // --------------
45
+ const DEFAULT_MUTABLE_VISIBILITY = ['compute', 'fragment'];
46
+ const DEFAULT_READONLY_VISIBILITY = ['compute', 'vertex', 'fragment'];
47
+ class TgpuBindGroupLayoutImpl {
48
+ [$internal];
49
+ [$soul];
50
+ resourceType = 'bind-group-layout';
51
+ $ = {};
52
+ entries;
53
+ get [$gpuValueOf]() {
54
+ return this.$;
55
+ }
56
+ constructor(entries) {
57
+ this.entries = entries;
58
+ this[$internal] = [];
59
+ const normalizedEntries = {};
60
+ this[$soul] = {
61
+ type: 'bind-group-layout',
62
+ entries: normalizedEntries,
63
+ index: undefined,
64
+ label: undefined,
65
+ };
66
+ let idx = 0;
67
+ for (const [key, entry] of Object.entries(entries)) {
68
+ if (entry === null) {
69
+ normalizedEntries[key] = null;
70
+ idx++;
71
+ continue;
72
+ }
73
+ const membership = { layout: this, key, idx };
74
+ let item = undefined;
75
+ normalizedEntries[key] = entry;
76
+ if ('uniform' in entry) {
77
+ item = new TgpuLaidOutBufferImpl('uniform', entry.uniform, membership);
78
+ }
79
+ if ('storage' in entry) {
80
+ const dataType = 'type' in entry.storage ? entry.storage : entry.storage(0);
81
+ item = new TgpuLaidOutBufferImpl(entry.access ?? 'readonly', dataType, membership);
82
+ normalizedEntries[key] = { ...entry, storage: dataType };
83
+ }
84
+ if ('texture' in entry) {
85
+ item = new TgpuLaidOutTextureViewImpl(entry.texture, membership);
86
+ }
87
+ if ('storageTexture' in entry) {
88
+ item = new TgpuLaidOutTextureViewImpl(entry.storageTexture, membership);
89
+ }
90
+ if ('externalTexture' in entry) {
91
+ item = new TgpuExternalTextureImpl(entry.externalTexture, membership);
92
+ }
93
+ if ('sampler' in entry) {
94
+ item = new TgpuLaidOutSamplerImpl(entry.sampler === 'comparison' ? wgslComparisonSampler() : wgslSampler(), membership);
95
+ }
96
+ invariant(item !== undefined, 'Internal error, expected item to be defined');
97
+ Object.defineProperty(this.$, key, {
98
+ get: () => {
99
+ return item.$;
100
+ },
101
+ });
102
+ this[$internal].push(item);
103
+ idx++;
104
+ }
105
+ }
106
+ toString() {
107
+ return `bindGroupLayout:${getName(this) ?? '<unnamed>'}`;
108
+ }
109
+ get index() {
110
+ return this[$soul].index;
111
+ }
112
+ $name(label) {
113
+ setName(this, label);
114
+ return this;
115
+ }
116
+ $idx(index) {
117
+ this[$soul].index = index;
118
+ return this;
119
+ }
120
+ unwrap(unwrapper) {
121
+ const unwrapped = unwrapper.device.createBindGroupLayout({
122
+ label: getName(this) ?? '<unnamed>',
123
+ entries: Object.values(this.entries)
124
+ .map((entry, idx) => {
125
+ if (entry === null) {
126
+ return null;
127
+ }
128
+ let visibility = entry.visibility;
129
+ const binding = {
130
+ binding: idx,
131
+ visibility: 0,
132
+ };
133
+ if ('uniform' in entry) {
134
+ visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;
135
+ binding.buffer = {
136
+ type: 'uniform',
137
+ };
138
+ }
139
+ else if ('storage' in entry) {
140
+ visibility =
141
+ visibility ??
142
+ (entry.access === 'mutable'
143
+ ? DEFAULT_MUTABLE_VISIBILITY
144
+ : DEFAULT_READONLY_VISIBILITY);
145
+ binding.buffer = {
146
+ type: entry.access === 'mutable' ? 'storage' : 'read-only-storage',
147
+ };
148
+ }
149
+ else if ('sampler' in entry) {
150
+ visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;
151
+ binding.sampler = {
152
+ type: entry.sampler,
153
+ };
154
+ }
155
+ else if ('texture' in entry) {
156
+ visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;
157
+ const { multisampled, dimension, bindingSampleType } = entry.texture;
158
+ binding.texture = {
159
+ sampleType: entry.sampleType ?? bindingSampleType[0],
160
+ viewDimension: dimension,
161
+ multisampled,
162
+ };
163
+ }
164
+ else if ('storageTexture' in entry) {
165
+ visibility = visibility ?? DEFAULT_MUTABLE_VISIBILITY;
166
+ const { dimension, access, format } = entry.storageTexture;
167
+ binding.storageTexture = {
168
+ access,
169
+ format,
170
+ viewDimension: dimension,
171
+ };
172
+ }
173
+ else if ('externalTexture' in entry) {
174
+ visibility = visibility ?? DEFAULT_READONLY_VISIBILITY;
175
+ binding.externalTexture = {};
176
+ }
177
+ if (visibility?.includes('compute')) {
178
+ binding.visibility |= GPUShaderStage.COMPUTE;
179
+ }
180
+ if (visibility?.includes('vertex')) {
181
+ binding.visibility |= GPUShaderStage.VERTEX;
182
+ }
183
+ if (visibility?.includes('fragment')) {
184
+ binding.visibility |= GPUShaderStage.FRAGMENT;
185
+ }
186
+ return binding;
187
+ })
188
+ .filter((v) => v !== null),
189
+ });
190
+ return unwrapped;
191
+ }
192
+ }
193
+ export class TgpuBindGroupImpl {
194
+ [$internal];
195
+ [$soul];
196
+ resourceType = 'bind-group';
197
+ #entries;
198
+ constructor(root, layout, entries, raw) {
199
+ this.#entries = entries;
200
+ this[$soul] = {
201
+ type: 'bind-group',
202
+ // Undefined only in rootless `tgpu.resolve()`, where the group is never unwrapped
203
+ device: root?.device,
204
+ layout,
205
+ raw,
206
+ label: undefined,
207
+ };
208
+ this[$internal] = {
209
+ materialize: () => {
210
+ const soul = this[$soul];
211
+ if (!soul.raw) {
212
+ invariant(root, 'Cannot unwrap a bind group created outside of a root.');
213
+ soul.raw = root.unwrap(this);
214
+ }
215
+ return soul.raw;
216
+ },
217
+ };
218
+ if (!raw) {
219
+ // Checking if all entries are present.
220
+ for (const key of Object.keys(layout.entries)) {
221
+ if (layout.entries[key] !== null && !(key in entries)) {
222
+ throw new MissingBindingError(getName(layout), key);
223
+ }
224
+ }
225
+ }
226
+ }
227
+ get layout() {
228
+ return this[$soul].layout;
229
+ }
230
+ get entries() {
231
+ return this.#entries;
232
+ }
233
+ unwrap(unwrapper) {
234
+ const raw = this[$soul].raw;
235
+ if (raw) {
236
+ return raw;
237
+ }
238
+ const unwrapped = unwrapper.device.createBindGroup({
239
+ label: getName(this.layout) ?? '<unnamed>',
240
+ layout: unwrapper.unwrap(this.layout),
241
+ entries: Object.entries(this.layout.entries)
242
+ .map(([key, entry], idx) => {
243
+ if (entry === null) {
244
+ return null;
245
+ }
246
+ const value = this.entries[key];
247
+ if (value === undefined) {
248
+ throw new Error(`'${key}' is a resource required to populate bind group layout '${getName(this.layout) ?? '<unnamed>'}'.`);
249
+ }
250
+ if ('uniform' in entry) {
251
+ let resource;
252
+ if (isBuffer(value)) {
253
+ if (!isUsableAsUniform(value)) {
254
+ throw new NotUniformError(value);
255
+ }
256
+ resource = { buffer: unwrapper.unwrap(value) };
257
+ }
258
+ else if (isUniformBinding(value)) {
259
+ resource = { buffer: unwrapper.unwrap(value) };
260
+ }
261
+ else {
262
+ resource = { buffer: value };
263
+ }
264
+ return {
265
+ binding: idx,
266
+ resource,
267
+ };
268
+ }
269
+ if ('storage' in entry) {
270
+ let resource;
271
+ if (isBuffer(value)) {
272
+ if (!isUsableAsStorage(value)) {
273
+ throw new NotStorageError(value);
274
+ }
275
+ resource = { buffer: unwrapper.unwrap(value) };
276
+ }
277
+ else if (isMutableBinding(value) || isReadonlyBinding(value)) {
278
+ // Types should guarantee that access is mutable if and only if the binding is mutable.
279
+ invariant((entry.access === 'mutable') === (value.resourceType === 'mutable'), 'Invalid buffer access mode.');
280
+ resource = { buffer: unwrapper.unwrap(value) };
281
+ }
282
+ else {
283
+ resource = { buffer: value };
284
+ }
285
+ return {
286
+ binding: idx,
287
+ resource,
288
+ };
289
+ }
290
+ if ('texture' in entry) {
291
+ let resource;
292
+ if (isTexture(value)) {
293
+ if (!isUsableAsSampled(value)) {
294
+ throw new NotSampledError(value);
295
+ }
296
+ resource = unwrapper.unwrap(value.createView(entry.texture));
297
+ }
298
+ else if (isTextureView(value)) {
299
+ resource = unwrapper.unwrap(value);
300
+ }
301
+ else {
302
+ resource = value;
303
+ }
304
+ return {
305
+ binding: idx,
306
+ resource,
307
+ };
308
+ }
309
+ if ('storageTexture' in entry) {
310
+ let resource;
311
+ if (isTexture(value)) {
312
+ if (!isUsableAsStorage(value)) {
313
+ throw new NotStorageError(value);
314
+ }
315
+ resource = unwrapper.unwrap(value.createView(entry.storageTexture));
316
+ }
317
+ else if (isTextureView(value)) {
318
+ resource = unwrapper.unwrap(value);
319
+ }
320
+ else {
321
+ resource = value;
322
+ }
323
+ return {
324
+ binding: idx,
325
+ resource,
326
+ };
327
+ }
328
+ if ('sampler' in entry) {
329
+ if (isComparisonSampler(value) || isSampler(value)) {
330
+ return {
331
+ binding: idx,
332
+ resource: unwrapper.unwrap(value),
333
+ };
334
+ }
335
+ return {
336
+ binding: idx,
337
+ resource: value,
338
+ };
339
+ }
340
+ if ('externalTexture' in entry) {
341
+ return {
342
+ binding: idx,
343
+ resource: value,
344
+ };
345
+ }
346
+ throw new Error(`Malformed bind group entry: ${safeStringify(value)}`);
347
+ })
348
+ .filter((v) => v !== null),
349
+ });
350
+ return unwrapped;
351
+ }
352
+ }