typegpu 0.11.9 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/bin.mjs +28 -6
  2. package/builtin.d.ts +51 -53
  3. package/builtin.js +30 -34
  4. package/common/fullScreenTriangle.d.ts +2 -10
  5. package/common/fullScreenTriangle.js +20 -28
  6. package/common/index.d.ts +2 -9
  7. package/common/index.js +3 -12
  8. package/common/writeSoA.d.ts +11 -12
  9. package/common/writeSoA.js +88 -76
  10. package/core/buffer/buffer.d.ts +79 -62
  11. package/core/buffer/buffer.js +283 -205
  12. package/core/buffer/bufferBinding.d.ts +71 -0
  13. package/core/buffer/bufferBinding.js +154 -0
  14. package/core/buffer/bufferUsage.d.ts +14 -45
  15. package/core/buffer/bufferUsage.js +1 -171
  16. package/core/buffer/laidOutBuffer.d.ts +25 -0
  17. package/core/buffer/laidOutBuffer.js +55 -0
  18. package/core/commandEncoder/attachments.d.ts +125 -0
  19. package/core/commandEncoder/attachments.js +29 -0
  20. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  21. package/core/commandEncoder/commandEncoder.js +56 -0
  22. package/core/commandEncoder/computePass.d.ts +58 -0
  23. package/core/commandEncoder/computePass.js +63 -0
  24. package/core/commandEncoder/renderPass.d.ts +121 -0
  25. package/core/commandEncoder/renderPass.js +196 -0
  26. package/core/constant/tgpuConstant.d.ts +26 -26
  27. package/core/constant/tgpuConstant.js +76 -65
  28. package/core/declare/tgpuDeclare.d.ts +3 -6
  29. package/core/declare/tgpuDeclare.js +36 -36
  30. package/core/function/autoIO.d.ts +61 -33
  31. package/core/function/autoIO.js +68 -73
  32. package/core/function/comptime.d.ts +11 -13
  33. package/core/function/comptime.js +60 -52
  34. package/core/function/createCallableSchema.d.ts +16 -0
  35. package/core/function/createCallableSchema.js +50 -40
  36. package/core/function/dualImpl.d.ts +44 -0
  37. package/core/function/dualImpl.js +71 -50
  38. package/core/function/entryInputRouter.d.ts +26 -0
  39. package/core/function/entryInputRouter.js +31 -33
  40. package/core/function/extractArgs.d.ts +38 -0
  41. package/core/function/extractArgs.js +202 -200
  42. package/core/function/fnCore.d.ts +44 -5
  43. package/core/function/fnCore.js +148 -93
  44. package/core/function/fnTypes.d.ts +31 -29
  45. package/core/function/fnTypes.js +1 -0
  46. package/core/function/ioSchema.d.ts +12 -10
  47. package/core/function/ioSchema.js +65 -47
  48. package/core/function/shelllessImpl.d.ts +9 -12
  49. package/core/function/shelllessImpl.js +17 -22
  50. package/core/function/templateUtils.d.ts +2 -0
  51. package/core/function/templateUtils.js +9 -8
  52. package/core/function/tgpuComputeFn.d.ts +26 -28
  53. package/core/function/tgpuComputeFn.js +47 -48
  54. package/core/function/tgpuFn.d.ts +34 -37
  55. package/core/function/tgpuFn.js +179 -153
  56. package/core/function/tgpuFragmentFn.d.ts +52 -53
  57. package/core/function/tgpuFragmentFn.js +63 -56
  58. package/core/function/tgpuVertexFn.d.ts +36 -39
  59. package/core/function/tgpuVertexFn.js +56 -53
  60. package/core/pipeline/computePipeline.d.ts +141 -53
  61. package/core/pipeline/computePipeline.js +291 -225
  62. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  63. package/core/pipeline/connectAttachmentToShader.js +25 -22
  64. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  65. package/core/pipeline/connectTargetsToShader.js +29 -27
  66. package/core/pipeline/drawState.d.ts +52 -0
  67. package/core/pipeline/drawState.js +225 -0
  68. package/core/pipeline/performanceTracker.d.ts +14 -0
  69. package/core/pipeline/performanceTracker.js +34 -0
  70. package/core/pipeline/pipelineUtils.d.ts +18 -0
  71. package/core/pipeline/pipelineUtils.js +54 -25
  72. package/core/pipeline/priors.d.ts +1 -0
  73. package/core/pipeline/priors.js +12 -0
  74. package/core/pipeline/renderPipeline.d.ts +246 -261
  75. package/core/pipeline/renderPipeline.js +487 -480
  76. package/core/pipeline/timeable.d.ts +28 -18
  77. package/core/pipeline/timeable.js +90 -52
  78. package/core/pipeline/typeGuards.d.ts +17 -0
  79. package/core/pipeline/typeGuards.js +52 -22
  80. package/core/pipeline/webgpuLimitations.d.ts +10 -0
  81. package/core/pipeline/webgpuLimitations.js +81 -0
  82. package/core/querySet/querySet.d.ts +26 -21
  83. package/core/querySet/querySet.js +127 -103
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  85. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  86. package/core/resolve/externals.d.ts +25 -8
  87. package/core/resolve/externals.js +78 -54
  88. package/core/resolve/namespace.d.ts +22 -25
  89. package/core/resolve/namespace.js +16 -21
  90. package/core/resolve/resolvableString.d.ts +7 -0
  91. package/core/resolve/resolvableString.js +13 -0
  92. package/core/resolve/resolveData.d.ts +10 -0
  93. package/core/resolve/resolveData.js +162 -121
  94. package/core/resolve/stitch.d.ts +8 -0
  95. package/core/resolve/stitch.js +23 -21
  96. package/core/resolve/tgpuResolve.d.ts +55 -53
  97. package/core/resolve/tgpuResolve.js +106 -53
  98. package/core/root/configurableImpl.d.ts +10 -0
  99. package/core/root/configurableImpl.js +17 -19
  100. package/core/root/init.d.ts +76 -38
  101. package/core/root/init.js +346 -455
  102. package/core/root/rootTypes.d.ts +461 -636
  103. package/core/root/rootTypes.js +1 -0
  104. package/core/sampler/sampler.d.ts +50 -31
  105. package/core/sampler/sampler.js +120 -113
  106. package/core/simulate/tgpuSimulate.d.ts +9 -12
  107. package/core/simulate/tgpuSimulate.js +68 -71
  108. package/core/slot/accessor.d.ts +36 -13
  109. package/core/slot/accessor.js +138 -91
  110. package/core/slot/internalSlots.d.ts +2 -0
  111. package/core/slot/internalSlots.js +1 -6
  112. package/core/slot/lazy.d.ts +2 -6
  113. package/core/slot/lazy.js +71 -39
  114. package/core/slot/slot.d.ts +2 -6
  115. package/core/slot/slot.js +45 -38
  116. package/core/slot/slotTypes.d.ts +78 -80
  117. package/core/slot/slotTypes.js +11 -16
  118. package/core/texture/externalTexture.d.ts +20 -11
  119. package/core/texture/externalTexture.js +46 -46
  120. package/core/texture/texture.d.ts +152 -97
  121. package/core/texture/texture.js +407 -314
  122. package/core/texture/textureFormats.d.ts +42 -23
  123. package/core/texture/textureFormats.js +104 -75
  124. package/core/texture/textureProps.d.ts +7 -10
  125. package/core/texture/textureProps.js +1 -0
  126. package/core/texture/textureUtils.d.ts +8 -0
  127. package/core/texture/textureUtils.js +185 -179
  128. package/core/texture/usageExtension.d.ts +21 -18
  129. package/core/texture/usageExtension.js +13 -17
  130. package/core/unroll/tgpuUnroll.d.ts +20 -19
  131. package/core/unroll/tgpuUnroll.js +82 -91
  132. package/core/valueProxyUtils.d.ts +3 -0
  133. package/core/valueProxyUtils.js +52 -41
  134. package/core/variable/tgpuVariable.d.ts +26 -27
  135. package/core/variable/tgpuVariable.js +93 -96
  136. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  137. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  138. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  139. package/core/vertexLayout/vertexAttribute.js +1 -0
  140. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  141. package/core/vertexLayout/vertexLayout.js +130 -99
  142. package/core/whitespaces.d.ts +2 -0
  143. package/core/whitespaces.js +16 -0
  144. package/data/alignIO.d.ts +7 -0
  145. package/data/alignIO.js +13 -13
  146. package/data/alignmentOf.d.ts +5 -8
  147. package/data/alignmentOf.js +90 -75
  148. package/data/array.d.ts +17 -9
  149. package/data/array.js +57 -40
  150. package/data/atomic.d.ts +2 -7
  151. package/data/atomic.js +26 -23
  152. package/data/attributes.d.ts +19 -21
  153. package/data/attributes.js +192 -132
  154. package/data/autoStruct.d.ts +36 -3
  155. package/data/autoStruct.js +84 -81
  156. package/data/compiledIO.d.ts +5 -0
  157. package/data/compiledIO.js +231 -215
  158. package/data/dataIO.d.ts +13 -11
  159. package/data/dataIO.js +643 -589
  160. package/data/dataTypes.d.ts +83 -65
  161. package/data/dataTypes.js +66 -68
  162. package/data/deepEqual.d.ts +2 -7
  163. package/data/deepEqual.js +80 -55
  164. package/data/disarray.d.ts +6 -10
  165. package/data/disarray.js +52 -46
  166. package/data/float16Conversion.d.ts +4 -0
  167. package/data/float16Conversion.js +7 -0
  168. package/data/generalizeFn.d.ts +25 -0
  169. package/data/generalizeFn.js +89 -0
  170. package/data/getLongestContiguousPrefix.d.ts +4 -8
  171. package/data/getLongestContiguousPrefix.js +6 -11
  172. package/data/index.d.ts +30 -31
  173. package/data/index.js +39 -172
  174. package/data/instanceToSchema.d.ts +24 -27
  175. package/data/instanceToSchema.js +1 -0
  176. package/data/isContiguous.d.ts +4 -8
  177. package/data/isContiguous.js +6 -11
  178. package/data/matrix.d.ts +21 -21
  179. package/data/matrix.js +513 -505
  180. package/data/numberOps.d.ts +5 -0
  181. package/data/numberOps.js +21 -21
  182. package/data/numeric.d.ts +21 -12
  183. package/data/numeric.js +287 -197
  184. package/data/offsetUtils.d.ts +9 -13
  185. package/data/offsetUtils.js +204 -144
  186. package/data/offsets.d.ts +8 -0
  187. package/data/offsets.js +33 -33
  188. package/data/partialIO.d.ts +13 -8
  189. package/data/partialIO.js +124 -113
  190. package/data/ptr.d.ts +12 -12
  191. package/data/ptr.js +42 -44
  192. package/data/ref.d.ts +40 -27
  193. package/data/ref.js +125 -95
  194. package/data/sampler.d.ts +99 -101
  195. package/data/sampler.js +17 -21
  196. package/data/schemaCallWrapper.d.ts +19 -0
  197. package/data/schemaCallWrapper.js +31 -26
  198. package/data/schemaMemoryLayout.d.ts +8 -0
  199. package/data/schemaMemoryLayout.js +213 -185
  200. package/data/sizeOf.d.ts +4 -8
  201. package/data/sizeOf.js +6 -11
  202. package/data/snippet.d.ts +96 -20
  203. package/data/snippet.js +75 -86
  204. package/data/struct.d.ts +4 -7
  205. package/data/struct.js +51 -39
  206. package/data/texture.d.ts +253 -250
  207. package/data/texture.js +238 -200
  208. package/data/unstruct.d.ts +2 -7
  209. package/data/unstruct.js +43 -37
  210. package/data/vector.d.ts +33 -21
  211. package/data/vector.js +234 -221
  212. package/data/vectorImpl.d.ts +231 -0
  213. package/data/vectorImpl.js +563 -515
  214. package/data/vectorOps.d.ts +25 -0
  215. package/data/vectorOps.js +118 -669
  216. package/data/vertexFormatData.d.ts +181 -184
  217. package/data/vertexFormatData.js +104 -106
  218. package/data/wgslTypes.d.ts +665 -600
  219. package/data/wgslTypes.js +220 -198
  220. package/errors.d.ts +50 -24
  221. package/errors.js +146 -126
  222. package/execMode.d.ts +16 -0
  223. package/execMode.js +47 -40
  224. package/extension.d.ts +13 -8
  225. package/extension.js +10 -16
  226. package/getGPUValue.d.ts +1 -0
  227. package/getGPUValue.js +2 -7
  228. package/index.d.ts +28 -68
  229. package/index.js +8 -28
  230. package/indexNamedExports.d.ts +69 -42
  231. package/indexNamedExports.js +25 -0
  232. package/internal.d.ts +16 -0
  233. package/internal.js +12 -0
  234. package/mathUtils.d.ts +5 -0
  235. package/mathUtils.js +7 -11
  236. package/memo.d.ts +11 -0
  237. package/memo.js +20 -22
  238. package/minify.d.ts +5 -0
  239. package/minify.js +93 -0
  240. package/nameUtils.d.ts +29 -0
  241. package/nameUtils.js +427 -394
  242. package/package.json +5 -1
  243. package/resolutionCtx.d.ts +162 -22
  244. package/resolutionCtx.js +911 -629
  245. package/serial/registry.d.ts +15 -0
  246. package/serial/registry.js +106 -0
  247. package/serial/restore.d.ts +49 -0
  248. package/serial/restore.js +68 -0
  249. package/serial/schema.d.ts +58 -0
  250. package/serial/schema.js +209 -0
  251. package/serial/types.d.ts +5 -0
  252. package/serial/types.js +1 -0
  253. package/shared/env.d.ts +9 -0
  254. package/shared/env.js +9 -12
  255. package/shared/generators.d.ts +4 -0
  256. package/shared/generators.js +10 -12
  257. package/shared/meta.d.ts +29 -14
  258. package/shared/meta.js +71 -55
  259. package/shared/normalizeMetadata.d.ts +32 -27
  260. package/shared/normalizeMetadata.js +23 -36
  261. package/shared/repr.d.ts +73 -55
  262. package/shared/repr.js +1 -0
  263. package/shared/soul.d.ts +17 -0
  264. package/shared/soul.js +1 -0
  265. package/shared/stringify.d.ts +2 -0
  266. package/shared/stringify.js +29 -20
  267. package/shared/symbols.d.ts +26 -20
  268. package/shared/symbols.js +79 -79
  269. package/shared/tseynit.d.ts +2 -0
  270. package/shared/tseynit.js +160 -75
  271. package/shared/utilityTypes.d.ts +30 -14
  272. package/shared/utilityTypes.js +2 -6
  273. package/shared/vertexFormat.d.ts +41 -43
  274. package/shared/vertexFormat.js +59 -62
  275. package/std/array.d.ts +2 -7
  276. package/std/array.js +18 -23
  277. package/std/atomic.d.ts +14 -18
  278. package/std/atomic.js +96 -95
  279. package/std/bitcast.d.ts +193 -10
  280. package/std/bitcast.js +309 -39
  281. package/std/boolean.d.ts +19 -33
  282. package/std/boolean.js +296 -292
  283. package/std/copy.d.ts +2 -7
  284. package/std/copy.js +27 -24
  285. package/std/derivative.d.ts +11 -15
  286. package/std/derivative.js +56 -79
  287. package/std/discard.d.ts +1 -6
  288. package/std/discard.js +7 -14
  289. package/std/environment.d.ts +19 -14
  290. package/std/environment.js +71 -51
  291. package/std/extensions.d.ts +2 -8
  292. package/std/extensions.js +10 -11
  293. package/std/index.d.ts +20 -24
  294. package/std/index.js +32 -187
  295. package/std/matrix.d.ts +6 -12
  296. package/std/matrix.js +60 -69
  297. package/std/numeric.d.ts +150 -146
  298. package/std/numeric.js +771 -727
  299. package/std/operators.d.ts +19 -27
  300. package/std/operators.js +195 -194
  301. package/std/packing.d.ts +5 -11
  302. package/std/packing.js +67 -75
  303. package/std/range.d.ts +6 -11
  304. package/std/range.js +48 -36
  305. package/std/subgroup.d.ts +33 -37
  306. package/std/subgroup.js +180 -217
  307. package/std/texture.d.ts +70 -38
  308. package/std/texture.js +176 -172
  309. package/taskQueue.d.ts +6 -0
  310. package/taskQueue.js +30 -0
  311. package/tgpu.d.ts +16 -0
  312. package/tgpu.js +17 -44
  313. package/tgpuBindGroupLayout.d.ts +132 -152
  314. package/tgpuBindGroupLayout.js +346 -268
  315. package/tgpuLogger.d.ts +34 -0
  316. package/tgpuLogger.js +64 -0
  317. package/tgpuUnstable.d.ts +16 -22
  318. package/tgpuUnstable.js +13 -35
  319. package/tgsl/accessIndex.d.ts +2 -0
  320. package/tgsl/accessIndex.js +76 -33
  321. package/tgsl/accessProp.d.ts +2 -0
  322. package/tgsl/accessProp.js +142 -101
  323. package/tgsl/accessStructProp.d.ts +5 -0
  324. package/tgsl/accessStructProp.js +13 -15
  325. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  326. package/tgsl/consoleLog/deserializers.js +119 -103
  327. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  328. package/tgsl/consoleLog/logGenerator.js +85 -80
  329. package/tgsl/consoleLog/serializers.d.ts +21 -0
  330. package/tgsl/consoleLog/serializers.js +119 -100
  331. package/tgsl/consoleLog/types.d.ts +40 -39
  332. package/tgsl/consoleLog/types.js +1 -0
  333. package/tgsl/conversion.d.ts +33 -0
  334. package/tgsl/conversion.js +271 -216
  335. package/tgsl/forOfUtils.d.ts +15 -0
  336. package/tgsl/forOfUtils.js +85 -70
  337. package/tgsl/generationHelpers.d.ts +22 -39
  338. package/tgsl/generationHelpers.js +85 -58
  339. package/tgsl/infixDispatch.d.ts +70 -0
  340. package/tgsl/infixDispatch.js +48 -46
  341. package/tgsl/jsPolyfills.d.ts +16 -19
  342. package/tgsl/jsPolyfills.js +44 -42
  343. package/tgsl/makeDereferenceable.d.ts +48 -0
  344. package/tgsl/makeDereferenceable.js +86 -0
  345. package/tgsl/makeResolvable.d.ts +22 -0
  346. package/tgsl/makeResolvable.js +33 -0
  347. package/tgsl/shaderGenerator.d.ts +77 -17
  348. package/tgsl/shaderGenerator.js +1 -0
  349. package/tgsl/shellless.d.ts +6 -9
  350. package/tgsl/shellless.js +73 -43
  351. package/tgsl/wgslGenerator.d.ts +66 -59
  352. package/tgsl/wgslGenerator.js +1345 -760
  353. package/types.d.ts +287 -222
  354. package/types.js +61 -44
  355. package/unwrapper.d.ts +31 -26
  356. package/unwrapper.js +1 -0
  357. package/wgslExtensions.d.ts +3 -5
  358. package/wgslExtensions.js +12 -16
  359. package/_virtual/rolldown_runtime.js +0 -13
  360. package/core/buffer/bufferShorthand.d.ts +0 -50
  361. package/core/buffer/bufferShorthand.js +0 -55
  362. package/core/pipeline/applyPipelineState.js +0 -37
  363. package/core/pipeline/limitsOverflow.js +0 -13
  364. package/package.js +0 -5
  365. package/tgsl/shaderGenerator_members.d.ts +0 -33
  366. package/tgsl/shaderGenerator_members.js +0 -12
package/std/boolean.js CHANGED
@@ -1,332 +1,336 @@
1
- import { isBool, isNumericSchema, isVec, isVecBool, isVecInstance } from "../data/wgslTypes.js";
2
- import { isSnippetNumeric, snip } from "../data/snippet.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
3
  import { bool, f16, f32, i32, u32 } from "../data/numeric.js";
6
- import { vec2b, vec2f, vec2h, vec2i, vec2u, vec3b, vec3f, vec3h, vec3i, vec3u, vec4b, vec4f, vec4h, vec4i, vec4u } from "../data/vector.js";
7
- import { dualImpl } from "../core/function/dualImpl.js";
4
+ import { isSnippetNumeric, snip } from "../data/snippet.js";
5
+ import { vec2b, vec2f, vec2h, vec2i, vec2u, vec3b, vec3f, vec3h, vec3i, vec3u, vec4b, vec4f, vec4h, vec4i, vec4u, } from "../data/vector.js";
8
6
  import { VectorOps } from "../data/vectorOps.js";
9
- import { sub } from "./operators.js";
10
-
11
- //#region src/std/boolean.ts
7
+ import { generalizeBoolFn, generalizeFn } from "../data/generalizeFn.js";
8
+ import { isBool, isVecBool, isVecBoolInstance, } from "../data/wgslTypes.js";
9
+ import { SignatureNotSupportedError } from "../errors.js";
10
+ import { unify } from "../tgsl/conversion.js";
11
+ import { cpuCopy } from "./copy.js";
12
12
  function correspondingBooleanVectorSchema(dataType) {
13
- if (dataType.type.includes("2")) return vec2b;
14
- if (dataType.type.includes("3")) return vec3b;
15
- return vec4b;
13
+ if (dataType.type.includes('2')) {
14
+ return vec2b;
15
+ }
16
+ if (dataType.type.includes('3')) {
17
+ return vec3b;
18
+ }
19
+ return vec4b;
16
20
  }
21
+ // comparison
17
22
  /**
18
- * Checks whether `lhs == rhs` on all components.
19
- * Equivalent to `all(eq(lhs, rhs))`.
20
- * @example
21
- * allEq(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns false
22
- * allEq(vec3u(0, 1, 2), vec3u(0, 1, 2)) // returns true
23
- */
24
- const allEq = dualImpl({
25
- name: "allEq",
26
- signature: (...argTypes) => ({
27
- argTypes,
28
- returnType: bool
29
- }),
30
- normalImpl: (lhs, rhs) => cpuAll(cpuEq(lhs, rhs)),
31
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`all(${lhs} == ${rhs})`
23
+ * Checks whether `lhs == rhs` on all components.
24
+ * Equivalent to `all(eq(lhs, rhs))`.
25
+ * @example
26
+ * allEq(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns false
27
+ * allEq(vec3u(0, 1, 2), vec3u(0, 1, 2)) // returns true
28
+ */
29
+ export const allEq = dualImpl({
30
+ name: 'allEq',
31
+ signature: (...argTypes) => ({ argTypes, returnType: bool }),
32
+ normalImpl: (lhs, rhs) => cpuAll(cpuEq(lhs, rhs)),
33
+ codegenImpl: (_ctx, [lhs, rhs]) => stitch `all(${lhs} == ${rhs})`,
34
+ sideEffects: false,
32
35
  });
33
- const cpuEq = (lhs, rhs) => VectorOps.eq[lhs.kind](lhs, rhs);
36
+ const cpuEq = (lhs, rhs) => generalizeBoolFn((a, b) => a === b, [lhs, rhs]);
34
37
  /**
35
- * Checks **component-wise** whether `lhs == rhs`.
36
- * This function does **not** return `bool`, for that use-case, wrap the result in `all`, or use `allEq`.
37
- * @example
38
- * eq(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns vec2b(true, false)
39
- * eq(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, true, false)
40
- * all(eq(vec4i(4, 3, 2, 1), vec4i(4, 3, 2, 1))) // returns true
41
- * allEq(vec4i(4, 3, 2, 1), vec4i(4, 3, 2, 1)) // returns true
42
- */
43
- const eq = dualImpl({
44
- name: "eq",
45
- signature: (...argTypes) => ({
46
- argTypes,
47
- returnType: correspondingBooleanVectorSchema(argTypes[0])
48
- }),
49
- normalImpl: cpuEq,
50
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} == ${rhs})`
38
+ * Checks **component-wise** whether `lhs == rhs`.
39
+ * This function does **not** return `bool`, for that use-case, wrap the result in `all`, or use `allEq`.
40
+ * @example
41
+ * eq(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns vec2b(true, false)
42
+ * eq(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, true, false)
43
+ * all(eq(vec4i(4, 3, 2, 1), vec4i(4, 3, 2, 1))) // returns true
44
+ * allEq(vec4i(4, 3, 2, 1), vec4i(4, 3, 2, 1)) // returns true
45
+ */
46
+ export const eq = dualImpl({
47
+ name: 'eq',
48
+ signature: (...argTypes) => ({
49
+ argTypes,
50
+ returnType: correspondingBooleanVectorSchema(argTypes[0]),
51
+ }),
52
+ normalImpl: cpuEq,
53
+ codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} == ${rhs})`,
54
+ sideEffects: false,
51
55
  });
52
56
  /**
53
- * Checks **component-wise** whether `lhs != rhs`.
54
- * This function does **not** return `bool`, for that use-case, wrap the result in `any`.
55
- * @example
56
- * ne(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns vec2b(false, true)
57
- * ne(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, false, true)
58
- * any(ne(vec4i(4, 3, 2, 1), vec4i(4, 2, 2, 1))) // returns true
59
- */
60
- const ne = dualImpl({
61
- name: "ne",
62
- signature: (...argTypes) => ({
63
- argTypes,
64
- returnType: correspondingBooleanVectorSchema(argTypes[0])
65
- }),
66
- normalImpl: (lhs, rhs) => cpuNot(cpuEq(lhs, rhs)),
67
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} != ${rhs})`
57
+ * Checks **component-wise** whether `lhs != rhs`.
58
+ * This function does **not** return `bool`, for that use-case, wrap the result in `any`.
59
+ * @example
60
+ * ne(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns vec2b(false, true)
61
+ * ne(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, false, true)
62
+ * any(ne(vec4i(4, 3, 2, 1), vec4i(4, 2, 2, 1))) // returns true
63
+ */
64
+ export const ne = dualImpl({
65
+ name: 'ne',
66
+ signature: (...argTypes) => ({
67
+ argTypes,
68
+ returnType: correspondingBooleanVectorSchema(argTypes[0]),
69
+ }),
70
+ normalImpl: (lhs, rhs) => cpuNot(cpuEq(lhs, rhs)),
71
+ codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} != ${rhs})`,
72
+ sideEffects: false,
68
73
  });
69
- const cpuLt = (lhs, rhs) => VectorOps.lt[lhs.kind](lhs, rhs);
74
+ const cpuLt = (lhs, rhs) => generalizeBoolFn((a, b) => a < b, [lhs, rhs]);
70
75
  /**
71
- * Checks **component-wise** whether `lhs < rhs`.
72
- * This function does **not** return `bool`, for that use-case, wrap the result in `all`.
73
- * @example
74
- * lt(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(false, true)
75
- * lt(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, false, false)
76
- * all(lt(vec4i(1, 2, 3, 4), vec4i(2, 3, 4, 5))) // returns true
77
- */
78
- const lt = dualImpl({
79
- name: "lt",
80
- signature: (...argTypes) => ({
81
- argTypes,
82
- returnType: correspondingBooleanVectorSchema(argTypes[0])
83
- }),
84
- normalImpl: cpuLt,
85
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} < ${rhs})`
76
+ * Checks **component-wise** whether `lhs < rhs`.
77
+ * This function does **not** return `bool`, for that use-case, wrap the result in `all`.
78
+ * @example
79
+ * lt(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(false, true)
80
+ * lt(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, false, false)
81
+ * all(lt(vec4i(1, 2, 3, 4), vec4i(2, 3, 4, 5))) // returns true
82
+ */
83
+ export const lt = dualImpl({
84
+ name: 'lt',
85
+ signature: (...argTypes) => ({
86
+ argTypes,
87
+ returnType: correspondingBooleanVectorSchema(argTypes[0]),
88
+ }),
89
+ normalImpl: cpuLt,
90
+ codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} < ${rhs})`,
91
+ sideEffects: false,
86
92
  });
87
93
  /**
88
- * Checks **component-wise** whether `lhs <= rhs`.
89
- * This function does **not** return `bool`, for that use-case, wrap the result in `all`.
90
- * @example
91
- * le(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(true, true)
92
- * le(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, true, false)
93
- * all(le(vec4i(1, 2, 3, 4), vec4i(2, 3, 3, 5))) // returns true
94
- */
95
- const le = dualImpl({
96
- name: "le",
97
- signature: (...argTypes) => ({
98
- argTypes,
99
- returnType: correspondingBooleanVectorSchema(argTypes[0])
100
- }),
101
- normalImpl: (lhs, rhs) => cpuOr(cpuLt(lhs, rhs), cpuEq(lhs, rhs)),
102
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} <= ${rhs})`
94
+ * Checks **component-wise** whether `lhs <= rhs`.
95
+ * This function does **not** return `bool`, for that use-case, wrap the result in `all`.
96
+ * @example
97
+ * le(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(true, true)
98
+ * le(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, true, false)
99
+ * all(le(vec4i(1, 2, 3, 4), vec4i(2, 3, 3, 5))) // returns true
100
+ */
101
+ export const le = dualImpl({
102
+ name: 'le',
103
+ signature: (...argTypes) => ({
104
+ argTypes,
105
+ returnType: correspondingBooleanVectorSchema(argTypes[0]),
106
+ }),
107
+ normalImpl: (lhs, rhs) => cpuOr(cpuLt(lhs, rhs), cpuEq(lhs, rhs)),
108
+ codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} <= ${rhs})`,
109
+ sideEffects: false,
103
110
  });
104
111
  /**
105
- * Checks **component-wise** whether `lhs > rhs`.
106
- * This function does **not** return `bool`, for that use-case, wrap the result in `all`.
107
- * @example
108
- * gt(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(false, false)
109
- * gt(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, false, true)
110
- * all(gt(vec4i(2, 3, 4, 5), vec4i(1, 2, 3, 4))) // returns true
111
- */
112
- const gt = dualImpl({
113
- name: "gt",
114
- signature: (...argTypes) => ({
115
- argTypes,
116
- returnType: correspondingBooleanVectorSchema(argTypes[0])
117
- }),
118
- normalImpl: (lhs, rhs) => cpuAnd(cpuNot(cpuLt(lhs, rhs)), cpuNot(cpuEq(lhs, rhs))),
119
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} > ${rhs})`
112
+ * Checks **component-wise** whether `lhs > rhs`.
113
+ * This function does **not** return `bool`, for that use-case, wrap the result in `all`.
114
+ * @example
115
+ * gt(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(false, false)
116
+ * gt(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, false, true)
117
+ * all(gt(vec4i(2, 3, 4, 5), vec4i(1, 2, 3, 4))) // returns true
118
+ */
119
+ export const gt = dualImpl({
120
+ name: 'gt',
121
+ signature: (...argTypes) => ({
122
+ argTypes,
123
+ returnType: correspondingBooleanVectorSchema(argTypes[0]),
124
+ }),
125
+ normalImpl: (lhs, rhs) => cpuAnd(cpuNot(cpuLt(lhs, rhs)), cpuNot(cpuEq(lhs, rhs))),
126
+ codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} > ${rhs})`,
127
+ sideEffects: false,
120
128
  });
121
129
  /**
122
- * Checks **component-wise** whether `lhs >= rhs`.
123
- * This function does **not** return `bool`, for that use-case, wrap the result in `all`.
124
- * @example
125
- * ge(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(true, false)
126
- * ge(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, true, true)
127
- * all(ge(vec4i(2, 2, 4, 5), vec4i(1, 2, 3, 4))) // returns true
128
- */
129
- const ge = dualImpl({
130
- name: "ge",
131
- signature: (...argTypes) => ({
132
- argTypes,
133
- returnType: correspondingBooleanVectorSchema(argTypes[0])
134
- }),
135
- normalImpl: (lhs, rhs) => cpuNot(cpuLt(lhs, rhs)),
136
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} >= ${rhs})`
130
+ * Checks **component-wise** whether `lhs >= rhs`.
131
+ * This function does **not** return `bool`, for that use-case, wrap the result in `all`.
132
+ * @example
133
+ * ge(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(true, false)
134
+ * ge(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, true, true)
135
+ * all(ge(vec4i(2, 2, 4, 5), vec4i(1, 2, 3, 4))) // returns true
136
+ */
137
+ export const ge = dualImpl({
138
+ name: 'ge',
139
+ signature: (...argTypes) => ({
140
+ argTypes: argTypes,
141
+ returnType: correspondingBooleanVectorSchema(argTypes[0]),
142
+ }),
143
+ normalImpl: (lhs, rhs) => cpuNot(cpuLt(lhs, rhs)),
144
+ codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} >= ${rhs})`,
145
+ sideEffects: false,
137
146
  });
138
147
  function cpuNot(value) {
139
- if (typeof value === "number" && isNaN(value)) return false;
140
- if (isVecInstance(value)) {
141
- if (value.length === 2) return vec2b(cpuNot(value.x), cpuNot(value.y));
142
- if (value.length === 3) return vec3b(cpuNot(value.x), cpuNot(value.y), cpuNot(value.z));
143
- if (value.length === 4) return vec4b(cpuNot(value.x), cpuNot(value.y), cpuNot(value.z), cpuNot(value.w));
144
- }
145
- return !value;
148
+ if (typeof value === 'boolean') {
149
+ return !value;
150
+ }
151
+ if (!isVecBoolInstance(value)) {
152
+ throw new Error(`'std.not' requires a boolean or boolean vector.`);
153
+ }
154
+ switch (value.length) {
155
+ case 2:
156
+ return vec2b(cpuNot(value.x), cpuNot(value.y));
157
+ case 3:
158
+ return vec3b(cpuNot(value.x), cpuNot(value.y), cpuNot(value.z));
159
+ case 4:
160
+ return vec4b(cpuNot(value.x), cpuNot(value.y), cpuNot(value.z), cpuNot(value.w));
161
+ }
146
162
  }
147
163
  /**
148
- * Returns the logical negation of the given value.
149
- * For scalars (bool, number), returns `!value`.
150
- * For boolean vectors, returns **component-wise** `!value`.
151
- * For numeric vectors, returns a boolean vector with component-wise truthiness negation.
152
- * For all other types, returns the truthiness negation (in WGSL, this applies only if the value is known at compile-time).
153
- * @example
154
- * not(true) // returns false
155
- * not(-1) // returns false
156
- * not(0) // returns true
157
- * not(vec3b(true, true, false)) // returns vec3b(false, false, true)
158
- * not(vec3f(1.0, 0.0, -1.0)) // returns vec3b(false, true, false)
159
- * not({a: 1882}) // returns false
160
- * not(NaN) // returns false **as in WGSL**
161
- */
162
- const not = dualImpl({
163
- name: "not",
164
- signature: (arg) => {
165
- const returnType = isVec(arg) ? correspondingBooleanVectorSchema(arg) : bool;
166
- return {
167
- argTypes: [arg],
168
- returnType
169
- };
170
- },
171
- normalImpl: cpuNot,
172
- codegenImpl: (_ctx, [arg]) => {
173
- const { dataType } = arg;
174
- if (isBool(dataType)) return stitch`!${arg}`;
175
- if (isNumericSchema(dataType)) return stitch`!bool(${arg})`;
176
- if (isVecBool(dataType)) return stitch`!(${arg})`;
177
- if (isVec(dataType)) return stitch`!(${`vec${dataType.componentCount}<bool>`}(${arg}))`;
178
- return "false";
179
- }
164
+ * Returns the logical negation of the given value.
165
+ * For booleans returns `!value`.
166
+ * For boolean vectors, returns **component-wise** `!value`.
167
+ * @example
168
+ * not(true) // returns false
169
+ * not(vec3b(true, true, false)) // returns vec3b(false, false, true)
170
+ */
171
+ export const not = dualImpl({
172
+ name: 'not',
173
+ signature: (arg) => {
174
+ if (!isBool(arg) && !isVecBool(arg)) {
175
+ throw new SignatureNotSupportedError([arg], [bool, vec2b, vec3b, vec4b]);
176
+ }
177
+ return {
178
+ argTypes: [arg],
179
+ returnType: arg,
180
+ };
181
+ },
182
+ normalImpl: cpuNot,
183
+ codegenImpl: (_ctx, [arg]) => stitch `!(${arg})`,
184
+ sideEffects: false,
180
185
  });
181
- const cpuOr = (lhs, rhs) => VectorOps.or[lhs.kind](lhs, rhs);
186
+ const cpuOr = (lhs, rhs) => generalizeBoolFn((a, b) => a || b, [lhs, rhs]);
182
187
  /**
183
- * Returns **component-wise** logical `or` result.
184
- * @example
185
- * or(vec2b(false, true), vec2b(false, false)) // returns vec2b(false, true)
186
- * or(vec3b(true, true, false), vec3b(false, true, false)) // returns vec3b(true, true, false)
187
- */
188
- const or = dualImpl({
189
- name: "or",
190
- signature: (...argTypes) => ({
191
- argTypes,
192
- returnType: argTypes[0]
193
- }),
194
- normalImpl: cpuOr,
195
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} | ${rhs})`
188
+ * Returns **component-wise** logical `or` result.
189
+ * @example
190
+ * or(vec2b(false, true), vec2b(false, false)) // returns vec2b(false, true)
191
+ * or(vec3b(true, true, false), vec3b(false, true, false)) // returns vec3b(true, true, false)
192
+ */
193
+ export const or = dualImpl({
194
+ name: 'or',
195
+ signature: (...argTypes) => ({ argTypes, returnType: argTypes[0] }),
196
+ normalImpl: cpuOr,
197
+ codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} | ${rhs})`,
198
+ sideEffects: false,
196
199
  });
197
200
  const cpuAnd = (lhs, rhs) => cpuNot(cpuOr(cpuNot(lhs), cpuNot(rhs)));
198
201
  /**
199
- * Returns **component-wise** logical `and` result.
200
- * @example
201
- * and(vec2b(false, true), vec2b(true, true)) // returns vec2b(false, true)
202
- * and(vec3b(true, true, false), vec3b(false, true, false)) // returns vec3b(false, true, false)
203
- */
204
- const and = dualImpl({
205
- name: "and",
206
- signature: (...argTypes) => ({
207
- argTypes,
208
- returnType: argTypes[0]
209
- }),
210
- normalImpl: cpuAnd,
211
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} & ${rhs})`
202
+ * Returns **component-wise** logical `and` result.
203
+ * @example
204
+ * and(vec2b(false, true), vec2b(true, true)) // returns vec2b(false, true)
205
+ * and(vec3b(true, true, false), vec3b(false, true, false)) // returns vec3b(false, true, false)
206
+ */
207
+ export const and = dualImpl({
208
+ name: 'and',
209
+ signature: (...argTypes) => ({ argTypes, returnType: argTypes[0] }),
210
+ normalImpl: cpuAnd,
211
+ codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} & ${rhs})`,
212
+ sideEffects: false,
212
213
  });
214
+ // logical aggregation
213
215
  const cpuAll = (value) => VectorOps.all[value.kind](value);
214
216
  /**
215
- * Returns `true` if each component of `value` is true.
216
- * @example
217
- * all(vec2b(false, true)) // returns false
218
- * all(vec3b(true, true, true)) // returns true
219
- */
220
- const all = dualImpl({
221
- name: "all",
222
- signature: (...argTypes) => ({
223
- argTypes,
224
- returnType: bool
225
- }),
226
- normalImpl: cpuAll,
227
- codegenImpl: (_ctx, [value]) => stitch`all(${value})`
217
+ * Returns `true` if each component of `value` is true.
218
+ * @example
219
+ * all(vec2b(false, true)) // returns false
220
+ * all(vec3b(true, true, true)) // returns true
221
+ */
222
+ export const all = dualImpl({
223
+ name: 'all',
224
+ signature: (...argTypes) => ({ argTypes, returnType: bool }),
225
+ normalImpl: cpuAll,
226
+ codegenImpl: (_ctx, [value]) => stitch `all(${value})`,
227
+ sideEffects: false,
228
228
  });
229
229
  /**
230
- * Returns `true` if any component of `value` is true.
231
- * @example
232
- * any(vec2b(false, true)) // returns true
233
- * any(vec3b(false, false, false)) // returns false
234
- */
235
- const any = dualImpl({
236
- name: "any",
237
- signature: (...argTypes) => ({
238
- argTypes,
239
- returnType: bool
240
- }),
241
- normalImpl: (value) => !cpuAll(cpuNot(value)),
242
- codegenImpl: (_ctx, [arg]) => stitch`any(${arg})`
230
+ * Returns `true` if any component of `value` is true.
231
+ * @example
232
+ * any(vec2b(false, true)) // returns true
233
+ * any(vec3b(false, false, false)) // returns false
234
+ */
235
+ export const any = dualImpl({
236
+ name: 'any',
237
+ signature: (...argTypes) => ({ argTypes, returnType: bool }),
238
+ normalImpl: (value) => !cpuAll(cpuNot(value)),
239
+ codegenImpl: (_ctx, [arg]) => stitch `any(${arg})`,
240
+ sideEffects: false,
243
241
  });
242
+ // other
244
243
  /**
245
- * Checks whether the given elements differ by at most the `precision` value.
246
- * Checks all elements of `lhs` and `rhs` if arguments are vectors.
247
- * @example
248
- * isCloseTo(0, 0.1) // returns false
249
- * isCloseTo(vec3f(0, 0, 0), vec3f(0.002, -0.009, 0)) // returns true
250
- *
251
- * @param {number} precision argument that specifies the maximum allowed difference, 0.01 by default.
252
- */
253
- const isCloseTo = dualImpl({
254
- name: "isCloseTo",
255
- signature: (...args) => ({
256
- argTypes: args,
257
- returnType: bool
258
- }),
259
- normalImpl: (lhs, rhs, precision = .01) => {
260
- if (typeof lhs === "number" && typeof rhs === "number") return Math.abs(lhs - rhs) < precision;
261
- if (isVecInstance(lhs) && isVecInstance(rhs)) return VectorOps.isCloseToZero[lhs.kind](sub(lhs, rhs), precision);
262
- return false;
263
- },
264
- codegenImpl: (_ctx, [lhs, rhs, precision = snip(.01, f32, "constant")]) => {
265
- if (isSnippetNumeric(lhs) && isSnippetNumeric(rhs)) return stitch`(abs(f32(${lhs}) - f32(${rhs})) <= ${precision})`;
266
- if (!isSnippetNumeric(lhs) && !isSnippetNumeric(rhs)) return stitch`all(abs(${lhs} - ${rhs}) <= (${lhs} - ${lhs}) + ${precision})`;
267
- return "false";
268
- }
244
+ * Checks whether the given elements differ by at most the `precision` value.
245
+ * Checks all elements of `lhs` and `rhs` if arguments are vectors.
246
+ * @example
247
+ * isCloseTo(0, 0.1) // returns false
248
+ * isCloseTo(vec3f(0, 0, 0), vec3f(0.002, -0.009, 0)) // returns true
249
+ *
250
+ * @param {number} precision argument that specifies the maximum allowed difference, 0.01 by default.
251
+ */
252
+ export const isCloseTo = dualImpl({
253
+ name: 'isCloseTo',
254
+ signature: (...args) => ({
255
+ argTypes: args,
256
+ returnType: bool,
257
+ }),
258
+ // CPU implementation
259
+ normalImpl: (lhs, rhs, precision = 0.01) => {
260
+ const componentResult = generalizeBoolFn((lhs, rhs) => Math.abs(lhs - rhs) < precision, [lhs, rhs]);
261
+ return typeof componentResult === 'boolean' ? componentResult : all(componentResult);
262
+ },
263
+ // GPU implementation
264
+ codegenImpl: (_ctx, [lhs, rhs, precision = snip(0.01, f32, /* origin */ 'constant', false)]) => {
265
+ if (isSnippetNumeric(lhs) && isSnippetNumeric(rhs)) {
266
+ return stitch `(abs(f32(${lhs}) - f32(${rhs})) <= ${precision})`;
267
+ }
268
+ if (!isSnippetNumeric(lhs) && !isSnippetNumeric(rhs)) {
269
+ // https://www.w3.org/TR/WGSL/#vector-multi-component:~:text=Binary%20arithmetic%20expressions%20with%20mixed%20scalar%20and%20vector%20operands
270
+ // (a-a)+prec creates a vector of a.length elements, all equal to prec
271
+ return stitch `all(abs(${lhs} - ${rhs}) <= (${lhs} - ${lhs}) + ${precision})`;
272
+ }
273
+ return 'false';
274
+ },
275
+ sideEffects: false,
269
276
  });
270
277
  function cpuSelect(f, t, cond) {
271
- if (typeof cond === "boolean") return cond ? t : f;
272
- return VectorOps.select[f.kind](f, t, cond);
278
+ if (typeof cond === 'boolean') {
279
+ return cpuCopy(cond ? t : f);
280
+ }
281
+ // generalizeFn will handle this fine, it just has no mixed type overload.
282
+ return generalizeFn((f, t, c) => (c ? t : f), [f, t, cond]);
273
283
  }
274
- const validSelectBranchTypes = [
275
- f32,
276
- f16,
277
- i32,
278
- u32,
279
- bool,
280
- vec2f,
281
- vec3f,
282
- vec4f,
283
- vec2h,
284
- vec3h,
285
- vec4h,
286
- vec2i,
287
- vec3i,
288
- vec4i,
289
- vec2u,
290
- vec3u,
291
- vec4u,
292
- vec2b,
293
- vec3b,
294
- vec4b
284
+ export const validSelectBranchTypes = [
285
+ f32,
286
+ f16,
287
+ i32,
288
+ u32,
289
+ bool,
290
+ vec2f,
291
+ vec3f,
292
+ vec4f,
293
+ vec2h,
294
+ vec3h,
295
+ vec4h,
296
+ vec2i,
297
+ vec3i,
298
+ vec4i,
299
+ vec2u,
300
+ vec3u,
301
+ vec4u,
302
+ vec2b,
303
+ vec3b,
304
+ vec4b,
295
305
  ];
296
306
  /**
297
- * Returns `t` if `cond` is `true`, and `f` otherwise.
298
- * Component-wise if `cond` is a vector.
299
- * @example
300
- * select(1, 2, false) // returns 1
301
- * select(1, 2, true) // returns 2
302
- * select(vec2i(1, 2), vec2i(3, 4), true) // returns vec2i(3, 4)
303
- * select(vec2i(1, 2), vec2i(3, 4), vec2b(false, true)) // returns vec2i(1, 4)
304
- */
305
- const select = dualImpl({
306
- name: "select",
307
- signature: (f, t, cond) => {
308
- const [uf, ut] = unify([f, t], validSelectBranchTypes) ?? [f, t];
309
- return {
310
- argTypes: [
311
- uf,
312
- ut,
313
- cond
314
- ],
315
- returnType: uf
316
- };
317
- },
318
- normalImpl: cpuSelect,
319
- codegenImpl: (ctx, [f, t, cond]) => {
320
- const result = stitch`select(${f}, ${t}, ${cond})`;
321
- if (!validSelectBranchTypes.includes(f.dataType) || !validSelectBranchTypes.includes(t.dataType)) throw new Error(`'${result}' is invalid, std.select requires both branches to be either scalars or vectors.`);
322
- if (f.dataType !== t.dataType) {
323
- const fStr = ctx.resolve(f.dataType);
324
- const tStr = ctx.resolve(t.dataType);
325
- throw new Error(`'${result}' is invalid, std.select requires both branches to be the same type, got [${fStr.value}, ${tStr.value}].`);
326
- }
327
- return result;
328
- }
307
+ * Returns `t` if `cond` is `true`, and `f` otherwise.
308
+ * Component-wise if `cond` is a vector.
309
+ * @example
310
+ * select(1, 2, false) // returns 1
311
+ * select(1, 2, true) // returns 2
312
+ * select(vec2i(1, 2), vec2i(3, 4), true) // returns vec2i(3, 4)
313
+ * select(vec2i(1, 2), vec2i(3, 4), vec2b(false, true)) // returns vec2i(1, 4)
314
+ */
315
+ export const select = dualImpl({
316
+ name: 'select',
317
+ signature: (f, t, cond) => {
318
+ const [uf, ut] = unify([f, t], validSelectBranchTypes) ?? [f, t];
319
+ return { argTypes: [uf, ut, cond], returnType: uf };
320
+ },
321
+ normalImpl: cpuSelect,
322
+ codegenImpl: (ctx, [f, t, cond]) => {
323
+ const result = ctx.gen.emitCall('select', [], [f, t, cond]);
324
+ if (!validSelectBranchTypes.includes(f.dataType) ||
325
+ !validSelectBranchTypes.includes(t.dataType)) {
326
+ throw new Error(`'${result}' is invalid, std.select requires both branches to be either scalars or vectors.`);
327
+ }
328
+ if (f.dataType !== t.dataType) {
329
+ const fStr = ctx.resolve(f.dataType);
330
+ const tStr = ctx.resolve(t.dataType);
331
+ throw new Error(`'${result}' is invalid, std.select requires both branches to be the same type, got [${fStr.value}, ${tStr.value}].`);
332
+ }
333
+ return result;
334
+ },
335
+ sideEffects: false,
329
336
  });
330
-
331
- //#endregion
332
- export { all, allEq, and, any, eq, ge, gt, isCloseTo, le, lt, ne, not, or, select, validSelectBranchTypes };
package/std/copy.d.ts CHANGED
@@ -1,7 +1,2 @@
1
- import { DualFn } from "../types.js";
2
-
3
- //#region src/std/copy.d.ts
4
- declare function cpuCopy<T>(e: T): T;
5
- declare const copy: DualFn<typeof cpuCopy>;
6
- //#endregion
7
- export { copy };
1
+ export declare function cpuCopy<T>(e: T): T;
2
+ export declare const copy: import("../types.ts").DualFn<typeof cpuCopy>;