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,21 +1,18 @@
1
- import { DualFn } from "../types.js";
2
- import { AnyIntegerVecInstance, AnyMatInstance, AnyNumericVecInstance, mBaseForVec, vBaseForMat, vecIToVecU } from "../data/wgslTypes.js";
3
-
4
- //#region src/std/operators.d.ts
1
+ import { type AnyIntegerVecInstance, type AnyMatInstance, type AnyNumericVecInstance, type mBaseForVec, type vBaseForMat, type vecIToVecU } from '../data/wgslTypes.ts';
5
2
  type NumVec = AnyNumericVecInstance;
6
3
  type Mat = AnyMatInstance;
7
4
  declare function cpuAdd(lhs: number, rhs: number): number;
8
5
  declare function cpuAdd<T extends NumVec>(lhs: number, rhs: T): T;
9
6
  declare function cpuAdd<T extends NumVec>(lhs: T, rhs: number): T;
10
7
  declare function cpuAdd<T extends NumVec | Mat>(lhs: T, rhs: T): T;
11
- declare function cpuAdd<Lhs extends number | NumVec | Mat, Rhs extends (Lhs extends number ? number | NumVec : Lhs extends NumVec ? number | Lhs : Lhs extends Mat ? Lhs : never)>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
12
- declare const add: DualFn<typeof cpuAdd>;
8
+ declare function cpuAdd<Lhs extends number | NumVec | Mat, Rhs extends Lhs extends number ? number | NumVec : Lhs extends NumVec ? number | Lhs : Lhs extends Mat ? Lhs : never>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
9
+ export declare const add: import("../types.ts").DualFn<typeof cpuAdd>;
13
10
  declare function cpuSub(lhs: number, rhs: number): number;
14
11
  declare function cpuSub<T extends NumVec>(lhs: number, rhs: T): T;
15
12
  declare function cpuSub<T extends NumVec>(lhs: T, rhs: number): T;
16
13
  declare function cpuSub<T extends NumVec | Mat>(lhs: T, rhs: T): T;
17
- declare function cpuSub<Lhs extends number | NumVec | Mat, Rhs extends (Lhs extends number ? number | NumVec : Lhs extends NumVec ? number | Lhs : Lhs extends Mat ? Lhs : never)>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
18
- declare const sub: DualFn<typeof cpuSub>;
14
+ declare function cpuSub<Lhs extends number | NumVec | Mat, Rhs extends Lhs extends number ? number | NumVec : Lhs extends NumVec ? number | Lhs : Lhs extends Mat ? Lhs : never>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
15
+ export declare const sub: import("../types.ts").DualFn<typeof cpuSub>;
19
16
  declare function cpuMul(lhs: number, rhs: number): number;
20
17
  declare function cpuMul<MV extends NumVec | Mat>(lhs: number, rhs: MV): MV;
21
18
  declare function cpuMul<MV extends NumVec | Mat>(lhs: MV, rhs: number): MV;
@@ -23,34 +20,29 @@ declare function cpuMul<V extends NumVec>(lhs: V, rhs: V): V;
23
20
  declare function cpuMul<M extends Mat, V extends vBaseForMat<M>>(lhs: V, rhs: M): V;
24
21
  declare function cpuMul<M extends Mat, V extends vBaseForMat<M>>(lhs: M, rhs: V): V;
25
22
  declare function cpuMul<M extends Mat>(lhs: M, rhs: M): M;
26
- declare function cpuMul<Lhs extends number | NumVec | Mat, Rhs extends (Lhs extends number ? number | NumVec | Mat : Lhs extends NumVec ? number | Lhs | mBaseForVec<Lhs> : Lhs extends Mat ? number | vBaseForMat<Lhs> | Lhs : never)>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
27
- declare const mul: DualFn<typeof cpuMul>;
23
+ declare function cpuMul<Lhs extends number | NumVec | Mat, Rhs extends Lhs extends number ? number | NumVec | Mat : Lhs extends NumVec ? number | Lhs | mBaseForVec<Lhs> : Lhs extends Mat ? number | vBaseForMat<Lhs> | Lhs : never>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
24
+ export declare const mul: import("../types.ts").DualFn<typeof cpuMul>;
28
25
  declare function cpuDiv(lhs: number, rhs: number): number;
29
26
  declare function cpuDiv<T extends NumVec>(lhs: T, rhs: T): T;
30
27
  declare function cpuDiv<T extends NumVec>(lhs: number, rhs: T): T;
31
28
  declare function cpuDiv<T extends NumVec>(lhs: T, rhs: number): T;
32
- declare const div: DualFn<typeof cpuDiv>;
29
+ export declare const div: import("../types.ts").DualFn<typeof cpuDiv>;
33
30
  type ModOverload = {
34
- (a: number, b: number): number;
35
- <T extends NumVec>(a: T, b: T): T;
36
- <T extends NumVec>(a: number, b: T): T;
37
- <T extends NumVec>(a: T, b: number): T;
31
+ (a: number, b: number): number;
32
+ <T extends NumVec>(a: T, b: T): T;
33
+ <T extends NumVec>(a: number, b: T): T;
34
+ <T extends NumVec>(a: T, b: number): T;
38
35
  };
39
36
  /**
40
37
  * @privateRemarks
41
38
  * Both JS and WGSL implementations use truncated definition of modulo
42
39
  */
43
- declare const mod: DualFn<ModOverload>;
40
+ export declare const mod: import("../types.ts").DualFn<ModOverload>;
44
41
  declare function cpuNeg(value: number): number;
45
42
  declare function cpuNeg<T extends NumVec>(value: T): T;
46
- declare const neg: DualFn<typeof cpuNeg>;
47
- declare function cpuBitShiftLeft(lhs: number, rhs: number): number;
48
- declare function cpuBitShiftLeft<T extends AnyIntegerVecInstance>(lhs: T, rhs: number): T;
49
- declare function cpuBitShiftLeft<T extends AnyIntegerVecInstance>(lhs: T, rhs: vecIToVecU<T>): T;
50
- declare const bitShiftLeft: DualFn<typeof cpuBitShiftLeft>;
51
- declare function cpuBitShiftRight(lhs: number, rhs: number): number;
52
- declare function cpuBitShiftRight<T extends AnyIntegerVecInstance>(lhs: T, rhs: number): T;
53
- declare function cpuBitShiftRight<T extends AnyIntegerVecInstance>(lhs: T, rhs: vecIToVecU<T>): T;
54
- declare const bitShiftRight: DualFn<typeof cpuBitShiftRight>;
55
- //#endregion
56
- export { add, bitShiftLeft, bitShiftRight, div, mod, mul, neg, sub };
43
+ export declare const neg: import("../types.ts").DualFn<typeof cpuNeg>;
44
+ declare function cpuBitShiftLeft<T extends AnyIntegerVecInstance>(lhs: T, rhs: number | vecIToVecU<T>): T;
45
+ export declare const bitShiftLeft: import("../types.ts").DualFn<typeof cpuBitShiftLeft>;
46
+ declare function cpuBitShiftRight<T extends AnyIntegerVecInstance>(lhs: T, rhs: number | vecIToVecU<T>): T;
47
+ export declare const bitShiftRight: import("../types.ts").DualFn<typeof cpuBitShiftRight>;
48
+ export {};
package/std/operators.js CHANGED
@@ -1,229 +1,263 @@
1
- import { isFloat32VecInstance, isInteger32VecInstance, isMat, isMatInstance, isUint32VecInstance, isVec, isVecInstance } from "../data/wgslTypes.js";
2
- import { SignatureNotSupportedError } from "../errors.js";
1
+ import { dualImpl } from "../core/function/dualImpl.js";
3
2
  import { stitch } from "../core/resolve/stitch.js";
4
- import { unify } from "../tgsl/conversion.js";
5
- import { abstractFloat, f16, f32, i32, u32 } from "../data/numeric.js";
3
+ import { abstractFloat, f16, f32, u32 } from "../data/numeric.js";
6
4
  import { vec2i, vec2u, vec3i, vec3u, vec4i, vec4u, vecTypeToConstructor } from "../data/vector.js";
7
- import { dualImpl } from "../core/function/dualImpl.js";
8
5
  import { VectorOps } from "../data/vectorOps.js";
9
-
10
- //#region src/std/operators.ts
11
- const getPrimitive = (t) => "primitive" in t ? t.primitive : t;
6
+ import { isFloat32VecInstance, isInteger32VecInstance, isMat, isMatInstance, isUint32VecInstance, isVec, isVecInstance, } from "../data/wgslTypes.js";
7
+ import { SignatureNotSupportedError } from "../errors.js";
8
+ import { unify } from "../tgsl/conversion.js";
9
+ const getPrimitive = (t) => ('primitive' in t ? t.primitive : t);
12
10
  const makeBinarySignature = (opts) => (lhs, rhs) => {
13
- const { restrict } = opts ?? {};
14
- const fail = (msg) => {
15
- if (restrict) throw new SignatureNotSupportedError([lhs, rhs], restrict);
16
- throw new Error(`Cannot apply operator to ${lhs.type} and ${rhs.type}: ${msg}`);
17
- };
18
- if (opts?.noMat && (isMat(lhs) || isMat(rhs))) return fail("matrices not supported");
19
- const lhsC = isVec(lhs) || isMat(lhs);
20
- const rhsC = isVec(rhs) || isMat(rhs);
21
- if (!lhsC && !rhsC) {
22
- const unified$1 = unify([lhs, rhs], restrict);
23
- if (!unified$1) return fail("incompatible scalar types");
24
- return {
25
- argTypes: unified$1,
26
- returnType: unified$1[0]
27
- };
28
- }
29
- if (lhsC && rhsC) {
30
- if (opts?.matVecProduct && isVec(lhs) !== isVec(rhs)) return {
31
- argTypes: [lhs, rhs],
32
- returnType: isVec(lhs) ? lhs : rhs
33
- };
34
- if (lhs.type !== rhs.type) return fail("operands must have the same type");
35
- return {
36
- argTypes: [lhs, rhs],
37
- returnType: lhs
38
- };
39
- }
40
- const [scalar, composite] = lhsC ? [rhs, lhs] : [lhs, rhs];
41
- const unified = unify([scalar], [getPrimitive(composite)]);
42
- if (!unified) return fail(`scalar not convertible to ${getPrimitive(composite).type}`);
43
- return {
44
- argTypes: lhsC ? [lhs, unified[0]] : [unified[0], rhs],
45
- returnType: composite
46
- };
11
+ const { restrict } = opts ?? {};
12
+ const fail = (msg) => {
13
+ if (restrict) {
14
+ throw new SignatureNotSupportedError([lhs, rhs], restrict);
15
+ }
16
+ throw new Error(`Cannot apply operator to ${lhs.type} and ${rhs.type}: ${msg}`);
17
+ };
18
+ if (opts?.noMat && (isMat(lhs) || isMat(rhs))) {
19
+ return fail('matrices not supported');
20
+ }
21
+ const lhsC = isVec(lhs) || isMat(lhs);
22
+ const rhsC = isVec(rhs) || isMat(rhs);
23
+ if (!lhsC && !rhsC) {
24
+ // scalar × scalar
25
+ const unified = unify([lhs, rhs], restrict);
26
+ if (!unified)
27
+ return fail('incompatible scalar types');
28
+ return { argTypes: unified, returnType: unified[0] };
29
+ }
30
+ if (lhsC && rhsC) {
31
+ // vec × mat or mat × vec
32
+ if (opts?.matVecProduct && isVec(lhs) !== isVec(rhs)) {
33
+ return { argTypes: [lhs, rhs], returnType: isVec(lhs) ? lhs : rhs };
34
+ }
35
+ // composite × composite (same kind)
36
+ if (lhs.type !== rhs.type)
37
+ return fail('operands must have the same type');
38
+ return { argTypes: [lhs, rhs], returnType: lhs };
39
+ }
40
+ // scalar × composite
41
+ const [scalar, composite] = lhsC ? [rhs, lhs] : [lhs, rhs];
42
+ const unified = unify([scalar], [getPrimitive(composite)]);
43
+ if (!unified) {
44
+ return fail(`scalar not convertible to ${getPrimitive(composite).type}`);
45
+ }
46
+ return {
47
+ argTypes: lhsC ? [lhs, unified[0]] : [unified[0], rhs],
48
+ returnType: composite,
49
+ };
47
50
  };
48
51
  const binaryArithmeticSignature = makeBinarySignature();
49
52
  const binaryMulSignature = makeBinarySignature({ matVecProduct: true });
50
53
  const binaryDivSignature = makeBinarySignature({
51
- noMat: true,
52
- restrict: [
53
- f32,
54
- f16,
55
- abstractFloat
56
- ]
54
+ noMat: true,
55
+ restrict: [f32, f16, abstractFloat],
57
56
  });
58
57
  function cpuAdd(lhs, rhs) {
59
- if (typeof lhs === "number" && typeof rhs === "number") return lhs + rhs;
60
- if (typeof lhs === "number" && isVecInstance(rhs)) return VectorOps.addMixed[rhs.kind](rhs, lhs);
61
- if (isVecInstance(lhs) && typeof rhs === "number") return VectorOps.addMixed[lhs.kind](lhs, rhs);
62
- if (isVecInstance(lhs) && isVecInstance(rhs) || isMatInstance(lhs) && isMatInstance(rhs)) return VectorOps.add[lhs.kind](lhs, rhs);
63
- throw new Error("Add/Sub called with invalid arguments.");
58
+ if (typeof lhs === 'number' && typeof rhs === 'number') {
59
+ return lhs + rhs; // default addition
60
+ }
61
+ if (typeof lhs === 'number' && isVecInstance(rhs)) {
62
+ return VectorOps.addMixed[rhs.kind](rhs, lhs); // mixed addition
63
+ }
64
+ if (isVecInstance(lhs) && typeof rhs === 'number') {
65
+ return VectorOps.addMixed[lhs.kind](lhs, rhs); // mixed addition
66
+ }
67
+ if ((isVecInstance(lhs) && isVecInstance(rhs)) || (isMatInstance(lhs) && isMatInstance(rhs))) {
68
+ return VectorOps.add[lhs.kind](lhs, rhs); // component-wise addition
69
+ }
70
+ throw new Error('Add/Sub called with invalid arguments.');
64
71
  }
65
- const add = dualImpl({
66
- name: "add",
67
- signature: binaryArithmeticSignature,
68
- normalImpl: cpuAdd,
69
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} + ${rhs})`
72
+ export const add = dualImpl({
73
+ name: 'add',
74
+ signature: binaryArithmeticSignature,
75
+ normalImpl: cpuAdd,
76
+ codegenImpl: (ctx, [lhs, rhs]) => ctx.gen.emitBinaryOp(lhs, '+', rhs),
77
+ sideEffects: false,
70
78
  });
71
79
  function cpuSub(lhs, rhs) {
72
- return cpuAdd(lhs, cpuMul(-1, rhs));
80
+ // while illegal on the wgsl side, we can do this in js
81
+ return cpuAdd(lhs, cpuMul(-1, rhs));
73
82
  }
74
- const sub = dualImpl({
75
- name: "sub",
76
- signature: binaryArithmeticSignature,
77
- normalImpl: cpuSub,
78
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} - ${rhs})`
83
+ export const sub = dualImpl({
84
+ name: 'sub',
85
+ signature: binaryArithmeticSignature,
86
+ normalImpl: cpuSub,
87
+ codegenImpl: (ctx, [lhs, rhs]) => ctx.gen.emitBinaryOp(lhs, '-', rhs),
88
+ sideEffects: false,
79
89
  });
80
90
  function cpuMul(lhs, rhs) {
81
- if (typeof lhs === "number" && typeof rhs === "number") return lhs * rhs;
82
- if (typeof lhs === "number" && (isVecInstance(rhs) || isMatInstance(rhs))) return VectorOps.mulSxV[rhs.kind](lhs, rhs);
83
- if ((isVecInstance(lhs) || isMatInstance(lhs)) && typeof rhs === "number") return VectorOps.mulSxV[lhs.kind](rhs, lhs);
84
- if (isVecInstance(lhs) && isVecInstance(rhs)) return VectorOps.mulVxV[lhs.kind](lhs, rhs);
85
- if (isFloat32VecInstance(lhs) && isMatInstance(rhs)) return VectorOps.mulVxM[rhs.kind](lhs, rhs);
86
- if (isMatInstance(lhs) && isFloat32VecInstance(rhs)) return VectorOps.mulMxV[lhs.kind](lhs, rhs);
87
- if (isMatInstance(lhs) && isMatInstance(rhs)) return VectorOps.mulVxV[lhs.kind](lhs, rhs);
88
- throw new Error("Mul called with invalid arguments.");
91
+ if (typeof lhs === 'number' && typeof rhs === 'number') {
92
+ return lhs * rhs; // default multiplication
93
+ }
94
+ if (typeof lhs === 'number' && (isVecInstance(rhs) || isMatInstance(rhs))) {
95
+ return VectorOps.mulSxV[rhs.kind](lhs, rhs); // scale
96
+ }
97
+ if ((isVecInstance(lhs) || isMatInstance(lhs)) && typeof rhs === 'number') {
98
+ return VectorOps.mulSxV[lhs.kind](rhs, lhs); // scale
99
+ }
100
+ if (isVecInstance(lhs) && isVecInstance(rhs)) {
101
+ return VectorOps.mulVxV[lhs.kind](lhs, rhs); // component-wise
102
+ }
103
+ if (isFloat32VecInstance(lhs) && isMatInstance(rhs)) {
104
+ return VectorOps.mulVxM[rhs.kind](lhs, rhs); // row-vector-matrix
105
+ }
106
+ if (isMatInstance(lhs) && isFloat32VecInstance(rhs)) {
107
+ return VectorOps.mulMxV[lhs.kind](lhs, rhs); // matrix-column-vector
108
+ }
109
+ if (isMatInstance(lhs) && isMatInstance(rhs)) {
110
+ return VectorOps.mulVxV[lhs.kind](lhs, rhs); // matrix multiplication
111
+ }
112
+ throw new Error('Mul called with invalid arguments.');
89
113
  }
90
- const mul = dualImpl({
91
- name: "mul",
92
- signature: binaryMulSignature,
93
- normalImpl: cpuMul,
94
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} * ${rhs})`
114
+ export const mul = dualImpl({
115
+ name: 'mul',
116
+ signature: binaryMulSignature,
117
+ normalImpl: cpuMul,
118
+ codegenImpl: (ctx, [lhs, rhs]) => ctx.gen.emitBinaryOp(lhs, '*', rhs),
119
+ sideEffects: false,
95
120
  });
96
121
  function cpuDiv(lhs, rhs) {
97
- if (typeof lhs === "number" && typeof rhs === "number") return lhs / rhs;
98
- if (typeof lhs === "number" && isVecInstance(rhs)) {
99
- const schema = vecTypeToConstructor[rhs.kind];
100
- return VectorOps.div[rhs.kind](schema(lhs), rhs);
101
- }
102
- if (isVecInstance(lhs) && typeof rhs === "number") {
103
- const schema = vecTypeToConstructor[lhs.kind];
104
- return VectorOps.div[lhs.kind](lhs, schema(rhs));
105
- }
106
- if (isVecInstance(lhs) && isVecInstance(rhs)) return VectorOps.div[lhs.kind](lhs, rhs);
107
- throw new Error("Div called with invalid arguments.");
122
+ if (typeof lhs === 'number' && typeof rhs === 'number') {
123
+ return lhs / rhs;
124
+ }
125
+ if (typeof lhs === 'number' && isVecInstance(rhs)) {
126
+ const schema = vecTypeToConstructor[rhs.kind];
127
+ return VectorOps.div[rhs.kind](schema(lhs), rhs);
128
+ }
129
+ if (isVecInstance(lhs) && typeof rhs === 'number') {
130
+ const schema = vecTypeToConstructor[lhs.kind];
131
+ return VectorOps.div[lhs.kind](lhs, schema(rhs));
132
+ }
133
+ if (isVecInstance(lhs) && isVecInstance(rhs)) {
134
+ return VectorOps.div[lhs.kind](lhs, rhs);
135
+ }
136
+ throw new Error('Div called with invalid arguments.');
108
137
  }
109
- const div = dualImpl({
110
- name: "div",
111
- signature: binaryDivSignature,
112
- normalImpl: cpuDiv,
113
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} / ${rhs})`,
114
- ignoreImplicitCastWarning: true
138
+ export const div = dualImpl({
139
+ name: 'div',
140
+ signature: binaryDivSignature,
141
+ normalImpl: cpuDiv,
142
+ codegenImpl: (ctx, [lhs, rhs]) => ctx.gen.emitBinaryOp(lhs, '/', rhs),
143
+ ignoreImplicitCastWarning: true,
144
+ sideEffects: false,
115
145
  });
116
146
  /**
117
- * @privateRemarks
118
- * Both JS and WGSL implementations use truncated definition of modulo
119
- */
120
- const mod = dualImpl({
121
- name: "mod",
122
- signature: binaryDivSignature,
123
- normalImpl: ((a, b) => {
124
- if (typeof a === "number" && typeof b === "number") return a % b;
125
- if (typeof a === "number" && isVecInstance(b)) {
126
- const schema = vecTypeToConstructor[b.kind];
127
- return VectorOps.mod[b.kind](schema(a), b);
128
- }
129
- if (isVecInstance(a) && typeof b === "number") {
130
- const schema = vecTypeToConstructor[a.kind];
131
- return VectorOps.mod[a.kind](a, schema(b));
132
- }
133
- if (isVecInstance(a) && isVecInstance(b)) return VectorOps.mod[a.kind](a, b);
134
- throw new Error("Mod called with invalid arguments, expected types: number or vector.");
135
- }),
136
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} % ${rhs})`
147
+ * @privateRemarks
148
+ * Both JS and WGSL implementations use truncated definition of modulo
149
+ */
150
+ export const mod = dualImpl({
151
+ name: 'mod',
152
+ signature: binaryDivSignature,
153
+ normalImpl: ((a, b) => {
154
+ if (typeof a === 'number' && typeof b === 'number') {
155
+ return (a % b); // scalar % scalar
156
+ }
157
+ if (typeof a === 'number' && isVecInstance(b)) {
158
+ // scalar % vector
159
+ const schema = vecTypeToConstructor[b.kind];
160
+ return VectorOps.mod[b.kind](schema(a), b);
161
+ }
162
+ if (isVecInstance(a) && typeof b === 'number') {
163
+ const schema = vecTypeToConstructor[a.kind];
164
+ // vector % scalar
165
+ return VectorOps.mod[a.kind](a, schema(b));
166
+ }
167
+ if (isVecInstance(a) && isVecInstance(b)) {
168
+ // vector % vector
169
+ return VectorOps.mod[a.kind](a, b);
170
+ }
171
+ throw new Error('Mod called with invalid arguments, expected types: number or vector.');
172
+ }),
173
+ codegenImpl: (ctx, [lhs, rhs]) => ctx.gen.emitBinaryOp(lhs, '%', rhs),
174
+ sideEffects: false,
137
175
  });
138
176
  function cpuNeg(value) {
139
- if (typeof value === "number") return -value;
140
- return VectorOps.neg[value.kind](value);
177
+ if (typeof value === 'number') {
178
+ return -value;
179
+ }
180
+ return VectorOps.neg[value.kind](value);
141
181
  }
142
- const neg = dualImpl({
143
- name: "neg",
144
- signature: (arg) => ({
145
- argTypes: [arg],
146
- returnType: arg
147
- }),
148
- normalImpl: cpuNeg,
149
- codegenImpl: (_ctx, [arg]) => stitch`-(${arg})`
182
+ export const neg = dualImpl({
183
+ name: 'neg',
184
+ signature: (arg) => ({
185
+ argTypes: [arg],
186
+ returnType: arg,
187
+ }),
188
+ normalImpl: cpuNeg,
189
+ codegenImpl: (_ctx, [arg]) => stitch `-(${arg})`,
190
+ sideEffects: false,
150
191
  });
151
- const anyConcreteInteger = [
152
- i32,
153
- u32,
154
- vec2i,
155
- vec3i,
156
- vec4i,
157
- vec2u,
158
- vec3u,
159
- vec4u
160
- ];
161
192
  const intVecToUnsignedVec = {
162
- vec2i: vec2u,
163
- vec2u,
164
- vec3i: vec3u,
165
- vec3u,
166
- vec4i: vec4u,
167
- vec4u
193
+ vec2i: vec2u,
194
+ vec2u: vec2u,
195
+ vec3i: vec3u,
196
+ vec3u: vec3u,
197
+ vec4i: vec4u,
198
+ vec4u: vec4u,
168
199
  };
169
200
  const bitShiftSignature = (lhs, rhs) => {
170
- const lhsUnified = unify([lhs], anyConcreteInteger)?.[0];
171
- if (!lhsUnified) throw new SignatureNotSupportedError([lhs], anyConcreteInteger);
172
- let rhsType;
173
- if (isVec(lhsUnified)) {
174
- const cc = lhsUnified.componentCount;
175
- const vecU = cc === 2 ? vec2u : cc === 3 ? vec3u : vec4u;
176
- const rhsUnified = unify([rhs], [u32, vecU])?.[0];
177
- if (!rhsUnified) throw new SignatureNotSupportedError([rhs], [u32, vecU]);
178
- rhsType = rhsUnified;
179
- } else rhsType = u32;
180
- return {
181
- argTypes: [lhsUnified, rhsType],
182
- returnType: lhsUnified
183
- };
201
+ const lhsUnified = unify([lhs], [vec2i, vec3i, vec4i, vec2u, vec3u, vec4u])?.[0];
202
+ if (!lhsUnified || !isVec(lhsUnified)) {
203
+ throw new SignatureNotSupportedError([lhs], [vec2i, vec3i, vec4i, vec2u, vec3u, vec4u]);
204
+ }
205
+ const cc = lhsUnified.componentCount;
206
+ const vecU = cc === 2 ? vec2u : cc === 3 ? vec3u : vec4u;
207
+ const rhsUnified = unify([rhs], [u32, vecU])?.[0];
208
+ if (!rhsUnified) {
209
+ throw new SignatureNotSupportedError([rhs], [u32, vecU]);
210
+ }
211
+ return {
212
+ argTypes: [lhsUnified, rhsUnified],
213
+ returnType: lhsUnified,
214
+ };
184
215
  };
185
216
  function cpuBitShiftLeft(lhs, rhs) {
186
- if (typeof lhs === "number" && typeof rhs === "number") return lhs << rhs;
187
- if (isInteger32VecInstance(lhs) && isUint32VecInstance(rhs) && lhs.length == rhs.length) return VectorOps.bitShiftLeft[lhs.kind](lhs, rhs);
188
- if (isInteger32VecInstance(lhs) && typeof rhs === "number") {
189
- const rhsVec = intVecToUnsignedVec[lhs.kind](rhs);
190
- return VectorOps.bitShiftLeft[lhs.kind](lhs, rhsVec);
191
- }
192
- throw new Error("bitShiftLeft called with invalid arguments, expected types: number or integer vector (rhs must be the same arity as lhs).");
217
+ if (isInteger32VecInstance(lhs) && isUint32VecInstance(rhs) && lhs.length == rhs.length) {
218
+ return VectorOps.bitShiftLeft[lhs.kind](lhs, rhs);
219
+ }
220
+ if (isInteger32VecInstance(lhs) && typeof rhs === 'number') {
221
+ const rhsVec = intVecToUnsignedVec[lhs.kind](rhs);
222
+ return VectorOps.bitShiftLeft[lhs.kind](lhs, rhsVec);
223
+ }
224
+ throw new Error("'bitShiftLeft' called with invalid arguments, expected: left-hand side to be an integer vector, right-hand side to be a number or unsigned integer vector of the same arity as the left-hand side.");
193
225
  }
194
- const bitShiftLeft = dualImpl({
195
- name: "bitShiftLeft",
196
- signature: bitShiftSignature,
197
- normalImpl: cpuBitShiftLeft,
198
- codegenImpl: (_ctx, [lhs, rhs]) => {
199
- if (isVec(lhs.dataType) && !isVec(rhs.dataType)) {
200
- const cc = lhs.dataType.componentCount;
201
- return stitch`(${lhs} << ${cc === 2 ? "vec2u" : cc === 3 ? "vec3u" : "vec4u"}(${rhs}))`;
202
- }
203
- return stitch`(${lhs} << ${rhs})`;
204
- }
226
+ export const bitShiftLeft = dualImpl({
227
+ name: 'bitShiftLeft',
228
+ signature: bitShiftSignature,
229
+ normalImpl: cpuBitShiftLeft,
230
+ codegenImpl: (ctx, [lhs, rhs]) => {
231
+ if (isVec(lhs.dataType) && !isVec(rhs.dataType)) {
232
+ const cc = lhs.dataType.componentCount;
233
+ const schema = cc === 2 ? vec2u : cc === 3 ? vec3u : vec4u;
234
+ return ctx.gen.emitBinaryOp(lhs, '<<', ctx.gen.typeInstantiation(schema, [rhs]));
235
+ }
236
+ return ctx.gen.emitBinaryOp(lhs, '<<', rhs);
237
+ },
238
+ sideEffects: false,
205
239
  });
206
240
  function cpuBitShiftRight(lhs, rhs) {
207
- if (typeof lhs === "number" && typeof rhs === "number") return lhs >> rhs;
208
- if (isInteger32VecInstance(lhs) && isUint32VecInstance(rhs) && lhs.length == rhs.length) return VectorOps.bitShiftRight[lhs.kind](lhs, rhs);
209
- if (isInteger32VecInstance(lhs) && typeof rhs === "number") {
210
- const rhsVec = intVecToUnsignedVec[lhs.kind](rhs);
211
- return VectorOps.bitShiftRight[lhs.kind](lhs, rhsVec);
212
- }
213
- throw new Error("bitShiftRight called with invalid arguments, expected types: number or integer vector (rhs must be the same arity as lhs).");
241
+ if (isInteger32VecInstance(lhs) && isUint32VecInstance(rhs) && lhs.length == rhs.length) {
242
+ return VectorOps.bitShiftRight[lhs.kind](lhs, rhs);
243
+ }
244
+ if (isInteger32VecInstance(lhs) && typeof rhs === 'number') {
245
+ const rhsVec = intVecToUnsignedVec[lhs.kind](rhs);
246
+ return VectorOps.bitShiftRight[lhs.kind](lhs, rhsVec);
247
+ }
248
+ throw new Error("'bitShiftRight' called with invalid arguments, expected: left-hand side to be an integer vector, right-hand side to be a number or unsigned integer vector of the same arity as the left-hand side.");
214
249
  }
215
- const bitShiftRight = dualImpl({
216
- name: "bitShiftRight",
217
- signature: bitShiftSignature,
218
- normalImpl: cpuBitShiftRight,
219
- codegenImpl: (_ctx, [lhs, rhs]) => {
220
- if (isVec(lhs.dataType) && !isVec(rhs.dataType)) {
221
- const cc = lhs.dataType.componentCount;
222
- return stitch`(${lhs} >> ${cc === 2 ? "vec2u" : cc === 3 ? "vec3u" : "vec4u"}(${rhs}))`;
223
- }
224
- return stitch`(${lhs} >> ${rhs})`;
225
- }
250
+ export const bitShiftRight = dualImpl({
251
+ name: 'bitShiftRight',
252
+ signature: bitShiftSignature,
253
+ normalImpl: cpuBitShiftRight,
254
+ codegenImpl: (ctx, [lhs, rhs]) => {
255
+ if (isVec(lhs.dataType) && !isVec(rhs.dataType)) {
256
+ const cc = lhs.dataType.componentCount;
257
+ const schema = cc === 2 ? vec2u : cc === 3 ? vec3u : vec4u;
258
+ return ctx.gen.emitBinaryOp(lhs, '>>', ctx.gen.typeInstantiation(schema, [rhs]));
259
+ }
260
+ return ctx.gen.emitBinaryOp(lhs, '>>', rhs);
261
+ },
262
+ sideEffects: false,
226
263
  });
227
-
228
- //#endregion
229
- export { add, bitShiftLeft, bitShiftRight, div, mod, mul, neg, sub };
package/std/packing.d.ts CHANGED
@@ -1,27 +1,21 @@
1
- import { DualFn } from "../types.js";
2
- import { v2f, v4f } from "../data/wgslTypes.js";
3
-
4
- //#region src/std/packing.d.ts
5
-
1
+ import type { v2f, v4f } from '../data/wgslTypes.ts';
6
2
  /**
7
3
  * @privateRemarks
8
4
  * https://gpuweb.github.io/gpuweb/wgsl/#unpack2x16float-builtin
9
5
  */
10
- declare const unpack2x16float: DualFn<(e: number) => v2f>;
6
+ export declare const unpack2x16float: import("../types.ts").DualFn<(e: number) => v2f>;
11
7
  /**
12
8
  * @privateRemarks
13
9
  * https://gpuweb.github.io/gpuweb/wgsl/#pack2x16float-builtin
14
10
  */
15
- declare const pack2x16float: DualFn<(e: v2f) => number>;
11
+ export declare const pack2x16float: import("../types.ts").DualFn<(e: v2f) => number>;
16
12
  /**
17
13
  * @privateRemarks
18
14
  * https://gpuweb.github.io/gpuweb/wgsl/#unpack4x8unorm-builtin
19
15
  */
20
- declare const unpack4x8unorm: DualFn<(e: number) => v4f>;
16
+ export declare const unpack4x8unorm: import("../types.ts").DualFn<(e: number) => v4f>;
21
17
  /**
22
18
  * @privateRemarks
23
19
  * https://gpuweb.github.io/gpuweb/wgsl/#pack4x8unorm-builtin
24
20
  */
25
- declare const pack4x8unorm: DualFn<(e: v4f) => number>;
26
- //#endregion
27
- export { pack2x16float, pack4x8unorm, unpack2x16float, unpack4x8unorm };
21
+ export declare const pack4x8unorm: import("../types.ts").DualFn<(e: v4f) => number>;