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/data/partialIO.js CHANGED
@@ -1,120 +1,131 @@
1
- import { isWgslArray, isWgslStruct } from "./wgslTypes.js";
2
- import { isDisarray, isUnstruct } from "./dataTypes.js";
3
- import { alignmentOf } from "./alignmentOf.js";
1
+ import { BufferWriter, getSystemEndianness } from 'typed-binary';
4
2
  import { roundUp } from "../mathUtils.js";
5
- import { sizeOf } from "./sizeOf.js";
6
- import { offsetsForProps } from "./offsets.js";
3
+ import { alignmentOf } from "./alignmentOf.js";
7
4
  import { getCompiledWriter } from "./compiledIO.js";
8
5
  import { writeData } from "./dataIO.js";
9
- import { BufferWriter, getSystemEndianness } from "typed-binary";
10
-
11
- //#region src/data/partialIO.ts
6
+ import { isDisarray, isUnstruct } from "./dataTypes.js";
7
+ import { offsetsForProps } from "./offsets.js";
8
+ import { sizeOf } from "./sizeOf.js";
9
+ import { isWgslArray, isWgslStruct } from "./wgslTypes.js";
12
10
  /**
13
- * Converts `{idx, value}[]` sparse arrays into `Record<number, T>` format.
14
- */
15
- function convertPartialToPatch(schema, data) {
16
- if (data === void 0 || data === null) return data;
17
- if (isWgslStruct(schema) || isUnstruct(schema)) {
18
- const result = {};
19
- const record = data;
20
- for (const key of Object.keys(schema.propTypes)) {
21
- const subSchema = schema.propTypes[key];
22
- const value = record[key];
23
- if (value !== void 0 && subSchema) result[key] = convertPartialToPatch(subSchema, value);
24
- }
25
- return result;
26
- }
27
- if (isWgslArray(schema) || isDisarray(schema)) {
28
- const arrSchema = schema;
29
- const result = {};
30
- for (const { idx, value } of data) result[idx] = convertPartialToPatch(arrSchema.elementType, value);
31
- return result;
32
- }
33
- return data;
11
+ * Converts `{idx, value}[]` sparse arrays into `Record<number, T>` format.
12
+ */
13
+ export function convertPartialToPatch(schema, data) {
14
+ if (data === undefined || data === null) {
15
+ return data;
16
+ }
17
+ if (isWgslStruct(schema) || isUnstruct(schema)) {
18
+ const result = {};
19
+ const record = data;
20
+ for (const key of Object.keys(schema.propTypes)) {
21
+ const subSchema = schema.propTypes[key];
22
+ const value = record[key];
23
+ if (value !== undefined && subSchema) {
24
+ result[key] = convertPartialToPatch(subSchema, value);
25
+ }
26
+ }
27
+ return result;
28
+ }
29
+ if (isWgslArray(schema) || isDisarray(schema)) {
30
+ const arrSchema = schema;
31
+ const result = {};
32
+ for (const { idx, value } of data) {
33
+ result[idx] = convertPartialToPatch(arrSchema.elementType, value);
34
+ }
35
+ return result;
36
+ }
37
+ return data;
34
38
  }
35
- const isLittleEndian = getSystemEndianness() === "little";
36
- function getPatchInstructions(schema, data, targetBuffer) {
37
- const totalSize = sizeOf(schema);
38
- if (totalSize === 0 || data === void 0 || data === null) return [];
39
- const buf = targetBuffer ?? new ArrayBuffer(totalSize);
40
- const writer = new BufferWriter(buf);
41
- const compiledView = new DataView(buf);
42
- const segments = [];
43
- function collect(node, value, offset, padding) {
44
- if (value === void 0 || value === null) return;
45
- if (isWgslStruct(node) || isUnstruct(node)) {
46
- const propOffsets = offsetsForProps(node);
47
- for (const [key, propOffset] of Object.entries(propOffsets)) {
48
- const childValue = value[key];
49
- const subSchema = node.propTypes[key];
50
- if (childValue !== void 0 && subSchema) collect(subSchema, childValue, offset + propOffset.offset, propOffset.padding ?? padding);
51
- }
52
- return;
53
- }
54
- if (isWgslArray(node) || isDisarray(node)) {
55
- const arrSchema = node;
56
- const elementSize = roundUp(sizeOf(arrSchema.elementType), alignmentOf(arrSchema.elementType));
57
- const elementPadding = elementSize - sizeOf(arrSchema.elementType);
58
- if (ArrayBuffer.isView(value)) {
59
- const copyLen = Math.min(value.byteLength, arrSchema.elementCount * elementSize);
60
- new Uint8Array(buf, offset, copyLen).set(new Uint8Array(value.buffer, value.byteOffset, copyLen));
61
- segments.push({
62
- start: offset,
63
- end: offset + copyLen,
64
- padding
65
- });
66
- return;
67
- }
68
- if (Array.isArray(value)) {
69
- for (let i = 0; i < Math.min(arrSchema.elementCount, value.length); i++) collect(arrSchema.elementType, value[i], offset + i * elementSize, elementPadding);
70
- return;
71
- }
72
- const sparse = value;
73
- for (const key of Object.keys(sparse)) {
74
- const idx = Number(key);
75
- if (!Number.isNaN(idx)) collect(arrSchema.elementType, sparse[key], offset + idx * elementSize, elementPadding);
76
- }
77
- return;
78
- }
79
- const leafSize = sizeOf(node);
80
- const compiledWriter = getCompiledWriter(node);
81
- if (compiledWriter) compiledWriter(compiledView, offset, value, isLittleEndian, offset + leafSize);
82
- else {
83
- writer.seekTo(offset);
84
- writeData(writer, node, value);
85
- }
86
- segments.push({
87
- start: offset,
88
- end: offset + leafSize,
89
- padding
90
- });
91
- }
92
- collect(schema, data, 0);
93
- const instructions = [];
94
- let run = null;
95
- for (const seg of segments) if (run && seg.start === run.end + (run.padding ?? 0)) run = {
96
- start: run.start,
97
- end: seg.end,
98
- padding: seg.padding
99
- };
100
- else {
101
- if (run) instructions.push({
102
- gpuOffset: run.start,
103
- data: new Uint8Array(buf, run.start, run.end - run.start).slice()
104
- });
105
- run = seg;
106
- }
107
- if (run) instructions.push({
108
- gpuOffset: run.start,
109
- data: new Uint8Array(buf, run.start, run.end - run.start).slice()
110
- });
111
- return instructions;
39
+ const isLittleEndian = getSystemEndianness() === 'little';
40
+ export function getPatchInstructions(schema, data, targetBuffer) {
41
+ const totalSize = sizeOf(schema);
42
+ if (totalSize === 0 || data === undefined || data === null) {
43
+ return [];
44
+ }
45
+ const buf = targetBuffer ?? new ArrayBuffer(totalSize);
46
+ const writer = new BufferWriter(buf);
47
+ const compiledView = new DataView(buf);
48
+ const segments = [];
49
+ function collect(node, value, offset, padding) {
50
+ if (value === undefined || value === null) {
51
+ return;
52
+ }
53
+ if (isWgslStruct(node) || isUnstruct(node)) {
54
+ const propOffsets = offsetsForProps(node);
55
+ for (const [key, propOffset] of Object.entries(propOffsets)) {
56
+ const childValue = value[key];
57
+ const subSchema = node.propTypes[key];
58
+ if (childValue !== undefined && subSchema) {
59
+ collect(subSchema, childValue, offset + propOffset.offset, propOffset.padding ?? padding);
60
+ }
61
+ }
62
+ return;
63
+ }
64
+ if (isWgslArray(node) || isDisarray(node)) {
65
+ const arrSchema = node;
66
+ const elementSize = roundUp(sizeOf(arrSchema.elementType), alignmentOf(arrSchema.elementType));
67
+ const elementPadding = elementSize - sizeOf(arrSchema.elementType);
68
+ if (ArrayBuffer.isView(value)) {
69
+ const copyLen = Math.min(value.byteLength, arrSchema.elementCount * elementSize);
70
+ new Uint8Array(buf, offset, copyLen).set(new Uint8Array(value.buffer, value.byteOffset, copyLen));
71
+ segments.push({ start: offset, end: offset + copyLen, padding });
72
+ return;
73
+ }
74
+ if (Array.isArray(value)) {
75
+ for (let i = 0; i < Math.min(arrSchema.elementCount, value.length); i++) {
76
+ collect(arrSchema.elementType, value[i], offset + i * elementSize, elementPadding);
77
+ }
78
+ return;
79
+ }
80
+ const sparse = value;
81
+ for (const key of Object.keys(sparse)) {
82
+ const idx = Number(key);
83
+ if (!Number.isNaN(idx)) {
84
+ collect(arrSchema.elementType, sparse[key], offset + idx * elementSize, elementPadding);
85
+ }
86
+ }
87
+ return;
88
+ }
89
+ const leafSize = sizeOf(node);
90
+ const compiledWriter = getCompiledWriter(node);
91
+ if (compiledWriter) {
92
+ compiledWriter(compiledView, offset, value, isLittleEndian, offset + leafSize);
93
+ }
94
+ else {
95
+ writer.seekTo(offset);
96
+ writeData(writer, node, value);
97
+ }
98
+ segments.push({ start: offset, end: offset + leafSize, padding });
99
+ }
100
+ collect(schema, data, 0);
101
+ const instructions = [];
102
+ let run = null;
103
+ for (const seg of segments) {
104
+ if (run && seg.start === run.end + (run.padding ?? 0)) {
105
+ run = { start: run.start, end: seg.end, padding: seg.padding };
106
+ }
107
+ else {
108
+ if (run) {
109
+ instructions.push({
110
+ gpuOffset: run.start,
111
+ data: new Uint8Array(buf, run.start, run.end - run.start).slice(),
112
+ });
113
+ }
114
+ run = seg;
115
+ }
116
+ }
117
+ if (run) {
118
+ instructions.push({
119
+ gpuOffset: run.start,
120
+ data: new Uint8Array(buf, run.start, run.end - run.start).slice(),
121
+ });
122
+ }
123
+ return instructions;
112
124
  }
113
- function patchArrayBuffer(buffer, schema, data) {
114
- const instructions = getPatchInstructions(schema, data, buffer);
115
- const mappedView = new Uint8Array(buffer);
116
- for (const { data: data$1, gpuOffset } of instructions) mappedView.set(data$1, gpuOffset);
125
+ export function patchArrayBuffer(buffer, schema, data) {
126
+ const instructions = getPatchInstructions(schema, data, buffer);
127
+ const mappedView = new Uint8Array(buffer);
128
+ for (const { data, gpuOffset } of instructions) {
129
+ mappedView.set(data, gpuOffset);
130
+ }
117
131
  }
118
-
119
- //#endregion
120
- export { convertPartialToPatch, getPatchInstructions, patchArrayBuffer };
package/data/ptr.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- import "./snippet.js";
2
- import { Ptr, StorableData } from "./wgslTypes.js";
3
-
4
- //#region src/data/ptr.d.ts
5
- declare function ptrFn<T extends StorableData>(inner: T): Ptr<'function', T, 'read-write'>;
6
- declare function ptrPrivate<T extends StorableData>(inner: T): Ptr<'private', T, 'read-write'>;
7
- declare function ptrWorkgroup<T extends StorableData>(inner: T): Ptr<'workgroup', T, 'read-write'>;
8
- declare function ptrStorage<T extends StorableData, TAccess extends 'read' | 'read-write' = 'read'>(inner: T, access?: TAccess): Ptr<'storage', T, TAccess>;
9
- declare function ptrUniform<T extends StorableData>(inner: T): Ptr<'uniform', T, 'read'>;
10
- declare function ptrHandle<T extends StorableData>(inner: T): Ptr<'handle', T, 'read'>;
11
- //#endregion
12
- export { ptrFn, ptrHandle, ptrPrivate, ptrStorage, ptrUniform, ptrWorkgroup };
1
+ import { type Origin } from './snippet.ts';
2
+ import type { Access, AddressSpace, BaseData, Ptr, StorableData } from './wgslTypes.ts';
3
+ export declare function ptrFn<T extends StorableData>(inner: T): Ptr<'function', T, 'read-write'>;
4
+ export declare function ptrPrivate<T extends StorableData>(inner: T): Ptr<'private', T, 'read-write'>;
5
+ export declare function ptrWorkgroup<T extends StorableData>(inner: T): Ptr<'workgroup', T, 'read-write'>;
6
+ export declare function ptrStorage<T extends StorableData, TAccess extends 'read' | 'read-write' = 'read'>(inner: T, access?: TAccess): Ptr<'storage', T, TAccess>;
7
+ export declare function ptrUniform<T extends StorableData>(inner: T): Ptr<'uniform', T, 'read'>;
8
+ export declare function ptrHandle<T extends StorableData>(inner: T): Ptr<'handle', T, 'read'>;
9
+ export declare function INTERNAL_createPtr<TAddressSpace extends AddressSpace, TInner extends BaseData, TAccess extends Access>(addressSpace: TAddressSpace, inner: TInner, access: TAccess, implicit?: boolean): Ptr<TAddressSpace, TInner, TAccess>;
10
+ export declare function createPtrFromOrigin(origin: Origin, innerDataType: StorableData): Ptr | undefined;
11
+ export declare function implicitFrom(ptr: Ptr): Ptr;
12
+ export declare function explicitFrom(ptr: Ptr): Ptr;
package/data/ptr.js CHANGED
@@ -1,46 +1,44 @@
1
1
  import { $internal } from "../shared/symbols.js";
2
2
  import { originToPtrParams } from "./snippet.js";
3
-
4
- //#region src/data/ptr.ts
5
- function ptrFn(inner) {
6
- return INTERNAL_createPtr("function", inner, "read-write");
7
- }
8
- function ptrPrivate(inner) {
9
- return INTERNAL_createPtr("private", inner, "read-write");
10
- }
11
- function ptrWorkgroup(inner) {
12
- return INTERNAL_createPtr("workgroup", inner, "read-write");
13
- }
14
- function ptrStorage(inner, access = "read") {
15
- return INTERNAL_createPtr("storage", inner, access);
16
- }
17
- function ptrUniform(inner) {
18
- return INTERNAL_createPtr("uniform", inner, "read");
19
- }
20
- function ptrHandle(inner) {
21
- return INTERNAL_createPtr("handle", inner, "read");
22
- }
23
- function INTERNAL_createPtr(addressSpace, inner, access, implicit = false) {
24
- return {
25
- [$internal]: {},
26
- type: "ptr",
27
- addressSpace,
28
- inner,
29
- access,
30
- implicit,
31
- toString: () => `ptr<${addressSpace}, ${inner}, ${access}>`
32
- };
33
- }
34
- function createPtrFromOrigin(origin, innerDataType) {
35
- const ptrParams = originToPtrParams[origin];
36
- if (ptrParams) return INTERNAL_createPtr(ptrParams.space, innerDataType, ptrParams.access);
37
- }
38
- function implicitFrom(ptr) {
39
- return INTERNAL_createPtr(ptr.addressSpace, ptr.inner, ptr.access, true);
40
- }
41
- function explicitFrom(ptr) {
42
- return INTERNAL_createPtr(ptr.addressSpace, ptr.inner, ptr.access, false);
43
- }
44
-
45
- //#endregion
46
- export { createPtrFromOrigin, explicitFrom, implicitFrom, ptrFn, ptrHandle, ptrPrivate, ptrStorage, ptrUniform, ptrWorkgroup };
3
+ export function ptrFn(inner) {
4
+ return INTERNAL_createPtr('function', inner, 'read-write');
5
+ }
6
+ export function ptrPrivate(inner) {
7
+ return INTERNAL_createPtr('private', inner, 'read-write');
8
+ }
9
+ export function ptrWorkgroup(inner) {
10
+ return INTERNAL_createPtr('workgroup', inner, 'read-write');
11
+ }
12
+ export function ptrStorage(inner, access = 'read') {
13
+ return INTERNAL_createPtr('storage', inner, access);
14
+ }
15
+ export function ptrUniform(inner) {
16
+ return INTERNAL_createPtr('uniform', inner, 'read');
17
+ }
18
+ export function ptrHandle(inner) {
19
+ return INTERNAL_createPtr('handle', inner, 'read');
20
+ }
21
+ export function INTERNAL_createPtr(addressSpace, inner, access, implicit = false) {
22
+ return {
23
+ [$internal]: {},
24
+ type: 'ptr',
25
+ addressSpace,
26
+ inner,
27
+ access,
28
+ implicit,
29
+ toString: () => `ptr<${addressSpace}, ${inner}, ${access}>`,
30
+ };
31
+ }
32
+ export function createPtrFromOrigin(origin, innerDataType) {
33
+ const ptrParams = originToPtrParams[origin];
34
+ if (ptrParams) {
35
+ return INTERNAL_createPtr(ptrParams.space, innerDataType, ptrParams.access);
36
+ }
37
+ return undefined;
38
+ }
39
+ export function implicitFrom(ptr) {
40
+ return INTERNAL_createPtr(ptr.addressSpace, ptr.inner, ptr.access, /* implicit */ true);
41
+ }
42
+ export function explicitFrom(ptr) {
43
+ return INTERNAL_createPtr(ptr.addressSpace, ptr.inner, ptr.access, /* implicit */ false);
44
+ }
package/data/ref.d.ts CHANGED
@@ -1,26 +1,24 @@
1
- import { $internal } from "../shared/symbols.js";
2
- import "./snippet.js";
3
- import { DualFn } from "../types.js";
4
- import "./wgslTypes.js";
5
-
6
- //#region src/data/ref.d.ts
1
+ import { $internal, $ownSnippet, $resolve } from '../shared/symbols.ts';
2
+ import type { DualFn, SelfResolvable } from '../types.ts';
3
+ import { type ResolvedSnippet, type Snippet } from './snippet.ts';
4
+ import { type Ptr } from './wgslTypes.ts';
7
5
  interface ref<T> {
8
- readonly [$internal]: {
9
- type: 'ref';
10
- };
11
- /**
12
- * Derefences the reference, and gives access to the underlying value.
13
- *
14
- * @example ```ts
15
- * const boid = Boid({ pos: d.vec3f(3, 2, 1) });
16
- * const posRef = d.ref(boid.pos);
17
- *
18
- * // Actually updates `boid.pos`
19
- * posRef.$ = d.vec3f(1, 2, 3);
20
- * console.log(boid.pos); // Output: vec3f(1, 2, 3)
21
- * ```
22
- */
23
- $: T;
6
+ readonly [$internal]: {
7
+ type: 'ref';
8
+ };
9
+ /**
10
+ * Derefences the reference, and gives access to the underlying value.
11
+ *
12
+ * @example ```ts
13
+ * const boid = Boid({ pos: d.vec3f(3, 2, 1) });
14
+ * const posRef = d.ref(boid.pos);
15
+ *
16
+ * // Actually updates `boid.pos`
17
+ * posRef.$ = d.vec3f(1, 2, 3);
18
+ * console.log(boid.pos); // Output: vec3f(1, 2, 3)
19
+ * ```
20
+ */
21
+ $: T;
24
22
  }
25
23
  /**
26
24
  * A reference to a value `T`. Can be passed to other functions to give them
@@ -28,10 +26,25 @@ interface ref<T> {
28
26
  *
29
27
  * Conceptually, it represents a WGSL pointer.
30
28
  */
31
- type _ref<T> = T extends object ? T & ref<T> : ref<T>;
29
+ export type _ref<T> = T extends object ? T & ref<T> : ref<T>;
32
30
  type RefFn = DualFn<(<T>(value: T) => _ref<T>)> & {
33
- [$internal]: true;
31
+ [$internal]: true;
34
32
  };
35
- declare const _ref: RefFn;
36
- //#endregion
37
- export { _ref };
33
+ export declare const _ref: RefFn;
34
+ export declare function isRef<T>(value: unknown): value is ref<T>;
35
+ export declare function INTERNAL_createRef<T>(value: T): ref<T>;
36
+ /**
37
+ * The result of calling `d.ref(...)`. The code responsible for
38
+ * generating shader code can check if the value of a snippet is
39
+ * an instance of `RefOperator`, and act accordingly.
40
+ */
41
+ export declare class RefOperator implements SelfResolvable {
42
+ #private;
43
+ readonly [$internal]: true;
44
+ readonly snippet: Snippet;
45
+ constructor(snippet: Snippet, ptrType: Ptr | undefined);
46
+ get [$ownSnippet](): Snippet;
47
+ [$resolve](): ResolvedSnippet;
48
+ }
49
+ export declare function derefSnippet(snippet: Snippet): Snippet;
50
+ export {};