typegpu 0.11.9 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/bin.mjs +28 -6
  2. package/builtin.d.ts +51 -53
  3. package/builtin.js +30 -34
  4. package/common/fullScreenTriangle.d.ts +2 -10
  5. package/common/fullScreenTriangle.js +20 -28
  6. package/common/index.d.ts +2 -9
  7. package/common/index.js +3 -12
  8. package/common/writeSoA.d.ts +11 -12
  9. package/common/writeSoA.js +88 -76
  10. package/core/buffer/buffer.d.ts +79 -62
  11. package/core/buffer/buffer.js +283 -205
  12. package/core/buffer/bufferBinding.d.ts +71 -0
  13. package/core/buffer/bufferBinding.js +154 -0
  14. package/core/buffer/bufferUsage.d.ts +14 -45
  15. package/core/buffer/bufferUsage.js +1 -171
  16. package/core/buffer/laidOutBuffer.d.ts +25 -0
  17. package/core/buffer/laidOutBuffer.js +55 -0
  18. package/core/commandEncoder/attachments.d.ts +125 -0
  19. package/core/commandEncoder/attachments.js +29 -0
  20. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  21. package/core/commandEncoder/commandEncoder.js +56 -0
  22. package/core/commandEncoder/computePass.d.ts +58 -0
  23. package/core/commandEncoder/computePass.js +63 -0
  24. package/core/commandEncoder/renderPass.d.ts +121 -0
  25. package/core/commandEncoder/renderPass.js +196 -0
  26. package/core/constant/tgpuConstant.d.ts +26 -26
  27. package/core/constant/tgpuConstant.js +76 -65
  28. package/core/declare/tgpuDeclare.d.ts +3 -6
  29. package/core/declare/tgpuDeclare.js +36 -36
  30. package/core/function/autoIO.d.ts +61 -33
  31. package/core/function/autoIO.js +68 -73
  32. package/core/function/comptime.d.ts +11 -13
  33. package/core/function/comptime.js +60 -52
  34. package/core/function/createCallableSchema.d.ts +16 -0
  35. package/core/function/createCallableSchema.js +50 -40
  36. package/core/function/dualImpl.d.ts +44 -0
  37. package/core/function/dualImpl.js +71 -50
  38. package/core/function/entryInputRouter.d.ts +26 -0
  39. package/core/function/entryInputRouter.js +31 -33
  40. package/core/function/extractArgs.d.ts +38 -0
  41. package/core/function/extractArgs.js +202 -200
  42. package/core/function/fnCore.d.ts +44 -5
  43. package/core/function/fnCore.js +148 -93
  44. package/core/function/fnTypes.d.ts +31 -29
  45. package/core/function/fnTypes.js +1 -0
  46. package/core/function/ioSchema.d.ts +12 -10
  47. package/core/function/ioSchema.js +65 -47
  48. package/core/function/shelllessImpl.d.ts +9 -12
  49. package/core/function/shelllessImpl.js +17 -22
  50. package/core/function/templateUtils.d.ts +2 -0
  51. package/core/function/templateUtils.js +9 -8
  52. package/core/function/tgpuComputeFn.d.ts +26 -28
  53. package/core/function/tgpuComputeFn.js +47 -48
  54. package/core/function/tgpuFn.d.ts +34 -37
  55. package/core/function/tgpuFn.js +179 -153
  56. package/core/function/tgpuFragmentFn.d.ts +52 -53
  57. package/core/function/tgpuFragmentFn.js +63 -56
  58. package/core/function/tgpuVertexFn.d.ts +36 -39
  59. package/core/function/tgpuVertexFn.js +56 -53
  60. package/core/pipeline/computePipeline.d.ts +141 -53
  61. package/core/pipeline/computePipeline.js +291 -225
  62. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  63. package/core/pipeline/connectAttachmentToShader.js +25 -22
  64. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  65. package/core/pipeline/connectTargetsToShader.js +29 -27
  66. package/core/pipeline/drawState.d.ts +52 -0
  67. package/core/pipeline/drawState.js +225 -0
  68. package/core/pipeline/performanceTracker.d.ts +14 -0
  69. package/core/pipeline/performanceTracker.js +34 -0
  70. package/core/pipeline/pipelineUtils.d.ts +18 -0
  71. package/core/pipeline/pipelineUtils.js +54 -25
  72. package/core/pipeline/priors.d.ts +1 -0
  73. package/core/pipeline/priors.js +12 -0
  74. package/core/pipeline/renderPipeline.d.ts +246 -261
  75. package/core/pipeline/renderPipeline.js +487 -480
  76. package/core/pipeline/timeable.d.ts +28 -18
  77. package/core/pipeline/timeable.js +90 -52
  78. package/core/pipeline/typeGuards.d.ts +17 -0
  79. package/core/pipeline/typeGuards.js +52 -22
  80. package/core/pipeline/webgpuLimitations.d.ts +10 -0
  81. package/core/pipeline/webgpuLimitations.js +81 -0
  82. package/core/querySet/querySet.d.ts +26 -21
  83. package/core/querySet/querySet.js +127 -103
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  85. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  86. package/core/resolve/externals.d.ts +25 -8
  87. package/core/resolve/externals.js +78 -54
  88. package/core/resolve/namespace.d.ts +22 -25
  89. package/core/resolve/namespace.js +16 -21
  90. package/core/resolve/resolvableString.d.ts +7 -0
  91. package/core/resolve/resolvableString.js +13 -0
  92. package/core/resolve/resolveData.d.ts +10 -0
  93. package/core/resolve/resolveData.js +162 -121
  94. package/core/resolve/stitch.d.ts +8 -0
  95. package/core/resolve/stitch.js +23 -21
  96. package/core/resolve/tgpuResolve.d.ts +55 -53
  97. package/core/resolve/tgpuResolve.js +106 -53
  98. package/core/root/configurableImpl.d.ts +10 -0
  99. package/core/root/configurableImpl.js +17 -19
  100. package/core/root/init.d.ts +76 -38
  101. package/core/root/init.js +346 -455
  102. package/core/root/rootTypes.d.ts +461 -636
  103. package/core/root/rootTypes.js +1 -0
  104. package/core/sampler/sampler.d.ts +50 -31
  105. package/core/sampler/sampler.js +120 -113
  106. package/core/simulate/tgpuSimulate.d.ts +9 -12
  107. package/core/simulate/tgpuSimulate.js +68 -71
  108. package/core/slot/accessor.d.ts +36 -13
  109. package/core/slot/accessor.js +138 -91
  110. package/core/slot/internalSlots.d.ts +2 -0
  111. package/core/slot/internalSlots.js +1 -6
  112. package/core/slot/lazy.d.ts +2 -6
  113. package/core/slot/lazy.js +71 -39
  114. package/core/slot/slot.d.ts +2 -6
  115. package/core/slot/slot.js +45 -38
  116. package/core/slot/slotTypes.d.ts +78 -80
  117. package/core/slot/slotTypes.js +11 -16
  118. package/core/texture/externalTexture.d.ts +20 -11
  119. package/core/texture/externalTexture.js +46 -46
  120. package/core/texture/texture.d.ts +152 -97
  121. package/core/texture/texture.js +407 -314
  122. package/core/texture/textureFormats.d.ts +42 -23
  123. package/core/texture/textureFormats.js +104 -75
  124. package/core/texture/textureProps.d.ts +7 -10
  125. package/core/texture/textureProps.js +1 -0
  126. package/core/texture/textureUtils.d.ts +8 -0
  127. package/core/texture/textureUtils.js +185 -179
  128. package/core/texture/usageExtension.d.ts +21 -18
  129. package/core/texture/usageExtension.js +13 -17
  130. package/core/unroll/tgpuUnroll.d.ts +20 -19
  131. package/core/unroll/tgpuUnroll.js +82 -91
  132. package/core/valueProxyUtils.d.ts +3 -0
  133. package/core/valueProxyUtils.js +52 -41
  134. package/core/variable/tgpuVariable.d.ts +26 -27
  135. package/core/variable/tgpuVariable.js +93 -96
  136. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  137. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  138. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  139. package/core/vertexLayout/vertexAttribute.js +1 -0
  140. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  141. package/core/vertexLayout/vertexLayout.js +130 -99
  142. package/core/whitespaces.d.ts +2 -0
  143. package/core/whitespaces.js +16 -0
  144. package/data/alignIO.d.ts +7 -0
  145. package/data/alignIO.js +13 -13
  146. package/data/alignmentOf.d.ts +5 -8
  147. package/data/alignmentOf.js +90 -75
  148. package/data/array.d.ts +17 -9
  149. package/data/array.js +57 -40
  150. package/data/atomic.d.ts +2 -7
  151. package/data/atomic.js +26 -23
  152. package/data/attributes.d.ts +19 -21
  153. package/data/attributes.js +192 -132
  154. package/data/autoStruct.d.ts +36 -3
  155. package/data/autoStruct.js +84 -81
  156. package/data/compiledIO.d.ts +5 -0
  157. package/data/compiledIO.js +231 -215
  158. package/data/dataIO.d.ts +13 -11
  159. package/data/dataIO.js +643 -589
  160. package/data/dataTypes.d.ts +83 -65
  161. package/data/dataTypes.js +66 -68
  162. package/data/deepEqual.d.ts +2 -7
  163. package/data/deepEqual.js +80 -55
  164. package/data/disarray.d.ts +6 -10
  165. package/data/disarray.js +52 -46
  166. package/data/float16Conversion.d.ts +4 -0
  167. package/data/float16Conversion.js +7 -0
  168. package/data/generalizeFn.d.ts +25 -0
  169. package/data/generalizeFn.js +89 -0
  170. package/data/getLongestContiguousPrefix.d.ts +4 -8
  171. package/data/getLongestContiguousPrefix.js +6 -11
  172. package/data/index.d.ts +30 -31
  173. package/data/index.js +39 -172
  174. package/data/instanceToSchema.d.ts +24 -27
  175. package/data/instanceToSchema.js +1 -0
  176. package/data/isContiguous.d.ts +4 -8
  177. package/data/isContiguous.js +6 -11
  178. package/data/matrix.d.ts +21 -21
  179. package/data/matrix.js +513 -505
  180. package/data/numberOps.d.ts +5 -0
  181. package/data/numberOps.js +21 -21
  182. package/data/numeric.d.ts +21 -12
  183. package/data/numeric.js +287 -197
  184. package/data/offsetUtils.d.ts +9 -13
  185. package/data/offsetUtils.js +204 -144
  186. package/data/offsets.d.ts +8 -0
  187. package/data/offsets.js +33 -33
  188. package/data/partialIO.d.ts +13 -8
  189. package/data/partialIO.js +124 -113
  190. package/data/ptr.d.ts +12 -12
  191. package/data/ptr.js +42 -44
  192. package/data/ref.d.ts +40 -27
  193. package/data/ref.js +125 -95
  194. package/data/sampler.d.ts +99 -101
  195. package/data/sampler.js +17 -21
  196. package/data/schemaCallWrapper.d.ts +19 -0
  197. package/data/schemaCallWrapper.js +31 -26
  198. package/data/schemaMemoryLayout.d.ts +8 -0
  199. package/data/schemaMemoryLayout.js +213 -185
  200. package/data/sizeOf.d.ts +4 -8
  201. package/data/sizeOf.js +6 -11
  202. package/data/snippet.d.ts +96 -20
  203. package/data/snippet.js +75 -86
  204. package/data/struct.d.ts +4 -7
  205. package/data/struct.js +51 -39
  206. package/data/texture.d.ts +253 -250
  207. package/data/texture.js +238 -200
  208. package/data/unstruct.d.ts +2 -7
  209. package/data/unstruct.js +43 -37
  210. package/data/vector.d.ts +33 -21
  211. package/data/vector.js +234 -221
  212. package/data/vectorImpl.d.ts +231 -0
  213. package/data/vectorImpl.js +563 -515
  214. package/data/vectorOps.d.ts +25 -0
  215. package/data/vectorOps.js +118 -669
  216. package/data/vertexFormatData.d.ts +181 -184
  217. package/data/vertexFormatData.js +104 -106
  218. package/data/wgslTypes.d.ts +665 -600
  219. package/data/wgslTypes.js +220 -198
  220. package/errors.d.ts +50 -24
  221. package/errors.js +146 -126
  222. package/execMode.d.ts +16 -0
  223. package/execMode.js +47 -40
  224. package/extension.d.ts +13 -8
  225. package/extension.js +10 -16
  226. package/getGPUValue.d.ts +1 -0
  227. package/getGPUValue.js +2 -7
  228. package/index.d.ts +28 -68
  229. package/index.js +8 -28
  230. package/indexNamedExports.d.ts +69 -42
  231. package/indexNamedExports.js +25 -0
  232. package/internal.d.ts +16 -0
  233. package/internal.js +12 -0
  234. package/mathUtils.d.ts +5 -0
  235. package/mathUtils.js +7 -11
  236. package/memo.d.ts +11 -0
  237. package/memo.js +20 -22
  238. package/minify.d.ts +5 -0
  239. package/minify.js +93 -0
  240. package/nameUtils.d.ts +29 -0
  241. package/nameUtils.js +427 -394
  242. package/package.json +5 -1
  243. package/resolutionCtx.d.ts +162 -22
  244. package/resolutionCtx.js +911 -629
  245. package/serial/registry.d.ts +15 -0
  246. package/serial/registry.js +106 -0
  247. package/serial/restore.d.ts +49 -0
  248. package/serial/restore.js +68 -0
  249. package/serial/schema.d.ts +58 -0
  250. package/serial/schema.js +209 -0
  251. package/serial/types.d.ts +5 -0
  252. package/serial/types.js +1 -0
  253. package/shared/env.d.ts +9 -0
  254. package/shared/env.js +9 -12
  255. package/shared/generators.d.ts +4 -0
  256. package/shared/generators.js +10 -12
  257. package/shared/meta.d.ts +29 -14
  258. package/shared/meta.js +71 -55
  259. package/shared/normalizeMetadata.d.ts +32 -27
  260. package/shared/normalizeMetadata.js +23 -36
  261. package/shared/repr.d.ts +73 -55
  262. package/shared/repr.js +1 -0
  263. package/shared/soul.d.ts +17 -0
  264. package/shared/soul.js +1 -0
  265. package/shared/stringify.d.ts +2 -0
  266. package/shared/stringify.js +29 -20
  267. package/shared/symbols.d.ts +26 -20
  268. package/shared/symbols.js +79 -79
  269. package/shared/tseynit.d.ts +2 -0
  270. package/shared/tseynit.js +160 -75
  271. package/shared/utilityTypes.d.ts +30 -14
  272. package/shared/utilityTypes.js +2 -6
  273. package/shared/vertexFormat.d.ts +41 -43
  274. package/shared/vertexFormat.js +59 -62
  275. package/std/array.d.ts +2 -7
  276. package/std/array.js +18 -23
  277. package/std/atomic.d.ts +14 -18
  278. package/std/atomic.js +96 -95
  279. package/std/bitcast.d.ts +193 -10
  280. package/std/bitcast.js +309 -39
  281. package/std/boolean.d.ts +19 -33
  282. package/std/boolean.js +296 -292
  283. package/std/copy.d.ts +2 -7
  284. package/std/copy.js +27 -24
  285. package/std/derivative.d.ts +11 -15
  286. package/std/derivative.js +56 -79
  287. package/std/discard.d.ts +1 -6
  288. package/std/discard.js +7 -14
  289. package/std/environment.d.ts +19 -14
  290. package/std/environment.js +71 -51
  291. package/std/extensions.d.ts +2 -8
  292. package/std/extensions.js +10 -11
  293. package/std/index.d.ts +20 -24
  294. package/std/index.js +32 -187
  295. package/std/matrix.d.ts +6 -12
  296. package/std/matrix.js +60 -69
  297. package/std/numeric.d.ts +150 -146
  298. package/std/numeric.js +771 -727
  299. package/std/operators.d.ts +19 -27
  300. package/std/operators.js +195 -194
  301. package/std/packing.d.ts +5 -11
  302. package/std/packing.js +67 -75
  303. package/std/range.d.ts +6 -11
  304. package/std/range.js +48 -36
  305. package/std/subgroup.d.ts +33 -37
  306. package/std/subgroup.js +180 -217
  307. package/std/texture.d.ts +70 -38
  308. package/std/texture.js +176 -172
  309. package/taskQueue.d.ts +6 -0
  310. package/taskQueue.js +30 -0
  311. package/tgpu.d.ts +16 -0
  312. package/tgpu.js +17 -44
  313. package/tgpuBindGroupLayout.d.ts +132 -152
  314. package/tgpuBindGroupLayout.js +346 -268
  315. package/tgpuLogger.d.ts +34 -0
  316. package/tgpuLogger.js +64 -0
  317. package/tgpuUnstable.d.ts +16 -22
  318. package/tgpuUnstable.js +13 -35
  319. package/tgsl/accessIndex.d.ts +2 -0
  320. package/tgsl/accessIndex.js +76 -33
  321. package/tgsl/accessProp.d.ts +2 -0
  322. package/tgsl/accessProp.js +142 -101
  323. package/tgsl/accessStructProp.d.ts +5 -0
  324. package/tgsl/accessStructProp.js +13 -15
  325. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  326. package/tgsl/consoleLog/deserializers.js +119 -103
  327. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  328. package/tgsl/consoleLog/logGenerator.js +85 -80
  329. package/tgsl/consoleLog/serializers.d.ts +21 -0
  330. package/tgsl/consoleLog/serializers.js +119 -100
  331. package/tgsl/consoleLog/types.d.ts +40 -39
  332. package/tgsl/consoleLog/types.js +1 -0
  333. package/tgsl/conversion.d.ts +33 -0
  334. package/tgsl/conversion.js +271 -216
  335. package/tgsl/forOfUtils.d.ts +15 -0
  336. package/tgsl/forOfUtils.js +85 -70
  337. package/tgsl/generationHelpers.d.ts +22 -39
  338. package/tgsl/generationHelpers.js +85 -58
  339. package/tgsl/infixDispatch.d.ts +70 -0
  340. package/tgsl/infixDispatch.js +48 -46
  341. package/tgsl/jsPolyfills.d.ts +16 -19
  342. package/tgsl/jsPolyfills.js +44 -42
  343. package/tgsl/makeDereferenceable.d.ts +48 -0
  344. package/tgsl/makeDereferenceable.js +86 -0
  345. package/tgsl/makeResolvable.d.ts +22 -0
  346. package/tgsl/makeResolvable.js +33 -0
  347. package/tgsl/shaderGenerator.d.ts +77 -17
  348. package/tgsl/shaderGenerator.js +1 -0
  349. package/tgsl/shellless.d.ts +6 -9
  350. package/tgsl/shellless.js +73 -43
  351. package/tgsl/wgslGenerator.d.ts +66 -59
  352. package/tgsl/wgslGenerator.js +1345 -760
  353. package/types.d.ts +287 -222
  354. package/types.js +61 -44
  355. package/unwrapper.d.ts +31 -26
  356. package/unwrapper.js +1 -0
  357. package/wgslExtensions.d.ts +3 -5
  358. package/wgslExtensions.js +12 -16
  359. package/_virtual/rolldown_runtime.js +0 -13
  360. package/core/buffer/bufferShorthand.d.ts +0 -50
  361. package/core/buffer/bufferShorthand.js +0 -55
  362. package/core/pipeline/applyPipelineState.js +0 -37
  363. package/core/pipeline/limitsOverflow.js +0 -13
  364. package/package.js +0 -5
  365. package/tgsl/shaderGenerator_members.d.ts +0 -33
  366. package/tgsl/shaderGenerator_members.js +0 -12
@@ -1,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,230 @@
1
- import { isFloat32VecInstance, isInteger32VecInstance, isMat, isMatInstance, isUint32VecInstance, isVec, isVecInstance } from "../data/wgslTypes.js";
2
- import { SignatureNotSupportedError } from "../errors.js";
3
- 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";
6
- import { vec2i, vec2u, vec3i, vec3u, vec4i, vec4u, vecTypeToConstructor } from "../data/vector.js";
7
1
  import { dualImpl } from "../core/function/dualImpl.js";
2
+ import { stitch } from "../core/resolve/stitch.js";
3
+ import { abstractFloat, f16, f32, u32 } from "../data/numeric.js";
4
+ import { vec2i, vec2u, vec3i, vec3u, vec4i, vec4u } from "../data/vector.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 { generalizeFn, upCast } from "../data/generalizeFn.js";
7
+ import { isFloat32VecInstance, isInteger32VecInstance, isMat, isMatInstance, isUint32VecInstance, isVec, isVecInstance, } from "../data/wgslTypes.js";
8
+ import { SignatureNotSupportedError } from "../errors.js";
9
+ import { unify } from "../tgsl/conversion.js";
10
+ const getPrimitive = (t) => ('primitive' in t ? t.primitive : t);
12
11
  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
- };
12
+ const { restrict } = opts ?? {};
13
+ const fail = (msg) => {
14
+ if (restrict) {
15
+ throw new SignatureNotSupportedError([lhs, rhs], restrict);
16
+ }
17
+ throw new Error(`Cannot apply operator to ${lhs.type} and ${rhs.type}: ${msg}`);
18
+ };
19
+ if (opts?.noMat && (isMat(lhs) || isMat(rhs))) {
20
+ return fail('matrices not supported');
21
+ }
22
+ const lhsC = isVec(lhs) || isMat(lhs);
23
+ const rhsC = isVec(rhs) || isMat(rhs);
24
+ if (!lhsC && !rhsC) {
25
+ // scalar × scalar
26
+ const unified = unify([lhs, rhs], restrict);
27
+ if (!unified)
28
+ return fail('incompatible scalar types');
29
+ return { argTypes: unified, returnType: unified[0] };
30
+ }
31
+ if (lhsC && rhsC) {
32
+ // vec × mat or mat × vec
33
+ if (opts?.matVecProduct && isVec(lhs) !== isVec(rhs)) {
34
+ return { argTypes: [lhs, rhs], returnType: isVec(lhs) ? lhs : rhs };
35
+ }
36
+ // composite × composite (same kind)
37
+ if (lhs.type !== rhs.type)
38
+ return fail('operands must have the same type');
39
+ return { argTypes: [lhs, rhs], returnType: lhs };
40
+ }
41
+ // scalar × composite
42
+ const [scalar, composite] = lhsC ? [rhs, lhs] : [lhs, rhs];
43
+ const unified = unify([scalar], [getPrimitive(composite)]);
44
+ if (!unified) {
45
+ return fail(`scalar not convertible to ${getPrimitive(composite).type}`);
46
+ }
47
+ return {
48
+ argTypes: lhsC ? [lhs, unified[0]] : [unified[0], rhs],
49
+ returnType: composite,
50
+ };
47
51
  };
48
52
  const binaryArithmeticSignature = makeBinarySignature();
49
53
  const binaryMulSignature = makeBinarySignature({ matVecProduct: true });
50
54
  const binaryDivSignature = makeBinarySignature({
51
- noMat: true,
52
- restrict: [
53
- f32,
54
- f16,
55
- abstractFloat
56
- ]
55
+ noMat: true,
56
+ restrict: [f32, f16, abstractFloat],
57
57
  });
58
58
  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.");
59
+ if (typeof lhs === 'number' && typeof rhs === 'number') {
60
+ return lhs + rhs; // default addition
61
+ }
62
+ if (typeof lhs === 'number' && isVecInstance(rhs)) {
63
+ return generalizeFn((e) => lhs + e, [rhs]); // mixed addition
64
+ }
65
+ if (isVecInstance(lhs) && typeof rhs === 'number') {
66
+ return generalizeFn((e) => e + rhs, [lhs]); // mixed addition
67
+ }
68
+ if ((isVecInstance(lhs) && isVecInstance(rhs)) || (isMatInstance(lhs) && isMatInstance(rhs))) {
69
+ return generalizeFn((a, b) => a + b, [lhs, rhs]); // component-wise addition
70
+ }
71
+ throw new Error('Add/Sub called with invalid arguments.');
64
72
  }
65
- const add = dualImpl({
66
- name: "add",
67
- signature: binaryArithmeticSignature,
68
- normalImpl: cpuAdd,
69
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} + ${rhs})`
73
+ export const add = dualImpl({
74
+ name: 'add',
75
+ signature: binaryArithmeticSignature,
76
+ normalImpl: cpuAdd,
77
+ codegenImpl: (ctx, [lhs, rhs]) => ctx.gen.emitBinaryOp(lhs, '+', rhs),
78
+ sideEffects: false,
70
79
  });
71
80
  function cpuSub(lhs, rhs) {
72
- return cpuAdd(lhs, cpuMul(-1, rhs));
81
+ // while illegal on the wgsl side, we can do this in js
82
+ return cpuAdd(lhs, cpuMul(-1, rhs));
73
83
  }
74
- const sub = dualImpl({
75
- name: "sub",
76
- signature: binaryArithmeticSignature,
77
- normalImpl: cpuSub,
78
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} - ${rhs})`
84
+ export const sub = dualImpl({
85
+ name: 'sub',
86
+ signature: binaryArithmeticSignature,
87
+ normalImpl: cpuSub,
88
+ codegenImpl: (ctx, [lhs, rhs]) => ctx.gen.emitBinaryOp(lhs, '-', rhs),
89
+ sideEffects: false,
79
90
  });
80
91
  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.");
92
+ if (typeof lhs === 'number' && typeof rhs === 'number') {
93
+ return lhs * rhs; // default multiplication
94
+ }
95
+ if (typeof lhs === 'number' && (isVecInstance(rhs) || isMatInstance(rhs))) {
96
+ return generalizeFn((e) => lhs * e, [rhs]); // scale
97
+ }
98
+ if ((isVecInstance(lhs) || isMatInstance(lhs)) && typeof rhs === 'number') {
99
+ return generalizeFn((e) => e * rhs, [lhs]); // scale
100
+ }
101
+ if (isVecInstance(lhs) && isVecInstance(rhs)) {
102
+ return generalizeFn((a, b) => a * b, [lhs, rhs]); // component-wise
103
+ }
104
+ if (isFloat32VecInstance(lhs) && isMatInstance(rhs)) {
105
+ return VectorOps.mulVxM[rhs.kind](lhs, rhs); // row-vector-matrix
106
+ }
107
+ if (isMatInstance(lhs) && isFloat32VecInstance(rhs)) {
108
+ return VectorOps.mulMxV[lhs.kind](lhs, rhs); // matrix-column-vector
109
+ }
110
+ if (isMatInstance(lhs) && isMatInstance(rhs)) {
111
+ return VectorOps.mulMxM[lhs.kind](lhs, rhs); // matrix multiplication
112
+ }
113
+ throw new Error('Mul called with invalid arguments.');
89
114
  }
90
- const mul = dualImpl({
91
- name: "mul",
92
- signature: binaryMulSignature,
93
- normalImpl: cpuMul,
94
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} * ${rhs})`
115
+ export const mul = dualImpl({
116
+ name: 'mul',
117
+ signature: binaryMulSignature,
118
+ normalImpl: cpuMul,
119
+ codegenImpl: (ctx, [lhs, rhs]) => ctx.gen.emitBinaryOp(lhs, '*', rhs),
120
+ sideEffects: false,
95
121
  });
96
122
  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.");
123
+ return generalizeFn((a, b) => a / b, upCast([lhs, rhs]));
108
124
  }
109
- const div = dualImpl({
110
- name: "div",
111
- signature: binaryDivSignature,
112
- normalImpl: cpuDiv,
113
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} / ${rhs})`,
114
- ignoreImplicitCastWarning: true
125
+ export const div = dualImpl({
126
+ name: 'div',
127
+ signature: binaryDivSignature,
128
+ normalImpl: cpuDiv,
129
+ codegenImpl: (ctx, [lhs, rhs]) => ctx.gen.emitBinaryOp(lhs, '/', rhs),
130
+ ignoreImplicitCastWarning: true,
131
+ sideEffects: false,
115
132
  });
116
133
  /**
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})`
134
+ * @privateRemarks
135
+ * Both JS and WGSL implementations use truncated definition of modulo
136
+ */
137
+ export const mod = dualImpl({
138
+ name: 'mod',
139
+ signature: binaryDivSignature,
140
+ normalImpl: ((a, b) => {
141
+ return generalizeFn((a, b) => a % b, upCast([a, b]));
142
+ }),
143
+ codegenImpl: (ctx, [lhs, rhs]) => ctx.gen.emitBinaryOp(lhs, '%', rhs),
144
+ sideEffects: false,
137
145
  });
138
146
  function cpuNeg(value) {
139
- if (typeof value === "number") return -value;
140
- return VectorOps.neg[value.kind](value);
147
+ return generalizeFn((value) => -value, [value]);
141
148
  }
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})`
149
+ export const neg = dualImpl({
150
+ name: 'neg',
151
+ signature: (arg) => ({
152
+ argTypes: [arg],
153
+ returnType: arg,
154
+ }),
155
+ normalImpl: cpuNeg,
156
+ codegenImpl: (_ctx, [arg]) => stitch `-(${arg})`,
157
+ sideEffects: false,
150
158
  });
151
- const anyConcreteInteger = [
152
- i32,
153
- u32,
154
- vec2i,
155
- vec3i,
156
- vec4i,
157
- vec2u,
158
- vec3u,
159
- vec4u
160
- ];
161
159
  const intVecToUnsignedVec = {
162
- vec2i: vec2u,
163
- vec2u,
164
- vec3i: vec3u,
165
- vec3u,
166
- vec4i: vec4u,
167
- vec4u
160
+ vec2i: vec2u,
161
+ vec2u: vec2u,
162
+ vec3i: vec3u,
163
+ vec3u: vec3u,
164
+ vec4i: vec4u,
165
+ vec4u: vec4u,
168
166
  };
169
167
  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
- };
168
+ const lhsUnified = unify([lhs], [vec2i, vec3i, vec4i, vec2u, vec3u, vec4u])?.[0];
169
+ if (!lhsUnified || !isVec(lhsUnified)) {
170
+ throw new SignatureNotSupportedError([lhs], [vec2i, vec3i, vec4i, vec2u, vec3u, vec4u]);
171
+ }
172
+ const cc = lhsUnified.componentCount;
173
+ const vecU = cc === 2 ? vec2u : cc === 3 ? vec3u : vec4u;
174
+ const rhsUnified = unify([rhs], [u32, vecU])?.[0];
175
+ if (!rhsUnified) {
176
+ throw new SignatureNotSupportedError([rhs], [u32, vecU]);
177
+ }
178
+ return {
179
+ argTypes: [lhsUnified, rhsUnified],
180
+ returnType: lhsUnified,
181
+ };
184
182
  };
185
183
  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).");
184
+ if (isInteger32VecInstance(lhs) && isUint32VecInstance(rhs) && lhs.length == rhs.length) {
185
+ return VectorOps.bitShiftLeft[lhs.kind](lhs, rhs);
186
+ }
187
+ if (isInteger32VecInstance(lhs) && typeof rhs === 'number') {
188
+ const rhsVec = intVecToUnsignedVec[lhs.kind](rhs);
189
+ return VectorOps.bitShiftLeft[lhs.kind](lhs, rhsVec);
190
+ }
191
+ 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
192
  }
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
- }
193
+ export const bitShiftLeft = dualImpl({
194
+ name: 'bitShiftLeft',
195
+ signature: bitShiftSignature,
196
+ normalImpl: cpuBitShiftLeft,
197
+ codegenImpl: (ctx, [lhs, rhs]) => {
198
+ if (isVec(lhs.dataType) && !isVec(rhs.dataType)) {
199
+ const cc = lhs.dataType.componentCount;
200
+ const schema = cc === 2 ? vec2u : cc === 3 ? vec3u : vec4u;
201
+ return ctx.gen.emitBinaryOp(lhs, '<<', ctx.gen.typeInstantiation(schema, [rhs]));
202
+ }
203
+ return ctx.gen.emitBinaryOp(lhs, '<<', rhs);
204
+ },
205
+ sideEffects: false,
205
206
  });
206
207
  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).");
208
+ if (isInteger32VecInstance(lhs) && isUint32VecInstance(rhs) && lhs.length == rhs.length) {
209
+ return VectorOps.bitShiftRight[lhs.kind](lhs, rhs);
210
+ }
211
+ if (isInteger32VecInstance(lhs) && typeof rhs === 'number') {
212
+ const rhsVec = intVecToUnsignedVec[lhs.kind](rhs);
213
+ return VectorOps.bitShiftRight[lhs.kind](lhs, rhsVec);
214
+ }
215
+ 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
216
  }
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
- }
217
+ export const bitShiftRight = dualImpl({
218
+ name: 'bitShiftRight',
219
+ signature: bitShiftSignature,
220
+ normalImpl: cpuBitShiftRight,
221
+ codegenImpl: (ctx, [lhs, rhs]) => {
222
+ if (isVec(lhs.dataType) && !isVec(rhs.dataType)) {
223
+ const cc = lhs.dataType.componentCount;
224
+ const schema = cc === 2 ? vec2u : cc === 3 ? vec3u : vec4u;
225
+ return ctx.gen.emitBinaryOp(lhs, '>>', ctx.gen.typeInstantiation(schema, [rhs]));
226
+ }
227
+ return ctx.gen.emitBinaryOp(lhs, '>>', rhs);
228
+ },
229
+ sideEffects: false,
226
230
  });
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>;