typegpu 0.11.8 → 0.12.0

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 (362) hide show
  1. package/builtin.d.ts +51 -53
  2. package/builtin.js +30 -34
  3. package/common/fullScreenTriangle.d.ts +2 -10
  4. package/common/fullScreenTriangle.js +20 -28
  5. package/common/index.d.ts +2 -9
  6. package/common/index.js +3 -12
  7. package/common/writeSoA.d.ts +11 -12
  8. package/common/writeSoA.js +88 -76
  9. package/core/buffer/buffer.d.ts +79 -62
  10. package/core/buffer/buffer.js +279 -205
  11. package/core/buffer/bufferBinding.d.ts +71 -0
  12. package/core/buffer/bufferBinding.js +154 -0
  13. package/core/buffer/bufferUsage.d.ts +14 -45
  14. package/core/buffer/bufferUsage.js +1 -171
  15. package/core/buffer/laidOutBuffer.d.ts +25 -0
  16. package/core/buffer/laidOutBuffer.js +55 -0
  17. package/core/commandEncoder/attachments.d.ts +125 -0
  18. package/core/commandEncoder/attachments.js +29 -0
  19. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  20. package/core/commandEncoder/commandEncoder.js +56 -0
  21. package/core/commandEncoder/computePass.d.ts +58 -0
  22. package/core/commandEncoder/computePass.js +63 -0
  23. package/core/commandEncoder/renderPass.d.ts +121 -0
  24. package/core/commandEncoder/renderPass.js +196 -0
  25. package/core/constant/tgpuConstant.d.ts +26 -26
  26. package/core/constant/tgpuConstant.js +76 -65
  27. package/core/declare/tgpuDeclare.d.ts +3 -6
  28. package/core/declare/tgpuDeclare.js +37 -38
  29. package/core/function/autoIO.d.ts +61 -33
  30. package/core/function/autoIO.js +68 -73
  31. package/core/function/comptime.d.ts +11 -13
  32. package/core/function/comptime.js +60 -52
  33. package/core/function/createCallableSchema.d.ts +16 -0
  34. package/core/function/createCallableSchema.js +50 -40
  35. package/core/function/dualImpl.d.ts +44 -0
  36. package/core/function/dualImpl.js +71 -50
  37. package/core/function/entryInputRouter.d.ts +26 -0
  38. package/core/function/entryInputRouter.js +31 -33
  39. package/core/function/extractArgs.d.ts +38 -0
  40. package/core/function/extractArgs.js +202 -200
  41. package/core/function/fnCore.d.ts +44 -0
  42. package/core/function/fnCore.js +148 -92
  43. package/core/function/fnTypes.d.ts +31 -29
  44. package/core/function/fnTypes.js +1 -0
  45. package/core/function/ioSchema.d.ts +12 -10
  46. package/core/function/ioSchema.js +65 -47
  47. package/core/function/shelllessImpl.d.ts +9 -12
  48. package/core/function/shelllessImpl.js +18 -20
  49. package/core/function/templateUtils.d.ts +2 -0
  50. package/core/function/templateUtils.js +9 -8
  51. package/core/function/tgpuComputeFn.d.ts +26 -28
  52. package/core/function/tgpuComputeFn.js +47 -48
  53. package/core/function/tgpuFn.d.ts +34 -37
  54. package/core/function/tgpuFn.js +179 -153
  55. package/core/function/tgpuFragmentFn.d.ts +52 -53
  56. package/core/function/tgpuFragmentFn.js +63 -56
  57. package/core/function/tgpuVertexFn.d.ts +36 -39
  58. package/core/function/tgpuVertexFn.js +56 -53
  59. package/core/pipeline/computePipeline.d.ts +141 -53
  60. package/core/pipeline/computePipeline.js +291 -225
  61. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  62. package/core/pipeline/connectAttachmentToShader.js +25 -22
  63. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  64. package/core/pipeline/connectTargetsToShader.js +29 -27
  65. package/core/pipeline/drawState.d.ts +52 -0
  66. package/core/pipeline/drawState.js +225 -0
  67. package/core/pipeline/limitsOverflow.d.ts +2 -0
  68. package/core/pipeline/limitsOverflow.js +13 -10
  69. package/core/pipeline/performanceTracker.d.ts +14 -0
  70. package/core/pipeline/performanceTracker.js +34 -0
  71. package/core/pipeline/pipelineUtils.d.ts +18 -0
  72. package/core/pipeline/pipelineUtils.js +54 -25
  73. package/core/pipeline/priors.d.ts +1 -0
  74. package/core/pipeline/priors.js +12 -0
  75. package/core/pipeline/renderPipeline.d.ts +246 -261
  76. package/core/pipeline/renderPipeline.js +487 -480
  77. package/core/pipeline/timeable.d.ts +28 -18
  78. package/core/pipeline/timeable.js +90 -52
  79. package/core/pipeline/typeGuards.d.ts +17 -0
  80. package/core/pipeline/typeGuards.js +52 -22
  81. package/core/querySet/querySet.d.ts +26 -21
  82. package/core/querySet/querySet.js +127 -103
  83. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +90 -93
  85. package/core/resolve/externals.d.ts +25 -7
  86. package/core/resolve/externals.js +79 -62
  87. package/core/resolve/namespace.d.ts +22 -25
  88. package/core/resolve/namespace.js +16 -21
  89. package/core/resolve/resolvableString.d.ts +7 -0
  90. package/core/resolve/resolvableString.js +13 -0
  91. package/core/resolve/resolveData.d.ts +10 -0
  92. package/core/resolve/resolveData.js +162 -121
  93. package/core/resolve/stitch.d.ts +8 -0
  94. package/core/resolve/stitch.js +23 -21
  95. package/core/resolve/tgpuResolve.d.ts +55 -53
  96. package/core/resolve/tgpuResolve.js +106 -55
  97. package/core/root/configurableImpl.d.ts +10 -0
  98. package/core/root/configurableImpl.js +17 -19
  99. package/core/root/init.d.ts +76 -38
  100. package/core/root/init.js +346 -454
  101. package/core/root/rootTypes.d.ts +461 -627
  102. package/core/root/rootTypes.js +1 -0
  103. package/core/sampler/sampler.d.ts +50 -31
  104. package/core/sampler/sampler.js +120 -113
  105. package/core/simulate/tgpuSimulate.d.ts +9 -12
  106. package/core/simulate/tgpuSimulate.js +68 -71
  107. package/core/slot/accessor.d.ts +36 -13
  108. package/core/slot/accessor.js +138 -91
  109. package/core/slot/internalSlots.d.ts +2 -0
  110. package/core/slot/internalSlots.js +1 -6
  111. package/core/slot/lazy.d.ts +2 -6
  112. package/core/slot/lazy.js +71 -39
  113. package/core/slot/slot.d.ts +2 -6
  114. package/core/slot/slot.js +45 -38
  115. package/core/slot/slotTypes.d.ts +78 -80
  116. package/core/slot/slotTypes.js +11 -16
  117. package/core/texture/externalTexture.d.ts +20 -11
  118. package/core/texture/externalTexture.js +46 -46
  119. package/core/texture/texture.d.ts +152 -97
  120. package/core/texture/texture.js +407 -314
  121. package/core/texture/textureFormats.d.ts +42 -23
  122. package/core/texture/textureFormats.js +104 -75
  123. package/core/texture/textureProps.d.ts +7 -10
  124. package/core/texture/textureProps.js +1 -0
  125. package/core/texture/textureUtils.d.ts +8 -0
  126. package/core/texture/textureUtils.js +185 -179
  127. package/core/texture/usageExtension.d.ts +21 -18
  128. package/core/texture/usageExtension.js +13 -17
  129. package/core/unroll/tgpuUnroll.d.ts +20 -19
  130. package/core/unroll/tgpuUnroll.js +82 -91
  131. package/core/valueProxyUtils.d.ts +3 -0
  132. package/core/valueProxyUtils.js +52 -41
  133. package/core/variable/tgpuVariable.d.ts +26 -27
  134. package/core/variable/tgpuVariable.js +93 -96
  135. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  136. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  137. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  138. package/core/vertexLayout/vertexAttribute.js +1 -0
  139. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  140. package/core/vertexLayout/vertexLayout.js +130 -99
  141. package/core/whitespaces.d.ts +2 -0
  142. package/core/whitespaces.js +16 -0
  143. package/data/alignIO.d.ts +7 -0
  144. package/data/alignIO.js +13 -13
  145. package/data/alignmentOf.d.ts +5 -8
  146. package/data/alignmentOf.js +90 -75
  147. package/data/array.d.ts +6 -9
  148. package/data/array.js +48 -40
  149. package/data/atomic.d.ts +2 -7
  150. package/data/atomic.js +26 -23
  151. package/data/attributes.d.ts +19 -21
  152. package/data/attributes.js +192 -132
  153. package/data/autoStruct.d.ts +36 -3
  154. package/data/autoStruct.js +84 -81
  155. package/data/compiledIO.d.ts +5 -0
  156. package/data/compiledIO.js +231 -214
  157. package/data/dataIO.d.ts +13 -11
  158. package/data/dataIO.js +643 -589
  159. package/data/dataTypes.d.ts +83 -65
  160. package/data/dataTypes.js +66 -68
  161. package/data/deepEqual.d.ts +2 -7
  162. package/data/deepEqual.js +80 -55
  163. package/data/disarray.d.ts +6 -10
  164. package/data/disarray.js +52 -46
  165. package/data/float16Conversion.d.ts +4 -0
  166. package/data/float16Conversion.js +7 -0
  167. package/data/getLongestContiguousPrefix.d.ts +4 -8
  168. package/data/getLongestContiguousPrefix.js +6 -11
  169. package/data/index.d.ts +30 -31
  170. package/data/index.js +39 -172
  171. package/data/instanceToSchema.d.ts +24 -27
  172. package/data/instanceToSchema.js +1 -0
  173. package/data/isContiguous.d.ts +4 -8
  174. package/data/isContiguous.js +6 -11
  175. package/data/matrix.d.ts +21 -21
  176. package/data/matrix.js +513 -505
  177. package/data/numberOps.d.ts +6 -0
  178. package/data/numberOps.js +26 -20
  179. package/data/numeric.d.ts +21 -12
  180. package/data/numeric.js +287 -192
  181. package/data/offsetUtils.d.ts +9 -13
  182. package/data/offsetUtils.js +204 -144
  183. package/data/offsets.d.ts +8 -0
  184. package/data/offsets.js +33 -33
  185. package/data/partialIO.d.ts +13 -8
  186. package/data/partialIO.js +124 -113
  187. package/data/ptr.d.ts +12 -12
  188. package/data/ptr.js +42 -44
  189. package/data/ref.d.ts +40 -27
  190. package/data/ref.js +125 -95
  191. package/data/sampler.d.ts +99 -101
  192. package/data/sampler.js +17 -21
  193. package/data/schemaCallWrapper.d.ts +19 -0
  194. package/data/schemaCallWrapper.js +31 -26
  195. package/data/schemaMemoryLayout.d.ts +8 -0
  196. package/data/schemaMemoryLayout.js +213 -185
  197. package/data/sizeOf.d.ts +4 -8
  198. package/data/sizeOf.js +6 -11
  199. package/data/snippet.d.ts +96 -20
  200. package/data/snippet.js +75 -86
  201. package/data/struct.d.ts +4 -7
  202. package/data/struct.js +51 -39
  203. package/data/texture.d.ts +253 -250
  204. package/data/texture.js +238 -200
  205. package/data/unstruct.d.ts +2 -7
  206. package/data/unstruct.js +43 -37
  207. package/data/vector.d.ts +33 -21
  208. package/data/vector.js +234 -221
  209. package/data/vectorImpl.d.ts +231 -0
  210. package/data/vectorImpl.js +563 -515
  211. package/data/vectorOps.d.ts +63 -0
  212. package/data/vectorOps.js +642 -630
  213. package/data/vertexFormatData.d.ts +181 -184
  214. package/data/vertexFormatData.js +104 -106
  215. package/data/wgslTypes.d.ts +665 -600
  216. package/data/wgslTypes.js +220 -198
  217. package/errors.d.ts +50 -24
  218. package/errors.js +146 -120
  219. package/execMode.d.ts +16 -0
  220. package/execMode.js +47 -40
  221. package/extension.d.ts +13 -8
  222. package/extension.js +10 -16
  223. package/getGPUValue.d.ts +1 -0
  224. package/getGPUValue.js +2 -7
  225. package/index.d.ts +28 -68
  226. package/index.js +8 -28
  227. package/indexNamedExports.d.ts +69 -42
  228. package/indexNamedExports.js +25 -0
  229. package/internal.d.ts +16 -0
  230. package/internal.js +12 -0
  231. package/mathUtils.d.ts +5 -0
  232. package/mathUtils.js +7 -11
  233. package/memo.d.ts +11 -0
  234. package/memo.js +20 -22
  235. package/minify.d.ts +5 -0
  236. package/minify.js +93 -0
  237. package/nameUtils.d.ts +29 -0
  238. package/nameUtils.js +428 -398
  239. package/package.json +9 -3
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -624
  242. package/serial/registry.d.ts +15 -0
  243. package/serial/registry.js +106 -0
  244. package/serial/restore.d.ts +49 -0
  245. package/serial/restore.js +68 -0
  246. package/serial/schema.d.ts +58 -0
  247. package/serial/schema.js +209 -0
  248. package/serial/types.d.ts +5 -0
  249. package/serial/types.js +1 -0
  250. package/shared/env.d.ts +9 -0
  251. package/shared/env.js +9 -12
  252. package/shared/generators.d.ts +4 -0
  253. package/shared/generators.js +10 -12
  254. package/shared/meta.d.ts +29 -14
  255. package/shared/meta.js +71 -55
  256. package/shared/normalizeMetadata.d.ts +32 -27
  257. package/shared/normalizeMetadata.js +23 -36
  258. package/shared/repr.d.ts +73 -55
  259. package/shared/repr.js +1 -0
  260. package/shared/soul.d.ts +17 -0
  261. package/shared/soul.js +1 -0
  262. package/shared/stringify.d.ts +2 -0
  263. package/shared/stringify.js +29 -20
  264. package/shared/symbols.d.ts +26 -20
  265. package/shared/symbols.js +79 -79
  266. package/shared/tseynit.d.ts +2 -0
  267. package/shared/tseynit.js +160 -75
  268. package/shared/utilityTypes.d.ts +30 -14
  269. package/shared/utilityTypes.js +2 -6
  270. package/shared/vertexFormat.d.ts +41 -43
  271. package/shared/vertexFormat.js +59 -62
  272. package/std/array.d.ts +2 -7
  273. package/std/array.js +18 -23
  274. package/std/atomic.d.ts +14 -18
  275. package/std/atomic.js +96 -95
  276. package/std/bitcast.d.ts +193 -10
  277. package/std/bitcast.js +309 -39
  278. package/std/boolean.d.ts +19 -33
  279. package/std/boolean.js +296 -288
  280. package/std/copy.d.ts +2 -7
  281. package/std/copy.js +27 -24
  282. package/std/derivative.d.ts +11 -15
  283. package/std/derivative.js +56 -79
  284. package/std/discard.d.ts +1 -6
  285. package/std/discard.js +7 -14
  286. package/std/environment.d.ts +19 -14
  287. package/std/environment.js +71 -51
  288. package/std/extensions.d.ts +2 -8
  289. package/std/extensions.js +10 -11
  290. package/std/index.d.ts +20 -24
  291. package/std/index.js +32 -187
  292. package/std/matrix.d.ts +6 -12
  293. package/std/matrix.js +60 -69
  294. package/std/numeric.d.ts +143 -146
  295. package/std/numeric.js +858 -749
  296. package/std/operators.d.ts +19 -27
  297. package/std/operators.js +227 -193
  298. package/std/packing.d.ts +5 -11
  299. package/std/packing.js +67 -75
  300. package/std/range.d.ts +6 -11
  301. package/std/range.js +48 -36
  302. package/std/subgroup.d.ts +33 -37
  303. package/std/subgroup.js +180 -217
  304. package/std/texture.d.ts +70 -38
  305. package/std/texture.js +176 -172
  306. package/taskQueue.d.ts +6 -0
  307. package/taskQueue.js +30 -0
  308. package/tgpu.d.ts +16 -0
  309. package/tgpu.js +17 -44
  310. package/tgpuBindGroupLayout.d.ts +132 -152
  311. package/tgpuBindGroupLayout.js +346 -268
  312. package/tgpuLogger.d.ts +34 -0
  313. package/tgpuLogger.js +63 -0
  314. package/tgpuUnstable.d.ts +16 -22
  315. package/tgpuUnstable.js +13 -35
  316. package/tgsl/accessIndex.d.ts +2 -0
  317. package/tgsl/accessIndex.js +76 -33
  318. package/tgsl/accessProp.d.ts +2 -0
  319. package/tgsl/accessProp.js +142 -100
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +18 -0
  322. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  323. package/tgsl/consoleLog/deserializers.js +119 -103
  324. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  325. package/tgsl/consoleLog/logGenerator.js +85 -80
  326. package/tgsl/consoleLog/serializers.d.ts +21 -0
  327. package/tgsl/consoleLog/serializers.js +119 -100
  328. package/tgsl/consoleLog/types.d.ts +40 -39
  329. package/tgsl/consoleLog/types.js +1 -0
  330. package/tgsl/conversion.d.ts +33 -0
  331. package/tgsl/conversion.js +272 -193
  332. package/tgsl/forOfUtils.d.ts +15 -0
  333. package/tgsl/forOfUtils.js +85 -70
  334. package/tgsl/generationHelpers.d.ts +22 -39
  335. package/tgsl/generationHelpers.js +85 -58
  336. package/tgsl/infixDispatch.d.ts +70 -0
  337. package/tgsl/infixDispatch.js +48 -46
  338. package/tgsl/jsPolyfills.d.ts +16 -19
  339. package/tgsl/jsPolyfills.js +44 -42
  340. package/tgsl/makeDereferenceable.d.ts +48 -0
  341. package/tgsl/makeDereferenceable.js +86 -0
  342. package/tgsl/makeResolvable.d.ts +22 -0
  343. package/tgsl/makeResolvable.js +33 -0
  344. package/tgsl/shaderGenerator.d.ts +77 -17
  345. package/tgsl/shaderGenerator.js +1 -0
  346. package/tgsl/shellless.d.ts +6 -9
  347. package/tgsl/shellless.js +73 -43
  348. package/tgsl/wgslGenerator.d.ts +66 -59
  349. package/tgsl/wgslGenerator.js +1344 -747
  350. package/types.d.ts +287 -221
  351. package/types.js +61 -44
  352. package/unwrapper.d.ts +31 -26
  353. package/unwrapper.js +1 -0
  354. package/wgslExtensions.d.ts +3 -5
  355. package/wgslExtensions.js +12 -16
  356. package/_virtual/rolldown_runtime.js +0 -13
  357. package/core/buffer/bufferShorthand.d.ts +0 -50
  358. package/core/buffer/bufferShorthand.js +0 -55
  359. package/core/pipeline/applyPipelineState.js +0 -37
  360. package/package.js +0 -5
  361. package/tgsl/shaderGenerator_members.d.ts +0 -33
  362. package/tgsl/shaderGenerator_members.js +0 -12
package/data/ref.js CHANGED
@@ -1,109 +1,139 @@
1
- import { $gpuCallable, $internal, $ownSnippet, $resolve } from "../shared/symbols.js";
2
- import { isNaturallyEphemeral, isPtr } from "./wgslTypes.js";
1
+ import { stitch } from "../core/resolve/stitch.js";
2
+ import { WgslTypeError } from "../errors.js";
3
3
  import { setName } from "../shared/meta.js";
4
+ import { $gpuCallable, $internal, $ownSnippet, $resolve } from "../shared/symbols.js";
4
5
  import { UnknownData } from "./dataTypes.js";
5
- import { isAlias, snip } from "./snippet.js";
6
- import { WgslTypeError } from "../errors.js";
7
- import { stitch } from "../core/resolve/stitch.js";
8
6
  import { createPtrFromOrigin, explicitFrom } from "./ptr.js";
9
-
10
- //#region src/data/ref.ts
11
- const _ref = (() => {
12
- const impl = ((value) => INTERNAL_createRef(value));
13
- setName(impl, "ref");
14
- impl.toString = () => "ref";
15
- impl[$internal] = true;
16
- impl[$gpuCallable] = { call(ctx, [value]) {
17
- if (value.origin === "argument") throw new WgslTypeError(stitch`d.ref(${value}) is illegal, cannot take a reference of an argument. Copy the value first, and take a reference of the copy.`);
18
- if (value.origin === "constant-immutable-def" || value.origin === "runtime-immutable-def") {
19
- const typeStr = ctx.resolve(value.dataType).value;
20
- throw new WgslTypeError(stitch`d.ref(${value}) is illegal, cannot take a reference to a constant.
7
+ import { isAlias, snip, withDataType } from "./snippet.js";
8
+ import { isNaturallyEphemeral, isPtr } from "./wgslTypes.js";
9
+ export const _ref = (() => {
10
+ const impl = ((value) => INTERNAL_createRef(value));
11
+ setName(impl, 'ref');
12
+ impl.toString = () => 'ref';
13
+ impl[$internal] = true;
14
+ impl[$gpuCallable] = {
15
+ call(ctx, [value]) {
16
+ if (value.origin === 'argument') {
17
+ throw new WgslTypeError(stitch `d.ref(${value}) is illegal, cannot take a reference of an argument. Copy the value first, and take a reference of the copy.`);
18
+ }
19
+ if (value.origin === 'constant-immutable-def' || value.origin === 'runtime-immutable-def') {
20
+ const typeStr = ctx.resolve(value.dataType).value;
21
+ throw new WgslTypeError(stitch `d.ref(${value}) is illegal, cannot take a reference to a constant.
21
22
  -----
22
23
  - Try 'd.ref(${typeStr}(${value}));' instead to create a new referencable value.
23
24
  -----`);
24
- }
25
- if (isAlias(value) && isNaturallyEphemeral(value.dataType)) {
26
- const typeStr = ctx.resolve(value.dataType).value;
27
- throw new WgslTypeError(stitch`d.ref(${value}) is illegal, cannot take a reference to a scalar value.
25
+ }
26
+ if (isAlias(value) && isNaturallyEphemeral(value.dataType)) {
27
+ const typeStr = ctx.resolve(value.dataType).value;
28
+ throw new WgslTypeError(stitch `d.ref(${value}) is illegal, cannot take a reference to a scalar value.
28
29
  -----
29
30
  - Try 'd.ref(${typeStr}(${value}));' instead to create a new referencable scalar.
30
31
  -----`);
31
- }
32
- if (isPtr(value.dataType)) return snip(value.value, explicitFrom(value.dataType), value.origin);
33
- /**
34
- * Pointer type only exists if the ref was created from a reference (buttery-butter).
35
- *
36
- * @example
37
- * ```ts
38
- * const life = ref(42); // created from a value
39
- * const boid = ref(layout.$.boids[0]); // created from a reference
40
- * ```
41
- */
42
- const ptrType = createPtrFromOrigin(value.origin, value.dataType);
43
- return snip(new RefOperator(value, ptrType), ptrType ?? UnknownData, "runtime");
44
- } };
45
- return impl;
32
+ }
33
+ if (isPtr(value.dataType)) {
34
+ // This can happen if we take a reference of an *implicit* pointer, one
35
+ // made by assigning a reference to a `const`.
36
+ return withDataType(explicitFrom(value.dataType), value);
37
+ }
38
+ /**
39
+ * Pointer type only exists if the ref was created from a reference (buttery-butter).
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * const life = ref(42); // created from a value
44
+ * const boid = ref(layout.$.boids[0]); // created from a reference
45
+ * ```
46
+ */
47
+ const ptrType = createPtrFromOrigin(value.origin, value.dataType);
48
+ return snip(new RefOperator(value, ptrType), ptrType ?? UnknownData,
49
+ /* origin */ 'runtime', value.possibleSideEffects);
50
+ },
51
+ };
52
+ return impl;
46
53
  })();
47
- function isRef(value) {
48
- return value?.[$internal]?.type === "ref";
54
+ export function isRef(value) {
55
+ return value?.[$internal]?.type === 'ref';
49
56
  }
50
- function INTERNAL_createRef(value) {
51
- const target = {
52
- [$internal]: { type: "ref" },
53
- get $() {
54
- return value;
55
- },
56
- set $(newValue) {
57
- if (newValue && typeof newValue === "object") for (const key of Object.keys(newValue)) value[key] = newValue[key];
58
- else value = newValue;
59
- }
60
- };
61
- if (value === void 0 || value === null) throw new Error("Cannot create a ref from undefined or null");
62
- if (typeof value === "object") return new Proxy(target, {
63
- get(target$1, prop) {
64
- if (prop in target$1) return target$1[prop];
65
- return value[prop];
66
- },
67
- set(_target, prop, propValue) {
68
- if (prop === $internal) return false;
69
- if (prop === "$") {
70
- console.log("Setting ref value:", propValue);
71
- return Reflect.set(target, prop, propValue);
72
- }
73
- return Reflect.set(value, prop, propValue);
74
- }
75
- });
76
- return target;
57
+ // --------------
58
+ // Implementation
59
+ // --------------
60
+ export function INTERNAL_createRef(value) {
61
+ const target = {
62
+ [$internal]: { type: 'ref' },
63
+ get $() {
64
+ return value;
65
+ },
66
+ set $(newValue) {
67
+ if (newValue && typeof newValue === 'object') {
68
+ // Setting an object means updating the properties of the original object.
69
+ // e.g.: foo.$ = Boid();
70
+ for (const key of Object.keys(newValue)) {
71
+ value[key] = newValue[key];
72
+ }
73
+ }
74
+ else {
75
+ value = newValue;
76
+ }
77
+ },
78
+ };
79
+ if (value === undefined || value === null) {
80
+ throw new Error('Cannot create a ref from undefined or null');
81
+ }
82
+ if (typeof value === 'object') {
83
+ return new Proxy(target, {
84
+ get(target, prop) {
85
+ if (prop in target) {
86
+ return target[prop];
87
+ }
88
+ return value[prop];
89
+ },
90
+ set(_target, prop, propValue) {
91
+ if (prop === $internal) {
92
+ return false;
93
+ }
94
+ if (prop === '$') {
95
+ return Reflect.set(target, prop, propValue);
96
+ }
97
+ return Reflect.set(value, prop, propValue);
98
+ },
99
+ });
100
+ }
101
+ return target;
77
102
  }
78
103
  /**
79
- * The result of calling `d.ref(...)`. The code responsible for
80
- * generating shader code can check if the value of a snippet is
81
- * an instance of `RefOperator`, and act accordingly.
82
- */
83
- var RefOperator = class {
84
- [$internal];
85
- snippet;
86
- #ptrType;
87
- constructor(snippet, ptrType) {
88
- this[$internal] = true;
89
- this.snippet = snippet;
90
- this.#ptrType = ptrType;
91
- }
92
- get [$ownSnippet]() {
93
- if (!this.#ptrType) throw new Error(stitch`Cannot take a reference of ${this.snippet}`);
94
- return snip(this, this.#ptrType, this.snippet.origin);
95
- }
96
- [$resolve]() {
97
- if (!this.#ptrType) throw new Error(stitch`Cannot take a reference of ${this.snippet}`);
98
- return snip(stitch`(&${this.snippet})`, this.#ptrType, this.snippet.origin);
99
- }
100
- };
101
- function derefSnippet(snippet) {
102
- if (!isPtr(snippet.dataType)) return snippet;
103
- const innerType = snippet.dataType.inner;
104
- if (snippet.value instanceof RefOperator) return snip(stitch`${snippet.value.snippet}`, innerType, snippet.origin);
105
- return snip(stitch`(*${snippet})`, innerType, snippet.origin);
104
+ * The result of calling `d.ref(...)`. The code responsible for
105
+ * generating shader code can check if the value of a snippet is
106
+ * an instance of `RefOperator`, and act accordingly.
107
+ */
108
+ export class RefOperator {
109
+ [$internal];
110
+ snippet;
111
+ #ptrType;
112
+ constructor(snippet, ptrType) {
113
+ this[$internal] = true;
114
+ this.snippet = snippet;
115
+ this.#ptrType = ptrType;
116
+ }
117
+ get [$ownSnippet]() {
118
+ if (!this.#ptrType) {
119
+ throw new Error(stitch `Cannot take a reference of ${this.snippet}`);
120
+ }
121
+ return snip(this, this.#ptrType, this.snippet.origin, this.snippet.possibleSideEffects);
122
+ }
123
+ [$resolve]() {
124
+ if (!this.#ptrType) {
125
+ throw new Error(stitch `Cannot take a reference of ${this.snippet}`);
126
+ }
127
+ return snip(stitch `(&${this.snippet})`, this.#ptrType, this.snippet.origin, this.snippet.possibleSideEffects);
128
+ }
129
+ }
130
+ export function derefSnippet(snippet) {
131
+ if (!isPtr(snippet.dataType)) {
132
+ return snippet;
133
+ }
134
+ const innerType = snippet.dataType.inner;
135
+ if (snippet.value instanceof RefOperator) {
136
+ return snip(stitch `${snippet.value.snippet}`, innerType, snippet.origin, snippet.possibleSideEffects);
137
+ }
138
+ return snip(stitch `(*${snippet})`, innerType, snippet.origin, snippet.possibleSideEffects);
106
139
  }
107
-
108
- //#endregion
109
- export { RefOperator, _ref, derefSnippet, isRef };
package/data/sampler.d.ts CHANGED
@@ -1,107 +1,105 @@
1
- import { $internal, $repr } from "../shared/symbols.js";
2
- import { BaseData } from "./wgslTypes.js";
3
-
4
- //#region src/data/sampler.d.ts
5
- interface WgslSamplerProps {
6
- addressModeU?: GPUAddressMode;
7
- addressModeV?: GPUAddressMode;
8
- /**
9
- * Specifies the address modes for the texture width, height, and depth
10
- * coordinates, respectively.
11
- */
12
- addressModeW?: GPUAddressMode;
13
- /**
14
- * Specifies the sampling behavior when the sample footprint is smaller than or equal to one
15
- * texel.
16
- */
17
- magFilter?: GPUFilterMode;
18
- /**
19
- * Specifies the sampling behavior when the sample footprint is larger than one texel.
20
- */
21
- minFilter?: GPUFilterMode;
22
- /**
23
- * Specifies behavior for sampling between mipmap levels.
24
- */
25
- mipmapFilter?: GPUMipmapFilterMode;
26
- lodMinClamp?: number;
27
- /**
28
- * Specifies the minimum and maximum levels of detail, respectively, used internally when
29
- * sampling a texture.
30
- */
31
- lodMaxClamp?: number;
32
- /**
33
- * Specifies the maximum anisotropy value clamp used by the sampler. Anisotropic filtering is
34
- * enabled when {@link GPUSamplerDescriptor.maxAnisotropy} is > 1 and the implementation supports it.
35
- * Anisotropic filtering improves the image quality of textures sampled at oblique viewing
36
- * angles. Higher {@link GPUSamplerDescriptor.maxAnisotropy} values indicate the maximum ratio of
37
- * anisotropy supported when filtering.
38
- *
39
- * Most implementations support {@link GPUSamplerDescriptor.maxAnisotropy} values in range
40
- * between 1 and 16, inclusive. The used value of {@link GPUSamplerDescriptor.maxAnisotropy}
41
- * will be clamped to the maximum value that the platform supports.
42
- * The precise filtering behavior is implementation-dependent.
43
- */
44
- maxAnisotropy?: number;
1
+ import { $internal, $repr } from '../shared/symbols.ts';
2
+ import type { BaseData } from './wgslTypes.ts';
3
+ export interface WgslSamplerProps {
4
+ addressModeU?: GPUAddressMode;
5
+ addressModeV?: GPUAddressMode;
6
+ /**
7
+ * Specifies the address modes for the texture width, height, and depth
8
+ * coordinates, respectively.
9
+ */
10
+ addressModeW?: GPUAddressMode;
11
+ /**
12
+ * Specifies the sampling behavior when the sample footprint is smaller than or equal to one
13
+ * texel.
14
+ */
15
+ magFilter?: GPUFilterMode;
16
+ /**
17
+ * Specifies the sampling behavior when the sample footprint is larger than one texel.
18
+ */
19
+ minFilter?: GPUFilterMode;
20
+ /**
21
+ * Specifies behavior for sampling between mipmap levels.
22
+ */
23
+ mipmapFilter?: GPUMipmapFilterMode;
24
+ lodMinClamp?: number;
25
+ /**
26
+ * Specifies the minimum and maximum levels of detail, respectively, used internally when
27
+ * sampling a texture.
28
+ */
29
+ lodMaxClamp?: number;
30
+ /**
31
+ * Specifies the maximum anisotropy value clamp used by the sampler. Anisotropic filtering is
32
+ * enabled when {@link GPUSamplerDescriptor.maxAnisotropy} is > 1 and the implementation supports it.
33
+ * Anisotropic filtering improves the image quality of textures sampled at oblique viewing
34
+ * angles. Higher {@link GPUSamplerDescriptor.maxAnisotropy} values indicate the maximum ratio of
35
+ * anisotropy supported when filtering.
36
+ *
37
+ * Most implementations support {@link GPUSamplerDescriptor.maxAnisotropy} values in range
38
+ * between 1 and 16, inclusive. The used value of {@link GPUSamplerDescriptor.maxAnisotropy}
39
+ * will be clamped to the maximum value that the platform supports.
40
+ * The precise filtering behavior is implementation-dependent.
41
+ */
42
+ maxAnisotropy?: number;
45
43
  }
46
- interface WgslComparisonSamplerProps {
47
- compare: GPUCompareFunction;
48
- addressModeU?: GPUAddressMode;
49
- addressModeV?: GPUAddressMode;
50
- /**
51
- * Specifies the address modes for the texture width, height, and depth
52
- * coordinates, respectively.
53
- */
54
- addressModeW?: GPUAddressMode;
55
- /**
56
- * Specifies the sampling behavior when the sample footprint is smaller than or equal to one
57
- * texel.
58
- */
59
- magFilter?: GPUFilterMode;
60
- /**
61
- * Specifies the sampling behavior when the sample footprint is larger than one texel.
62
- */
63
- minFilter?: GPUFilterMode;
64
- /**
65
- * Specifies behavior for sampling between mipmap levels.
66
- */
67
- mipmapFilter?: GPUMipmapFilterMode;
68
- lodMinClamp?: number;
69
- /**
70
- * Specifies the minimum and maximum levels of detail, respectively, used internally when
71
- * sampling a texture.
72
- */
73
- lodMaxClamp?: number;
74
- /**
75
- * Specifies the maximum anisotropy value clamp used by the sampler. Anisotropic filtering is
76
- * enabled when {@link GPUSamplerDescriptor.maxAnisotropy} is > 1 and the implementation supports it.
77
- * Anisotropic filtering improves the image quality of textures sampled at oblique viewing
78
- * angles. Higher {@link GPUSamplerDescriptor.maxAnisotropy} values indicate the maximum ratio of
79
- * anisotropy supported when filtering.
80
- *
81
- * Most implementations support {@link GPUSamplerDescriptor.maxAnisotropy} values in range
82
- * between 1 and 16, inclusive. The used value of {@link GPUSamplerDescriptor.maxAnisotropy}
83
- * will be clamped to the maximum value that the platform supports.
84
- * The precise filtering behavior is implementation-dependent.
85
- */
86
- maxAnisotropy?: number;
44
+ export interface WgslComparisonSamplerProps {
45
+ compare: GPUCompareFunction;
46
+ addressModeU?: GPUAddressMode;
47
+ addressModeV?: GPUAddressMode;
48
+ /**
49
+ * Specifies the address modes for the texture width, height, and depth
50
+ * coordinates, respectively.
51
+ */
52
+ addressModeW?: GPUAddressMode;
53
+ /**
54
+ * Specifies the sampling behavior when the sample footprint is smaller than or equal to one
55
+ * texel.
56
+ */
57
+ magFilter?: GPUFilterMode;
58
+ /**
59
+ * Specifies the sampling behavior when the sample footprint is larger than one texel.
60
+ */
61
+ minFilter?: GPUFilterMode;
62
+ /**
63
+ * Specifies behavior for sampling between mipmap levels.
64
+ */
65
+ mipmapFilter?: GPUMipmapFilterMode;
66
+ lodMinClamp?: number;
67
+ /**
68
+ * Specifies the minimum and maximum levels of detail, respectively, used internally when
69
+ * sampling a texture.
70
+ */
71
+ lodMaxClamp?: number;
72
+ /**
73
+ * Specifies the maximum anisotropy value clamp used by the sampler. Anisotropic filtering is
74
+ * enabled when {@link GPUSamplerDescriptor.maxAnisotropy} is > 1 and the implementation supports it.
75
+ * Anisotropic filtering improves the image quality of textures sampled at oblique viewing
76
+ * angles. Higher {@link GPUSamplerDescriptor.maxAnisotropy} values indicate the maximum ratio of
77
+ * anisotropy supported when filtering.
78
+ *
79
+ * Most implementations support {@link GPUSamplerDescriptor.maxAnisotropy} values in range
80
+ * between 1 and 16, inclusive. The used value of {@link GPUSamplerDescriptor.maxAnisotropy}
81
+ * will be clamped to the maximum value that the platform supports.
82
+ * The precise filtering behavior is implementation-dependent.
83
+ */
84
+ maxAnisotropy?: number;
87
85
  }
88
- interface sampler {
89
- [$internal]: true;
90
- type: 'sampler';
86
+ export interface sampler {
87
+ [$internal]: true;
88
+ type: 'sampler';
91
89
  }
92
- declare function sampler(): WgslSampler;
93
- interface comparisonSampler {
94
- [$internal]: Record<string, never>;
95
- type: 'sampler_comparison';
90
+ export declare function sampler(): WgslSampler;
91
+ export interface comparisonSampler {
92
+ [$internal]: Record<string, never>;
93
+ type: 'sampler_comparison';
96
94
  }
97
- declare function comparisonSampler(): WgslComparisonSampler;
98
- interface WgslSampler extends BaseData {
99
- readonly [$repr]: sampler;
100
- readonly type: 'sampler';
95
+ export declare function comparisonSampler(): WgslComparisonSampler;
96
+ export interface WgslSampler extends BaseData {
97
+ readonly [$repr]: sampler;
98
+ readonly type: 'sampler';
101
99
  }
102
- interface WgslComparisonSampler extends BaseData {
103
- readonly [$repr]: comparisonSampler;
104
- readonly type: 'sampler_comparison';
100
+ export interface WgslComparisonSampler extends BaseData {
101
+ readonly [$repr]: comparisonSampler;
102
+ readonly type: 'sampler_comparison';
105
103
  }
106
- //#endregion
107
- export { WgslComparisonSampler, WgslComparisonSamplerProps, WgslSampler, WgslSamplerProps, comparisonSampler, sampler };
104
+ export declare function isWgslSampler(value: unknown): value is WgslSampler;
105
+ export declare function isWgslComparisonSampler(value: unknown): value is WgslComparisonSampler;
package/data/sampler.js CHANGED
@@ -1,26 +1,22 @@
1
1
  import { $internal, $repr } from "../shared/symbols.js";
2
-
3
- //#region src/data/sampler.ts
4
- function sampler() {
5
- return {
6
- [$internal]: {},
7
- type: "sampler",
8
- [$repr]: void 0
9
- };
2
+ export function sampler() {
3
+ return {
4
+ [$internal]: {},
5
+ type: 'sampler',
6
+ [$repr]: undefined,
7
+ };
10
8
  }
11
- function comparisonSampler() {
12
- return {
13
- [$internal]: {},
14
- type: "sampler_comparison",
15
- [$repr]: void 0
16
- };
9
+ export function comparisonSampler() {
10
+ return {
11
+ [$internal]: {},
12
+ type: 'sampler_comparison',
13
+ [$repr]: undefined,
14
+ };
17
15
  }
18
- function isWgslSampler(value) {
19
- return !!value[$internal] && value.type === "sampler";
16
+ export function isWgslSampler(value) {
17
+ return !!value[$internal] && value.type === 'sampler';
20
18
  }
21
- function isWgslComparisonSampler(value) {
22
- return !!value[$internal] && value.type === "sampler_comparison";
19
+ export function isWgslComparisonSampler(value) {
20
+ return (!!value[$internal] &&
21
+ value.type === 'sampler_comparison');
23
22
  }
24
-
25
- //#endregion
26
- export { comparisonSampler, isWgslComparisonSampler, isWgslSampler, sampler };
@@ -0,0 +1,19 @@
1
+ import { type ResolutionCtx } from '../types.ts';
2
+ import type { Snippet } from './snippet.ts';
3
+ import type { BaseData } from './wgslTypes.ts';
4
+ /**
5
+ * A wrapper for `schema(item)` or `schema()` call on JS side.
6
+ * If the schema is a pointer, returns the value pointed to without copying.
7
+ * If the schema is a TgpuVertexFormatData, calls the corresponding constructible schema instead.
8
+ * If the schema is not callable, throws an error.
9
+ * Otherwise, returns `schema(item)` or `schema()`.
10
+ */
11
+ export declare function schemaCallWrapper<T>(schema: BaseData, item?: T): T;
12
+ /**
13
+ * A wrapper for `schema(item)` or `schema()` call on the GPU side.
14
+ * If the schema is a pointer, returns the value pointed to without copying.
15
+ * If the schema is a TgpuVertexFormatData, calls the corresponding constructible schema instead.
16
+ * If the schema is not callable, throws an error.
17
+ * Otherwise, returns `schema(item)` or `schema()`.
18
+ */
19
+ export declare function schemaCallWrapperGPU(ctx: ResolutionCtx, schema: BaseData, item?: Snippet): Snippet;
@@ -1,32 +1,37 @@
1
1
  import { $cast, $gpuCallable } from "../shared/symbols.js";
2
2
  import { hasCast, isGPUCallable } from "../types.js";
3
-
4
- //#region src/data/schemaCallWrapper.ts
5
3
  /**
6
- * A wrapper for `schema(item)` or `schema()` call on JS side.
7
- * If the schema is a pointer, returns the value pointed to without copying.
8
- * If the schema is a TgpuVertexFormatData, calls the corresponding constructible schema instead.
9
- * If the schema is not callable, throws an error.
10
- * Otherwise, returns `schema(item)` or `schema()`.
11
- */
12
- function schemaCallWrapper(schema, item) {
13
- const callSchema = schema;
14
- if (hasCast(callSchema)) return callSchema[$cast](item);
15
- if (typeof callSchema !== "function") return item;
16
- return item === void 0 ? callSchema() : callSchema(item);
4
+ * A wrapper for `schema(item)` or `schema()` call on JS side.
5
+ * If the schema is a pointer, returns the value pointed to without copying.
6
+ * If the schema is a TgpuVertexFormatData, calls the corresponding constructible schema instead.
7
+ * If the schema is not callable, throws an error.
8
+ * Otherwise, returns `schema(item)` or `schema()`.
9
+ */
10
+ export function schemaCallWrapper(schema, item) {
11
+ const callSchema = schema;
12
+ if (hasCast(callSchema)) {
13
+ return callSchema[$cast](item);
14
+ }
15
+ if (typeof callSchema !== 'function') {
16
+ // Not callable
17
+ return item;
18
+ }
19
+ return item === undefined ? callSchema() : callSchema(item);
17
20
  }
18
21
  /**
19
- * A wrapper for `schema(item)` or `schema()` call on the GPU side.
20
- * If the schema is a pointer, returns the value pointed to without copying.
21
- * If the schema is a TgpuVertexFormatData, calls the corresponding constructible schema instead.
22
- * If the schema is not callable, throws an error.
23
- * Otherwise, returns `schema(item)` or `schema()`.
24
- */
25
- function schemaCallWrapperGPU(ctx, schema, item) {
26
- if (!isGPUCallable(schema)) return item;
27
- const callSchema = schema;
28
- return item === void 0 || item.value === void 0 ? callSchema[$gpuCallable].call(ctx, []) : callSchema[$gpuCallable].call(ctx, [item]);
22
+ * A wrapper for `schema(item)` or `schema()` call on the GPU side.
23
+ * If the schema is a pointer, returns the value pointed to without copying.
24
+ * If the schema is a TgpuVertexFormatData, calls the corresponding constructible schema instead.
25
+ * If the schema is not callable, throws an error.
26
+ * Otherwise, returns `schema(item)` or `schema()`.
27
+ */
28
+ export function schemaCallWrapperGPU(ctx, schema, item) {
29
+ if (!isGPUCallable(schema)) {
30
+ // Not callable
31
+ return item;
32
+ }
33
+ const callSchema = schema;
34
+ return item === undefined || item.value === undefined
35
+ ? callSchema[$gpuCallable].call(ctx, [])
36
+ : callSchema[$gpuCallable].call(ctx, [item]);
29
37
  }
30
-
31
- //#endregion
32
- export { schemaCallWrapper, schemaCallWrapperGPU };
@@ -0,0 +1,8 @@
1
+ import type { BaseData } from './wgslTypes.ts';
2
+ interface SchemaMemoryLayout {
3
+ isContiguous: boolean;
4
+ size: number;
5
+ longestContiguousPrefix: number;
6
+ }
7
+ export declare function getLayoutInfo<T extends keyof SchemaMemoryLayout>(schema: BaseData, key: T): SchemaMemoryLayout[T];
8
+ export {};