typegpu 0.11.9 → 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 +36 -36
  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 -5
  42. package/core/function/fnCore.js +148 -93
  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 +17 -22
  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 +89 -90
  85. package/core/resolve/externals.d.ts +25 -8
  86. package/core/resolve/externals.js +78 -54
  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 -53
  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 -455
  101. package/core/root/rootTypes.d.ts +461 -636
  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 -215
  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 -197
  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 -126
  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 +427 -394
  239. package/package.json +5 -1
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -629
  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 -101
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +13 -15
  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 +271 -216
  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 -760
  350. package/types.d.ts +287 -222
  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
@@ -1,16 +1,14 @@
1
- import { BaseData } from "./wgslTypes.js";
2
- import { Infer } from "../shared/repr.js";
3
-
4
- //#region src/data/offsetUtils.d.ts
5
-
1
+ import type { BaseData } from './wgslTypes.ts';
2
+ import type { Infer } from '../shared/repr.ts';
3
+ export declare function createOffsetProxy<T extends BaseData>(schema: T, baseOffset?: number): unknown;
6
4
  /**
7
5
  * Interface containing information about the offset and the available contiguous after a selected primitive.
8
6
  */
9
- interface PrimitiveOffsetInfo {
10
- /** The byte offset of the primitive within the buffer. */
11
- offset: number;
12
- /** The number of contiguous bytes available from the offset. */
13
- contiguous: number;
7
+ export interface PrimitiveOffsetInfo {
8
+ /** The byte offset of the primitive within the buffer. */
9
+ offset: number;
10
+ /** The number of contiguous bytes available from the offset. */
11
+ contiguous: number;
14
12
  }
15
13
  /**
16
14
  * A function that retrieves offset and information for a specific primitive within a data schema.
@@ -29,6 +27,4 @@ interface PrimitiveOffsetInfo {
29
27
  * @param accessor - Optional function that accesses a specific element within the schema. If omitted, uses the root offset (0).
30
28
  * @returns An object containing the offset and contiguous byte information.
31
29
  */
32
- declare function memoryLayoutOf<T extends BaseData>(schema: T, accessor?: (proxy: Infer<T>) => unknown): PrimitiveOffsetInfo;
33
- //#endregion
34
- export { PrimitiveOffsetInfo, memoryLayoutOf };
30
+ export declare function memoryLayoutOf<T extends BaseData>(schema: T, accessor?: (proxy: Infer<T>) => unknown): PrimitiveOffsetInfo;
@@ -1,167 +1,227 @@
1
- import { isVec, isWgslArray, isWgslStruct } from "./wgslTypes.js";
2
- import { undecorate } from "./dataTypes.js";
3
- import { alignmentOf } from "./alignmentOf.js";
4
1
  import { roundUp } from "../mathUtils.js";
5
- import { sizeOf } from "./sizeOf.js";
2
+ import { alignmentOf } from "./alignmentOf.js";
6
3
  import { offsetsForProps } from "./offsets.js";
4
+ import { sizeOf } from "./sizeOf.js";
7
5
  import { isContiguous } from "./isContiguous.js";
8
6
  import { getLongestContiguousPrefix } from "./getLongestContiguousPrefix.js";
9
-
10
- //#region src/data/offsetUtils.ts
11
- const OFFSET_MARKER = Symbol("indirectOffset");
12
- const CONTIGUOUS_MARKER = Symbol("indirectContiguous");
7
+ import { isVec, isWgslArray, isWgslStruct } from "./wgslTypes.js";
8
+ import { undecorate } from "./dataTypes.js";
9
+ const OFFSET_MARKER = Symbol('indirectOffset');
10
+ const CONTIGUOUS_MARKER = Symbol('indirectContiguous');
13
11
  function isOffsetProxy(value) {
14
- return typeof value === "object" && value !== null && OFFSET_MARKER in value && CONTIGUOUS_MARKER in value;
12
+ return (typeof value === 'object' &&
13
+ value !== null &&
14
+ OFFSET_MARKER in value &&
15
+ CONTIGUOUS_MARKER in value);
15
16
  }
16
17
  function scalarNode(offset, contiguous) {
17
- return {
18
- [OFFSET_MARKER]: offset,
19
- [CONTIGUOUS_MARKER]: contiguous
20
- };
18
+ return { [OFFSET_MARKER]: offset, [CONTIGUOUS_MARKER]: contiguous };
21
19
  }
22
20
  function getMarker(target, prop) {
23
- if (prop === OFFSET_MARKER) return target[OFFSET_MARKER];
24
- if (prop === CONTIGUOUS_MARKER) return target[CONTIGUOUS_MARKER];
21
+ if (prop === OFFSET_MARKER) {
22
+ return target[OFFSET_MARKER];
23
+ }
24
+ if (prop === CONTIGUOUS_MARKER) {
25
+ return target[CONTIGUOUS_MARKER];
26
+ }
27
+ return undefined;
25
28
  }
26
29
  function makeProxy(schema, baseOffset, contiguous = sizeOf(schema)) {
27
- const unwrapped = undecorate(schema);
28
- const vecComponentCount = isVec(unwrapped) ? unwrapped.componentCount : void 0;
29
- if (vecComponentCount !== void 0) {
30
- const componentSize = sizeOf(unwrapped.primitive);
31
- return makeVecProxy(scalarNode(baseOffset, contiguous), componentSize, vecComponentCount);
32
- }
33
- if (isWgslStruct(unwrapped)) return makeStructProxy(unwrapped, scalarNode(baseOffset, contiguous));
34
- if (isWgslArray(unwrapped)) return makeArrayProxy(unwrapped, scalarNode(baseOffset, contiguous));
35
- return scalarNode(baseOffset, contiguous);
30
+ const unwrapped = undecorate(schema);
31
+ const vecComponentCount = isVec(unwrapped) ? unwrapped.componentCount : undefined;
32
+ if (vecComponentCount !== undefined) {
33
+ const componentSize = sizeOf(unwrapped.primitive);
34
+ return makeVecProxy(scalarNode(baseOffset, contiguous), componentSize, vecComponentCount);
35
+ }
36
+ if (isWgslStruct(unwrapped)) {
37
+ return makeStructProxy(unwrapped, scalarNode(baseOffset, contiguous));
38
+ }
39
+ if (isWgslArray(unwrapped)) {
40
+ return makeArrayProxy(unwrapped, scalarNode(baseOffset, contiguous));
41
+ }
42
+ return scalarNode(baseOffset, contiguous);
36
43
  }
37
- function createOffsetProxy(schema, baseOffset = 0) {
38
- return makeProxy(schema, baseOffset, sizeOf(schema));
44
+ export function createOffsetProxy(schema, baseOffset = 0) {
45
+ return makeProxy(schema, baseOffset, sizeOf(schema));
39
46
  }
40
47
  function makeVecProxy(target, componentSize, componentCount) {
41
- const baseOffset = target[OFFSET_MARKER];
42
- return new Proxy(target, { get(t, prop) {
43
- const marker = getMarker(t, prop);
44
- if (marker !== void 0) return marker;
45
- const idx = prop === "x" || prop === "0" ? 0 : prop === "y" || prop === "1" ? 1 : prop === "z" || prop === "2" ? 2 : prop === "w" || prop === "3" ? 3 : -1;
46
- if (idx < 0 || idx >= componentCount) return;
47
- const byteOffset = idx * componentSize;
48
- const contiguous = Math.max(0, t[CONTIGUOUS_MARKER] - byteOffset);
49
- return scalarNode(baseOffset + byteOffset, contiguous);
50
- } });
48
+ const baseOffset = target[OFFSET_MARKER];
49
+ return new Proxy(target, {
50
+ get(t, prop) {
51
+ const marker = getMarker(t, prop);
52
+ if (marker !== undefined) {
53
+ return marker;
54
+ }
55
+ const idx = prop === 'x' || prop === '0'
56
+ ? 0
57
+ : prop === 'y' || prop === '1'
58
+ ? 1
59
+ : prop === 'z' || prop === '2'
60
+ ? 2
61
+ : prop === 'w' || prop === '3'
62
+ ? 3
63
+ : -1;
64
+ if (idx < 0 || idx >= componentCount) {
65
+ return undefined;
66
+ }
67
+ const byteOffset = idx * componentSize;
68
+ const contiguous = Math.max(0, t[CONTIGUOUS_MARKER] - byteOffset);
69
+ return scalarNode(baseOffset + byteOffset, contiguous);
70
+ },
71
+ });
51
72
  }
52
73
  function makeArrayProxy(array, target) {
53
- const elementType = array.elementType;
54
- const elementSize = sizeOf(elementType);
55
- const stride = roundUp(elementSize, alignmentOf(elementType));
56
- const hasPadding = stride > elementSize;
57
- return new Proxy(target, { get(t, prop) {
58
- const marker = getMarker(t, prop);
59
- if (marker !== void 0) return marker;
60
- if (prop === "length") return array.elementCount;
61
- if (typeof prop !== "string") return;
62
- const index = Number(prop);
63
- if (!Number.isInteger(index) || index < 0 || index >= array.elementCount) return;
64
- const elementOffset = index * stride;
65
- const remainingFromHere = !isContiguous(elementType) ? elementSize + getLongestContiguousPrefix(elementType) : Math.max(0, t[CONTIGUOUS_MARKER] - elementOffset);
66
- const childContiguous = hasPadding ? Math.min(remainingFromHere, elementSize) : remainingFromHere;
67
- return makeProxy(elementType, t[OFFSET_MARKER] + elementOffset, childContiguous);
68
- } });
74
+ const elementType = array.elementType;
75
+ const elementSize = sizeOf(elementType);
76
+ const stride = roundUp(elementSize, alignmentOf(elementType));
77
+ const hasPadding = stride > elementSize;
78
+ return new Proxy(target, {
79
+ get(t, prop) {
80
+ const marker = getMarker(t, prop);
81
+ if (marker !== undefined) {
82
+ return marker;
83
+ }
84
+ if (prop === 'length') {
85
+ return array.elementCount;
86
+ }
87
+ if (typeof prop !== 'string') {
88
+ return undefined;
89
+ }
90
+ const index = Number(prop);
91
+ if (!Number.isInteger(index) || index < 0 || index >= array.elementCount) {
92
+ return undefined;
93
+ }
94
+ const elementOffset = index * stride;
95
+ const remainingFromHere = !isContiguous(elementType)
96
+ ? elementSize + getLongestContiguousPrefix(elementType) // it is too much, but we correct it later
97
+ : Math.max(0, t[CONTIGUOUS_MARKER] - elementOffset);
98
+ const childContiguous = hasPadding
99
+ ? Math.min(remainingFromHere, elementSize)
100
+ : remainingFromHere;
101
+ return makeProxy(elementType, t[OFFSET_MARKER] + elementOffset, childContiguous);
102
+ },
103
+ });
69
104
  }
70
105
  function makeStructProxy(struct, target) {
71
- const offsets = offsetsForProps(struct);
72
- const propTypes = struct.propTypes;
73
- const propNames = Object.keys(propTypes);
74
- const meta = /* @__PURE__ */ new Map();
75
- let runStart = 0;
76
- for (let i = 0; i < propNames.length; i++) {
77
- const name = propNames[i];
78
- if (!name) continue;
79
- const type = propTypes[name];
80
- if (!type) continue;
81
- const info = offsets[name];
82
- const padding = info.padding ?? 0;
83
- const typeContiguous = isContiguous(type);
84
- if (!(i === propNames.length - 1 || padding > 0 || !typeContiguous)) continue;
85
- const runEnd = info.offset + (typeContiguous ? info.size : getLongestContiguousPrefix(type));
86
- for (let j = runStart; j <= i; j++) {
87
- const runName = propNames[j];
88
- if (!runName) continue;
89
- const runInfo = offsets[runName];
90
- meta.set(runName, {
91
- offset: runInfo.offset,
92
- runEnd
93
- });
94
- }
95
- runStart = i + 1;
96
- }
97
- return new Proxy(target, { get(t, prop) {
98
- const marker = getMarker(t, prop);
99
- if (marker !== void 0) return marker;
100
- if (typeof prop !== "string") return;
101
- const m = meta.get(prop);
102
- if (!m) return;
103
- const remainingFromHere = Math.max(0, t[CONTIGUOUS_MARKER] - m.offset);
104
- const localLimit = Math.max(0, m.runEnd - m.offset);
105
- const propSchema = propTypes[prop];
106
- if (!propSchema) return;
107
- return makeProxy(propSchema, t[OFFSET_MARKER] + m.offset, sizeOf(struct) === m.runEnd ? remainingFromHere : localLimit);
108
- } });
106
+ const offsets = offsetsForProps(struct);
107
+ const propTypes = struct.propTypes;
108
+ const propNames = Object.keys(propTypes);
109
+ const meta = new Map();
110
+ let runStart = 0;
111
+ for (let i = 0; i < propNames.length; i++) {
112
+ const name = propNames[i];
113
+ if (!name) {
114
+ continue;
115
+ }
116
+ const type = propTypes[name];
117
+ if (!type) {
118
+ continue;
119
+ }
120
+ const info = offsets[name];
121
+ const padding = info.padding ?? 0;
122
+ const typeContiguous = isContiguous(type);
123
+ const isRunEnd = i === propNames.length - 1 || padding > 0 || !typeContiguous;
124
+ if (!isRunEnd) {
125
+ continue;
126
+ }
127
+ const runEnd = info.offset + (typeContiguous ? info.size : getLongestContiguousPrefix(type));
128
+ for (let j = runStart; j <= i; j++) {
129
+ const runName = propNames[j];
130
+ if (!runName) {
131
+ continue;
132
+ }
133
+ const runInfo = offsets[runName];
134
+ meta.set(runName, { offset: runInfo.offset, runEnd });
135
+ }
136
+ runStart = i + 1;
137
+ }
138
+ return new Proxy(target, {
139
+ get(t, prop) {
140
+ const marker = getMarker(t, prop);
141
+ if (marker !== undefined) {
142
+ return marker;
143
+ }
144
+ if (typeof prop !== 'string') {
145
+ return undefined;
146
+ }
147
+ const m = meta.get(prop);
148
+ if (!m) {
149
+ return undefined;
150
+ }
151
+ const remainingFromHere = Math.max(0, t[CONTIGUOUS_MARKER] - m.offset);
152
+ const localLimit = Math.max(0, m.runEnd - m.offset);
153
+ const propSchema = propTypes[prop];
154
+ if (!propSchema) {
155
+ return undefined;
156
+ }
157
+ return makeProxy(propSchema, t[OFFSET_MARKER] + m.offset, sizeOf(struct) === m.runEnd ? remainingFromHere : localLimit);
158
+ },
159
+ });
109
160
  }
110
161
  function getRootContiguous(schema) {
111
- const unwrapped = undecorate(schema);
112
- if (isWgslStruct(unwrapped)) {
113
- const offsets = offsetsForProps(unwrapped);
114
- const propTypes = unwrapped.propTypes;
115
- const propNames = Object.keys(propTypes);
116
- for (let i = 0; i < propNames.length; i++) {
117
- const name = propNames[i];
118
- if (!name) continue;
119
- const info = offsets[name];
120
- const padding = info.padding ?? 0;
121
- const runEnd = info.offset + info.size;
122
- if (i === propNames.length - 1 || padding > 0) return runEnd;
123
- }
124
- return 0;
125
- }
126
- if (isWgslArray(unwrapped)) {
127
- const elementType = unwrapped.elementType;
128
- const elementSize = sizeOf(elementType);
129
- const stride = roundUp(elementSize, alignmentOf(elementType));
130
- const totalSize = sizeOf(schema);
131
- if (!Number.isFinite(totalSize)) return elementSize;
132
- return stride > elementSize ? elementSize : totalSize;
133
- }
134
- return sizeOf(schema);
162
+ const unwrapped = undecorate(schema);
163
+ if (isWgslStruct(unwrapped)) {
164
+ const offsets = offsetsForProps(unwrapped);
165
+ const propTypes = unwrapped.propTypes;
166
+ const propNames = Object.keys(propTypes);
167
+ for (let i = 0; i < propNames.length; i++) {
168
+ const name = propNames[i];
169
+ if (!name) {
170
+ continue;
171
+ }
172
+ const info = offsets[name];
173
+ const padding = info.padding ?? 0;
174
+ const runEnd = info.offset + info.size;
175
+ const isRunEnd = i === propNames.length - 1 || padding > 0;
176
+ if (isRunEnd) {
177
+ return runEnd;
178
+ }
179
+ }
180
+ return 0;
181
+ }
182
+ if (isWgslArray(unwrapped)) {
183
+ const elementType = unwrapped.elementType;
184
+ const elementSize = sizeOf(elementType);
185
+ const stride = roundUp(elementSize, alignmentOf(elementType));
186
+ const totalSize = sizeOf(schema);
187
+ if (!Number.isFinite(totalSize)) {
188
+ return elementSize;
189
+ }
190
+ return stride > elementSize ? elementSize : totalSize;
191
+ }
192
+ return sizeOf(schema);
135
193
  }
136
194
  /**
137
- * A function that retrieves offset and information for a specific primitive within a data schema.
138
- * Example usage:
139
- * ```ts
140
- * const Boid = d.struct({
141
- * position: d.vec3f,
142
- * velocity: d.vec3f,
143
- * });
144
- * const memLayout = d.memoryLayoutOf(Boid, (b) => b.velocity.y);
145
- * console.log(memLayout.offset); // Byte offset of velocity.y within Boid (here 20 bytes)
146
- * console.log(memLayout.contiguous); // Contiguous bytes available from that offset (here 8 bytes)
147
- * ```
148
- *
149
- * @param schema - The data schema to analyze.
150
- * @param accessor - Optional function that accesses a specific element within the schema. If omitted, uses the root offset (0).
151
- * @returns An object containing the offset and contiguous byte information.
152
- */
153
- function memoryLayoutOf(schema, accessor) {
154
- if (!accessor) return {
155
- offset: 0,
156
- contiguous: getRootContiguous(schema)
157
- };
158
- const result = accessor(createOffsetProxy(schema));
159
- if (isOffsetProxy(result)) return {
160
- offset: result[OFFSET_MARKER],
161
- contiguous: result[CONTIGUOUS_MARKER]
162
- };
163
- throw new Error("memoryLayoutOf: accessor did not return a schema element. Make sure the accessor navigates to a field or element of the schema (e.g. `(s) => s.position.x`).");
195
+ * A function that retrieves offset and information for a specific primitive within a data schema.
196
+ * Example usage:
197
+ * ```ts
198
+ * const Boid = d.struct({
199
+ * position: d.vec3f,
200
+ * velocity: d.vec3f,
201
+ * });
202
+ * const memLayout = d.memoryLayoutOf(Boid, (b) => b.velocity.y);
203
+ * console.log(memLayout.offset); // Byte offset of velocity.y within Boid (here 20 bytes)
204
+ * console.log(memLayout.contiguous); // Contiguous bytes available from that offset (here 8 bytes)
205
+ * ```
206
+ *
207
+ * @param schema - The data schema to analyze.
208
+ * @param accessor - Optional function that accesses a specific element within the schema. If omitted, uses the root offset (0).
209
+ * @returns An object containing the offset and contiguous byte information.
210
+ */
211
+ export function memoryLayoutOf(schema, accessor) {
212
+ if (!accessor) {
213
+ return {
214
+ offset: 0,
215
+ contiguous: getRootContiguous(schema),
216
+ };
217
+ }
218
+ const proxy = createOffsetProxy(schema);
219
+ const result = accessor(proxy);
220
+ if (isOffsetProxy(result)) {
221
+ return {
222
+ offset: result[OFFSET_MARKER],
223
+ contiguous: result[CONTIGUOUS_MARKER],
224
+ };
225
+ }
226
+ throw new Error('memoryLayoutOf: accessor did not return a schema element. Make sure the accessor navigates to a field or element of the schema (e.g. `(s) => s.position.x`).');
164
227
  }
165
-
166
- //#endregion
167
- export { memoryLayoutOf };
@@ -0,0 +1,8 @@
1
+ import { type Unstruct } from './dataTypes.ts';
2
+ import type { WgslStruct } from './wgslTypes.ts';
3
+ export interface OffsetInfo {
4
+ offset: number;
5
+ size: number;
6
+ padding?: number | undefined;
7
+ }
8
+ export declare function offsetsForProps<T extends WgslStruct | Unstruct>(struct: T): Record<keyof T['propTypes'], OffsetInfo>;
package/data/offsets.js CHANGED
@@ -1,36 +1,36 @@
1
- import { isUnstruct } from "./dataTypes.js";
2
- import { alignmentOf, customAlignmentOf } from "./alignmentOf.js";
1
+ import { Measurer } from 'typed-binary';
3
2
  import { roundUp } from "../mathUtils.js";
3
+ import alignIO from "./alignIO.js";
4
+ import { alignmentOf, customAlignmentOf } from "./alignmentOf.js";
5
+ import { isUnstruct } from "./dataTypes.js";
4
6
  import { sizeOf } from "./sizeOf.js";
5
- import alignIO_default from "./alignIO.js";
6
- import { Measurer } from "typed-binary";
7
-
8
- //#region src/data/offsets.ts
9
- const cachedOffsets = /* @__PURE__ */ new WeakMap();
10
- function offsetsForProps(struct) {
11
- const cached = cachedOffsets.get(struct);
12
- if (cached) return cached;
13
- const measurer = new Measurer();
14
- const offsets = {};
15
- let lastEntry;
16
- for (const key in struct.propTypes) {
17
- const prop = struct.propTypes[key];
18
- if (prop === void 0) throw new Error(`Property ${key} is undefined in struct`);
19
- const beforeAlignment = measurer.size;
20
- alignIO_default(measurer, isUnstruct(struct) ? customAlignmentOf(prop) : alignmentOf(prop));
21
- if (lastEntry) lastEntry.padding = measurer.size - beforeAlignment;
22
- const propSize = sizeOf(prop);
23
- offsets[key] = {
24
- offset: measurer.size,
25
- size: propSize
26
- };
27
- lastEntry = offsets[key];
28
- measurer.add(propSize);
29
- }
30
- if (lastEntry) lastEntry.padding = roundUp(sizeOf(struct), alignmentOf(struct)) - measurer.size;
31
- cachedOffsets.set(struct, offsets);
32
- return offsets;
7
+ const cachedOffsets = new WeakMap();
8
+ export function offsetsForProps(struct) {
9
+ const cached = cachedOffsets.get(struct);
10
+ if (cached) {
11
+ return cached;
12
+ }
13
+ const measurer = new Measurer();
14
+ const offsets = {};
15
+ let lastEntry;
16
+ for (const key in struct.propTypes) {
17
+ const prop = struct.propTypes[key];
18
+ if (prop === undefined) {
19
+ throw new Error(`Property ${key} is undefined in struct`);
20
+ }
21
+ const beforeAlignment = measurer.size;
22
+ alignIO(measurer, isUnstruct(struct) ? customAlignmentOf(prop) : alignmentOf(prop));
23
+ if (lastEntry) {
24
+ lastEntry.padding = measurer.size - beforeAlignment;
25
+ }
26
+ const propSize = sizeOf(prop);
27
+ offsets[key] = { offset: measurer.size, size: propSize };
28
+ lastEntry = offsets[key];
29
+ measurer.add(propSize);
30
+ }
31
+ if (lastEntry) {
32
+ lastEntry.padding = roundUp(sizeOf(struct), alignmentOf(struct)) - measurer.size;
33
+ }
34
+ cachedOffsets.set(struct, offsets);
35
+ return offsets;
33
36
  }
34
-
35
- //#endregion
36
- export { offsetsForProps };
@@ -1,8 +1,13 @@
1
- import { BaseData } from "./wgslTypes.js";
2
- import { InferPatch } from "../shared/repr.js";
3
-
4
- //#region src/data/partialIO.d.ts
5
-
6
- declare function patchArrayBuffer<T extends BaseData>(buffer: ArrayBuffer, schema: T, data: InferPatch<T>): void;
7
- //#endregion
8
- export { patchArrayBuffer };
1
+ import type * as wgsl from './wgslTypes.ts';
2
+ import { type BaseData } from './wgslTypes.ts';
3
+ import type { InferPatch } from '../shared/repr.ts';
4
+ export interface WriteInstruction {
5
+ data: Uint8Array<ArrayBuffer>;
6
+ gpuOffset: number;
7
+ }
8
+ /**
9
+ * Converts `{idx, value}[]` sparse arrays into `Record<number, T>` format.
10
+ */
11
+ export declare function convertPartialToPatch(schema: wgsl.BaseData, data: unknown): unknown;
12
+ export declare function getPatchInstructions<TData extends wgsl.BaseData>(schema: TData, data: unknown, targetBuffer?: ArrayBuffer): WriteInstruction[];
13
+ export declare function patchArrayBuffer<T extends BaseData>(buffer: ArrayBuffer, schema: T, data: InferPatch<T>): void;