@flighthq/effects-wgpu 0.1.0 → 0.2.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 (256) hide show
  1. package/dist/index.d.ts +17 -10
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +17 -10
  4. package/dist/index.js.map +1 -1
  5. package/dist/wgpuBevelEffect.d.ts +4 -0
  6. package/dist/wgpuBevelEffect.d.ts.map +1 -0
  7. package/dist/wgpuBevelEffect.js +122 -0
  8. package/dist/wgpuBevelEffect.js.map +1 -0
  9. package/dist/wgpuBloomEffect.d.ts.map +1 -1
  10. package/dist/wgpuBloomEffect.js +9 -8
  11. package/dist/wgpuBloomEffect.js.map +1 -1
  12. package/dist/wgpuBlurEffect.d.ts +8 -0
  13. package/dist/wgpuBlurEffect.d.ts.map +1 -0
  14. package/dist/wgpuBlurEffect.js +70 -0
  15. package/dist/wgpuBlurEffect.js.map +1 -0
  16. package/dist/wgpuBokehDepthOfFieldEffect.d.ts.map +1 -1
  17. package/dist/wgpuBokehDepthOfFieldEffect.js +2 -2
  18. package/dist/wgpuBokehDepthOfFieldEffect.js.map +1 -1
  19. package/dist/wgpuCameraMotionBlurEffect.d.ts.map +1 -1
  20. package/dist/wgpuCameraMotionBlurEffect.js +2 -2
  21. package/dist/wgpuCameraMotionBlurEffect.js.map +1 -1
  22. package/dist/wgpuChromaticAberrationEffect.d.ts.map +1 -1
  23. package/dist/wgpuChromaticAberrationEffect.js +2 -2
  24. package/dist/wgpuChromaticAberrationEffect.js.map +1 -1
  25. package/dist/wgpuColorLutPass.d.ts +3 -0
  26. package/dist/wgpuColorLutPass.d.ts.map +1 -0
  27. package/dist/wgpuColorLutPass.js +144 -0
  28. package/dist/wgpuColorLutPass.js.map +1 -0
  29. package/dist/wgpuColorMatrixPass.d.ts +3 -0
  30. package/dist/wgpuColorMatrixPass.d.ts.map +1 -0
  31. package/dist/wgpuColorMatrixPass.js +51 -0
  32. package/dist/wgpuColorMatrixPass.js.map +1 -0
  33. package/dist/wgpuConvolutionEffect.d.ts +5 -0
  34. package/dist/wgpuConvolutionEffect.d.ts.map +1 -0
  35. package/dist/wgpuConvolutionEffect.js +108 -0
  36. package/dist/wgpuConvolutionEffect.js.map +1 -0
  37. package/dist/wgpuCrtEffect.d.ts.map +1 -1
  38. package/dist/wgpuCrtEffect.js +2 -2
  39. package/dist/wgpuCrtEffect.js.map +1 -1
  40. package/dist/wgpuDirectionalBlurEffect.d.ts.map +1 -1
  41. package/dist/wgpuDirectionalBlurEffect.js +2 -2
  42. package/dist/wgpuDirectionalBlurEffect.js.map +1 -1
  43. package/dist/wgpuDisplacementEffect.d.ts.map +1 -1
  44. package/dist/wgpuDisplacementEffect.js +2 -2
  45. package/dist/wgpuDisplacementEffect.js.map +1 -1
  46. package/dist/wgpuDitherEffect.d.ts.map +1 -1
  47. package/dist/wgpuDitherEffect.js +2 -2
  48. package/dist/wgpuDitherEffect.js.map +1 -1
  49. package/dist/wgpuDropShadowEffect.d.ts +4 -0
  50. package/dist/wgpuDropShadowEffect.d.ts.map +1 -0
  51. package/dist/wgpuDropShadowEffect.js +49 -0
  52. package/dist/wgpuDropShadowEffect.js.map +1 -0
  53. package/dist/wgpuEffectBlitShader.d.ts +15 -0
  54. package/dist/wgpuEffectBlitShader.d.ts.map +1 -0
  55. package/dist/wgpuEffectBlitShader.js +71 -0
  56. package/dist/wgpuEffectBlitShader.js.map +1 -0
  57. package/dist/wgpuEffectBoxBlur.d.ts +14 -0
  58. package/dist/wgpuEffectBoxBlur.d.ts.map +1 -0
  59. package/dist/wgpuEffectBoxBlur.js +81 -0
  60. package/dist/wgpuEffectBoxBlur.js.map +1 -0
  61. package/dist/wgpuEffectGradientRamp.d.ts +17 -0
  62. package/dist/wgpuEffectGradientRamp.d.ts.map +1 -0
  63. package/dist/wgpuEffectGradientRamp.js +89 -0
  64. package/dist/wgpuEffectGradientRamp.js.map +1 -0
  65. package/dist/wgpuEffectPass.d.ts +41 -0
  66. package/dist/wgpuEffectPass.d.ts.map +1 -0
  67. package/dist/wgpuEffectPass.js +259 -0
  68. package/dist/wgpuEffectPass.js.map +1 -0
  69. package/dist/wgpuEffectProgramCache.d.ts +2 -2
  70. package/dist/wgpuEffectProgramCache.d.ts.map +1 -1
  71. package/dist/wgpuEffectProgramCache.js +5 -5
  72. package/dist/wgpuEffectProgramCache.js.map +1 -1
  73. package/dist/wgpuEffectTintShader.d.ts +8 -0
  74. package/dist/wgpuEffectTintShader.d.ts.map +1 -0
  75. package/dist/wgpuEffectTintShader.js +109 -0
  76. package/dist/wgpuEffectTintShader.js.map +1 -0
  77. package/dist/wgpuFilmGrainEffect.d.ts.map +1 -1
  78. package/dist/wgpuFilmGrainEffect.js +2 -2
  79. package/dist/wgpuFilmGrainEffect.js.map +1 -1
  80. package/dist/wgpuFxaaEffect.d.ts.map +1 -1
  81. package/dist/wgpuFxaaEffect.js +2 -2
  82. package/dist/wgpuFxaaEffect.js.map +1 -1
  83. package/dist/wgpuGlitchEffect.d.ts.map +1 -1
  84. package/dist/wgpuGlitchEffect.js +2 -2
  85. package/dist/wgpuGlitchEffect.js.map +1 -1
  86. package/dist/wgpuGodRaysEffect.d.ts.map +1 -1
  87. package/dist/wgpuGodRaysEffect.js +2 -2
  88. package/dist/wgpuGodRaysEffect.js.map +1 -1
  89. package/dist/wgpuGradientBevelEffect.d.ts +4 -0
  90. package/dist/wgpuGradientBevelEffect.d.ts.map +1 -0
  91. package/dist/wgpuGradientBevelEffect.js +189 -0
  92. package/dist/wgpuGradientBevelEffect.js.map +1 -0
  93. package/dist/wgpuGradientGlowEffect.d.ts +4 -0
  94. package/dist/wgpuGradientGlowEffect.d.ts.map +1 -0
  95. package/dist/wgpuGradientGlowEffect.js +97 -0
  96. package/dist/wgpuGradientGlowEffect.js.map +1 -0
  97. package/dist/wgpuHalftoneEffect.d.ts.map +1 -1
  98. package/dist/wgpuHalftoneEffect.js +2 -2
  99. package/dist/wgpuHalftoneEffect.js.map +1 -1
  100. package/dist/wgpuInnerGlowEffect.d.ts +4 -0
  101. package/dist/wgpuInnerGlowEffect.d.ts.map +1 -0
  102. package/dist/wgpuInnerGlowEffect.js +37 -0
  103. package/dist/wgpuInnerGlowEffect.js.map +1 -0
  104. package/dist/wgpuInnerShadowEffect.d.ts +4 -0
  105. package/dist/wgpuInnerShadowEffect.d.ts.map +1 -0
  106. package/dist/wgpuInnerShadowEffect.js +42 -0
  107. package/dist/wgpuInnerShadowEffect.js.map +1 -0
  108. package/dist/wgpuKuwaharaEffect.d.ts.map +1 -1
  109. package/dist/wgpuKuwaharaEffect.js +2 -2
  110. package/dist/wgpuKuwaharaEffect.js.map +1 -1
  111. package/dist/wgpuLensDirtEffect.d.ts.map +1 -1
  112. package/dist/wgpuLensDirtEffect.js +2 -2
  113. package/dist/wgpuLensDirtEffect.js.map +1 -1
  114. package/dist/wgpuLensDistortionEffect.d.ts.map +1 -1
  115. package/dist/wgpuLensDistortionEffect.js +2 -2
  116. package/dist/wgpuLensDistortionEffect.js.map +1 -1
  117. package/dist/wgpuLensFlareEffect.d.ts.map +1 -1
  118. package/dist/wgpuLensFlareEffect.js +2 -2
  119. package/dist/wgpuLensFlareEffect.js.map +1 -1
  120. package/dist/wgpuMedianEffect.d.ts +5 -0
  121. package/dist/wgpuMedianEffect.d.ts.map +1 -0
  122. package/dist/wgpuMedianEffect.js +74 -0
  123. package/dist/wgpuMedianEffect.js.map +1 -0
  124. package/dist/wgpuMotionBlurEffect.d.ts.map +1 -1
  125. package/dist/wgpuMotionBlurEffect.js +6 -7
  126. package/dist/wgpuMotionBlurEffect.js.map +1 -1
  127. package/dist/wgpuOuterGlowEffect.d.ts +4 -0
  128. package/dist/wgpuOuterGlowEffect.d.ts.map +1 -0
  129. package/dist/wgpuOuterGlowEffect.js +43 -0
  130. package/dist/wgpuOuterGlowEffect.js.map +1 -0
  131. package/dist/wgpuOutlineEffect.d.ts.map +1 -1
  132. package/dist/wgpuOutlineEffect.js +2 -2
  133. package/dist/wgpuOutlineEffect.js.map +1 -1
  134. package/dist/wgpuPixelateEffect.d.ts.map +1 -1
  135. package/dist/wgpuPixelateEffect.js +2 -2
  136. package/dist/wgpuPixelateEffect.js.map +1 -1
  137. package/dist/wgpuPosterizeEffect.d.ts.map +1 -1
  138. package/dist/wgpuPosterizeEffect.js +2 -2
  139. package/dist/wgpuPosterizeEffect.js.map +1 -1
  140. package/dist/wgpuRadialBlurEffect.d.ts.map +1 -1
  141. package/dist/wgpuRadialBlurEffect.js +2 -2
  142. package/dist/wgpuRadialBlurEffect.js.map +1 -1
  143. package/dist/wgpuRenderEffectPipeline.d.ts +2 -2
  144. package/dist/wgpuRenderEffectPipeline.d.ts.map +1 -1
  145. package/dist/wgpuRenderEffectPipeline.js +59 -9
  146. package/dist/wgpuRenderEffectPipeline.js.map +1 -1
  147. package/dist/wgpuRenderEffectRegistrants.d.ts +1 -0
  148. package/dist/wgpuRenderEffectRegistrants.d.ts.map +1 -1
  149. package/dist/wgpuRenderEffectRegistrants.js +39 -28
  150. package/dist/wgpuRenderEffectRegistrants.js.map +1 -1
  151. package/dist/wgpuScanlinesEffect.d.ts.map +1 -1
  152. package/dist/wgpuScanlinesEffect.js +2 -2
  153. package/dist/wgpuScanlinesEffect.js.map +1 -1
  154. package/dist/wgpuScreenSpaceFogEffect.d.ts.map +1 -1
  155. package/dist/wgpuScreenSpaceFogEffect.js +2 -2
  156. package/dist/wgpuScreenSpaceFogEffect.js.map +1 -1
  157. package/dist/wgpuSharpenEffect.d.ts.map +1 -1
  158. package/dist/wgpuSharpenEffect.js +2 -2
  159. package/dist/wgpuSharpenEffect.js.map +1 -1
  160. package/dist/wgpuSketchEffect.d.ts.map +1 -1
  161. package/dist/wgpuSketchEffect.js +2 -2
  162. package/dist/wgpuSketchEffect.js.map +1 -1
  163. package/dist/wgpuSmaaEffect.d.ts.map +1 -1
  164. package/dist/wgpuSmaaEffect.js +2 -2
  165. package/dist/wgpuSmaaEffect.js.map +1 -1
  166. package/dist/wgpuSsaoEffect.d.ts.map +1 -1
  167. package/dist/wgpuSsaoEffect.js +2 -2
  168. package/dist/wgpuSsaoEffect.js.map +1 -1
  169. package/dist/wgpuSsrEffect.d.ts.map +1 -1
  170. package/dist/wgpuSsrEffect.js +2 -2
  171. package/dist/wgpuSsrEffect.js.map +1 -1
  172. package/dist/wgpuTaaEffect.d.ts.map +1 -1
  173. package/dist/wgpuTaaEffect.js +2 -2
  174. package/dist/wgpuTaaEffect.js.map +1 -1
  175. package/dist/wgpuTiltShiftEffect.d.ts.map +1 -1
  176. package/dist/wgpuTiltShiftEffect.js +2 -2
  177. package/dist/wgpuTiltShiftEffect.js.map +1 -1
  178. package/dist/wgpuToneMapEffect.d.ts.map +1 -1
  179. package/dist/wgpuToneMapEffect.js +2 -2
  180. package/dist/wgpuToneMapEffect.js.map +1 -1
  181. package/dist/wgpuVignetteEffect.d.ts.map +1 -1
  182. package/dist/wgpuVignetteEffect.js +2 -2
  183. package/dist/wgpuVignetteEffect.js.map +1 -1
  184. package/dist/wgpuWhiteBalanceEffect.d.ts.map +1 -1
  185. package/dist/wgpuWhiteBalanceEffect.js +2 -2
  186. package/dist/wgpuWhiteBalanceEffect.js.map +1 -1
  187. package/package.json +11 -7
  188. package/src/wgpuBevelEffect.test.ts +13 -0
  189. package/src/wgpuBlurEffect.test.ts +19 -0
  190. package/src/wgpuColorLutPass.test.ts +7 -0
  191. package/src/wgpuColorMatrixPass.test.ts +7 -0
  192. package/src/wgpuConvolutionEffect.test.ts +13 -0
  193. package/src/wgpuDropShadowEffect.test.ts +13 -0
  194. package/src/wgpuEffectBlitShader.test.ts +13 -0
  195. package/src/wgpuEffectBoxBlur.test.ts +7 -0
  196. package/src/wgpuEffectGradientRamp.test.ts +7 -0
  197. package/src/wgpuEffectPass.test.ts +51 -0
  198. package/src/wgpuEffectTintShader.test.ts +23 -0
  199. package/src/wgpuGradientBevelEffect.test.ts +13 -0
  200. package/src/wgpuGradientGlowEffect.test.ts +13 -0
  201. package/src/wgpuInnerGlowEffect.test.ts +13 -0
  202. package/src/wgpuInnerShadowEffect.test.ts +13 -0
  203. package/src/wgpuMedianEffect.test.ts +13 -0
  204. package/src/wgpuOuterGlowEffect.test.ts +13 -0
  205. package/src/wgpuRenderEffectPipeline.test.ts +2 -0
  206. package/src/wgpuRenderEffectRegistrants.test.ts +25 -14
  207. package/dist/wgpuBrightnessContrastEffect.d.ts +0 -4
  208. package/dist/wgpuBrightnessContrastEffect.d.ts.map +0 -1
  209. package/dist/wgpuBrightnessContrastEffect.js +0 -29
  210. package/dist/wgpuBrightnessContrastEffect.js.map +0 -1
  211. package/dist/wgpuChannelMixerEffect.d.ts +0 -4
  212. package/dist/wgpuChannelMixerEffect.d.ts.map +0 -1
  213. package/dist/wgpuChannelMixerEffect.js +0 -34
  214. package/dist/wgpuChannelMixerEffect.js.map +0 -1
  215. package/dist/wgpuColorGradeEffect.d.ts +0 -4
  216. package/dist/wgpuColorGradeEffect.d.ts.map +0 -1
  217. package/dist/wgpuColorGradeEffect.js +0 -52
  218. package/dist/wgpuColorGradeEffect.js.map +0 -1
  219. package/dist/wgpuExposureEffect.d.ts +0 -4
  220. package/dist/wgpuExposureEffect.d.ts.map +0 -1
  221. package/dist/wgpuExposureEffect.js +0 -28
  222. package/dist/wgpuExposureEffect.js.map +0 -1
  223. package/dist/wgpuGrayscaleEffect.d.ts +0 -4
  224. package/dist/wgpuGrayscaleEffect.d.ts.map +0 -1
  225. package/dist/wgpuGrayscaleEffect.js +0 -27
  226. package/dist/wgpuGrayscaleEffect.js.map +0 -1
  227. package/dist/wgpuHueSaturationEffect.d.ts +0 -4
  228. package/dist/wgpuHueSaturationEffect.d.ts.map +0 -1
  229. package/dist/wgpuHueSaturationEffect.js +0 -75
  230. package/dist/wgpuHueSaturationEffect.js.map +0 -1
  231. package/dist/wgpuInvertEffect.d.ts +0 -4
  232. package/dist/wgpuInvertEffect.d.ts.map +0 -1
  233. package/dist/wgpuInvertEffect.js +0 -26
  234. package/dist/wgpuInvertEffect.js.map +0 -1
  235. package/dist/wgpuLiftGammaGainEffect.d.ts +0 -4
  236. package/dist/wgpuLiftGammaGainEffect.d.ts.map +0 -1
  237. package/dist/wgpuLiftGammaGainEffect.js +0 -51
  238. package/dist/wgpuLiftGammaGainEffect.js.map +0 -1
  239. package/dist/wgpuLookupTableGradeEffect.d.ts +0 -4
  240. package/dist/wgpuLookupTableGradeEffect.d.ts.map +0 -1
  241. package/dist/wgpuLookupTableGradeEffect.js +0 -30
  242. package/dist/wgpuLookupTableGradeEffect.js.map +0 -1
  243. package/dist/wgpuSepiaEffect.d.ts +0 -4
  244. package/dist/wgpuSepiaEffect.d.ts.map +0 -1
  245. package/dist/wgpuSepiaEffect.js +0 -31
  246. package/dist/wgpuSepiaEffect.js.map +0 -1
  247. package/src/wgpuBrightnessContrastEffect.test.ts +0 -16
  248. package/src/wgpuChannelMixerEffect.test.ts +0 -13
  249. package/src/wgpuColorGradeEffect.test.ts +0 -13
  250. package/src/wgpuExposureEffect.test.ts +0 -13
  251. package/src/wgpuGrayscaleEffect.test.ts +0 -13
  252. package/src/wgpuHueSaturationEffect.test.ts +0 -13
  253. package/src/wgpuInvertEffect.test.ts +0 -13
  254. package/src/wgpuLiftGammaGainEffect.test.ts +0 -13
  255. package/src/wgpuLookupTableGradeEffect.test.ts +0 -16
  256. package/src/wgpuSepiaEffect.test.ts +0 -13
@@ -0,0 +1,71 @@
1
+ import { createWgpuEffectPipeline, drawWgpuEffectPass } from './wgpuEffectPass';
2
+ // Blits a texture at a UV offset. Out-of-bounds samples produce transparent output.
3
+ const BLIT_OFFSET_WGSL = /* wgsl */ `
4
+ struct Uniforms {
5
+ offset : vec2f,
6
+ _pad : vec2f,
7
+ }
8
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
9
+ @group(1) @binding(0) var tex : texture_2d<f32>;
10
+ @group(1) @binding(1) var smp : sampler;
11
+
12
+ @fragment
13
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
14
+ let shifted = uv + uni.offset;
15
+ if (shifted.x < 0.0 || shifted.x > 1.0 || shifted.y < 0.0 || shifted.y > 1.0) {
16
+ return vec4f(0.0);
17
+ }
18
+ return textureSampleLevel(tex, smp, shifted, 0.0);
19
+ }`;
20
+ // Pass-through blit. Minimal uniform struct required by the pipeline layout.
21
+ const BLIT_WGSL = /* wgsl */ `
22
+ struct Uniforms { _u : f32, _pad0 : f32, _pad1 : f32, _pad2 : f32, }
23
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
24
+ @group(1) @binding(0) var tex : texture_2d<f32>;
25
+ @group(1) @binding(1) var smp : sampler;
26
+
27
+ @fragment
28
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
29
+ return textureSampleLevel(tex, smp, uv, 0.0);
30
+ }`;
31
+ /**
32
+ * Blits source into dest at a pixel offset (dx, dy in screen-space Y-down).
33
+ * Pixels sampling outside the source bounds produce transparent output.
34
+ *
35
+ * The offset matches the Gl path exactly — (-dx/w, +dy/h). The shader samples `uv + offset`, so a
36
+ * screen-space shift of (+dx,+dy) needs offset (-dx, +dy): the +dy is NOT negated for Wgpu. Wgpu's UV
37
+ * y=0 is top (opposite Gl's bottom-origin) but Wgpu render-target textures are also stored top-down, so
38
+ * the two inversions cancel. A previous extra Y negation put the shadow on the wrong side of the source
39
+ * (it landed up-left instead of down-right) — caught by filter-drop-shadow-parity.
40
+ */
41
+ export function applyWgpuEffectBlitOffsetPass(state, source, dest, dx, dy) {
42
+ const pipeline = getWgpuBlitOffsetShader(state);
43
+ drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
44
+ f32[0] = -dx / source.width;
45
+ f32[1] = dy / source.height;
46
+ });
47
+ }
48
+ /** Blits source directly into dest without modification. */
49
+ export function applyWgpuEffectBlitPass(state, source, dest) {
50
+ const pipeline = getWgpuBlitShader(state);
51
+ drawWgpuEffectPass(state, source, dest, pipeline, () => { });
52
+ }
53
+ function getWgpuBlitOffsetShader(state) {
54
+ let p = blitOffsetPipelines.get(state);
55
+ if (p === undefined) {
56
+ p = createWgpuEffectPipeline(state, BLIT_OFFSET_WGSL);
57
+ blitOffsetPipelines.set(state, p);
58
+ }
59
+ return p;
60
+ }
61
+ function getWgpuBlitShader(state) {
62
+ let p = blitPipelines.get(state);
63
+ if (p === undefined) {
64
+ p = createWgpuEffectPipeline(state, BLIT_WGSL);
65
+ blitPipelines.set(state, p);
66
+ }
67
+ return p;
68
+ }
69
+ const blitOffsetPipelines = new WeakMap();
70
+ const blitPipelines = new WeakMap();
71
+ //# sourceMappingURL=wgpuEffectBlitShader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectBlitShader.js","sourceRoot":"","sources":["../src/wgpuEffectBlitShader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,oFAAoF;AACpF,MAAM,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;EAgBlC,CAAC;AAEH,6EAA6E;AAC7E,MAAM,SAAS,GAAG,UAAU,CAAC;;;;;;;;;EAS3B,CAAC;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,6BAA6B,CAC3C,KAAsB,EACtB,MAAwB,EACxB,IAAsB,EACtB,EAAU,EACV,EAAU;IAEV,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAChD,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QACxD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;QAC5B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,uBAAuB,CACrC,KAAsB,EACtB,MAAwB,EACxB,IAAsB;IAEtB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1C,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAsB;IACrD,IAAI,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,CAAC,GAAG,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACtD,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAsB;IAC/C,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,CAAC,GAAG,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC/C,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAAuC,CAAC;AAC/E,MAAM,aAAa,GAAG,IAAI,OAAO,EAAuC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ /**
3
+ * Applies a separable box blur to `source`, writing to `dest`. `blurX`/`blurY` are
4
+ * the target Gaussian standard deviations; `passes` is the number of box passes per
5
+ * axis (more passes converge on a Gaussian — see `computeBoxBlurPassRadius`). A box
6
+ * blur is cheap and right for soft spreads. `temp` is a caller-provided ping-pong
7
+ * scratch target distinct from both `source` and `dest`.
8
+ */
9
+ export declare function applyWgpuEffectBoxBlur(state: WgpuRenderState, source: WgpuRenderTarget, dest: WgpuRenderTarget, temp: WgpuRenderTarget, options: Readonly<{
10
+ blurX?: number;
11
+ blurY?: number;
12
+ passes?: number;
13
+ }>): void;
14
+ //# sourceMappingURL=wgpuEffectBoxBlur.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectBoxBlur.d.ts","sourceRoot":"","sources":["../src/wgpuEffectBoxBlur.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAkCzE;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACrE,IAAI,CA0BN"}
@@ -0,0 +1,81 @@
1
+ import { computeBoxBlurPassRadius } from '@flighthq/effects';
2
+ import { applyWgpuEffectBlitPass } from './wgpuEffectBlitShader';
3
+ import { createWgpuEffectPipeline, drawWgpuEffectPass } from './wgpuEffectPass';
4
+ // Uniforms layout:
5
+ // offset 0: texelSize (vec2f)
6
+ // offset 8: direction (vec2f)
7
+ // offset 16: radius (f32)
8
+ // offset 20-31: padding
9
+ const BOX_BLUR_WGSL = /* wgsl */ `
10
+ struct Uniforms {
11
+ texelSize : vec2f,
12
+ direction : vec2f,
13
+ radius : f32,
14
+ _pad0 : f32, _pad1 : f32, _pad2 : f32,
15
+ }
16
+ @group(0) @binding(0) var<uniform> uni : Uniforms;
17
+ @group(1) @binding(0) var tex : texture_2d<f32>;
18
+ @group(1) @binding(1) var smp : sampler;
19
+
20
+ @fragment
21
+ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
22
+ let r = i32(uni.radius);
23
+ if (r == 0) { return textureSampleLevel(tex, smp, uv, 0.0); }
24
+ var sum = vec4f(0.0);
25
+ let count = f32(2 * r + 1);
26
+ for (var i = -r; i <= r; i++) {
27
+ sum += textureSampleLevel(tex, smp, uv + f32(i) * uni.texelSize * uni.direction, 0.0);
28
+ }
29
+ return sum / count;
30
+ }`;
31
+ /**
32
+ * Applies a separable box blur to `source`, writing to `dest`. `blurX`/`blurY` are
33
+ * the target Gaussian standard deviations; `passes` is the number of box passes per
34
+ * axis (more passes converge on a Gaussian — see `computeBoxBlurPassRadius`). A box
35
+ * blur is cheap and right for soft spreads. `temp` is a caller-provided ping-pong
36
+ * scratch target distinct from both `source` and `dest`.
37
+ */
38
+ export function applyWgpuEffectBoxBlur(state, source, dest, temp, options) {
39
+ const passes = Math.max(1, Math.round(options.passes ?? 1));
40
+ const blurX = options.blurX ?? 4;
41
+ const blurY = options.blurY ?? 4;
42
+ let read = source;
43
+ let write = temp;
44
+ for (let pass = 0; pass < passes; pass++) {
45
+ const radiusX = computeBoxBlurPassRadius(blurX, passes, pass);
46
+ if (radiusX > 0) {
47
+ applyBoxBlurPass(state, read, write, radiusX, 1, 0);
48
+ read = write;
49
+ write = write === temp ? dest : temp;
50
+ }
51
+ const radiusY = computeBoxBlurPassRadius(blurY, passes, pass);
52
+ if (radiusY > 0) {
53
+ applyBoxBlurPass(state, read, write, radiusY, 0, 1);
54
+ read = write;
55
+ write = write === temp ? dest : temp;
56
+ }
57
+ }
58
+ if (read !== dest) {
59
+ applyWgpuEffectBlitPass(state, read, dest);
60
+ }
61
+ }
62
+ function applyBoxBlurPass(state, source, dest, radius, dirX, dirY) {
63
+ const pipeline = getBoxBlurPipeline(state);
64
+ drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
65
+ f32[0] = 1 / source.width;
66
+ f32[1] = 1 / source.height;
67
+ f32[2] = dirX;
68
+ f32[3] = dirY;
69
+ f32[4] = radius;
70
+ });
71
+ }
72
+ function getBoxBlurPipeline(state) {
73
+ let p = boxBlurPipelines.get(state);
74
+ if (p === undefined) {
75
+ p = createWgpuEffectPipeline(state, BOX_BLUR_WGSL, 'replace');
76
+ boxBlurPipelines.set(state, p);
77
+ }
78
+ return p;
79
+ }
80
+ const boxBlurPipelines = new WeakMap();
81
+ //# sourceMappingURL=wgpuEffectBoxBlur.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectBoxBlur.js","sourceRoot":"","sources":["../src/wgpuEffectBoxBlur.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { WgpuRenderState } from '@flighthq/types';
2
+ /**
3
+ * Returns a cached 256-entry RGBA gradient ramp texture for the given stops,
4
+ * building it on first use and reusing it on later calls with the same stops.
5
+ * The texture is owned by the render state and lives for its lifetime — callers
6
+ * must NOT destroy it. This is the form recipes should use: a recipe runs inside
7
+ * the frame's command encoder and does not control submit timing, so it cannot
8
+ * safely `destroy()` a per-call texture (the encoder still references it at
9
+ * submit, which discards the whole frame). Caching also avoids a per-frame
10
+ * allocation. Distinct stop sets get distinct textures, so multiple gradient
11
+ * recipes in one frame never alias each other's ramp.
12
+ *
13
+ * `ratios` are in byte scale [0,255]. Colors are packed RGB integers.
14
+ * `alphas` are in [0,1].
15
+ */
16
+ export declare function getWgpuEffectGradientRampTexture(state: WgpuRenderState, colors: ReadonlyArray<number>, alphas: ReadonlyArray<number>, ratios: ReadonlyArray<number>): GPUTexture;
17
+ //# sourceMappingURL=wgpuEffectGradientRamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectGradientRamp.d.ts","sourceRoot":"","sources":["../src/wgpuEffectGradientRamp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAC5B,UAAU,CAaZ"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Returns a cached 256-entry RGBA gradient ramp texture for the given stops,
3
+ * building it on first use and reusing it on later calls with the same stops.
4
+ * The texture is owned by the render state and lives for its lifetime — callers
5
+ * must NOT destroy it. This is the form recipes should use: a recipe runs inside
6
+ * the frame's command encoder and does not control submit timing, so it cannot
7
+ * safely `destroy()` a per-call texture (the encoder still references it at
8
+ * submit, which discards the whole frame). Caching also avoids a per-frame
9
+ * allocation. Distinct stop sets get distinct textures, so multiple gradient
10
+ * recipes in one frame never alias each other's ramp.
11
+ *
12
+ * `ratios` are in byte scale [0,255]. Colors are packed RGB integers.
13
+ * `alphas` are in [0,1].
14
+ */
15
+ export function getWgpuEffectGradientRampTexture(state, colors, alphas, ratios) {
16
+ let cache = rampCaches.get(state);
17
+ if (cache === undefined) {
18
+ cache = new Map();
19
+ rampCaches.set(state, cache);
20
+ }
21
+ const key = `${colors.join(',')}|${alphas.join(',')}|${ratios.join(',')}`;
22
+ let texture = cache.get(key);
23
+ if (texture === undefined) {
24
+ texture = createWgpuEffectGradientRampTexture(state, colors, alphas, ratios);
25
+ cache.set(key, texture);
26
+ }
27
+ return texture;
28
+ }
29
+ function buildRampData(colors, alphas, ratios) {
30
+ const out = new Uint8ClampedArray(256 * 4);
31
+ if (colors.length === 0)
32
+ return out;
33
+ for (let i = 0; i < 256; i++) {
34
+ const t = i;
35
+ let r = 0, g = 0, b = 0, a = 0;
36
+ if (t <= ratios[0]) {
37
+ const c = colors[0];
38
+ r = (c >> 16) & 0xff;
39
+ g = (c >> 8) & 0xff;
40
+ b = c & 0xff;
41
+ a = Math.round(alphas[0] * 255);
42
+ }
43
+ else if (t >= ratios[ratios.length - 1]) {
44
+ const c = colors[colors.length - 1];
45
+ r = (c >> 16) & 0xff;
46
+ g = (c >> 8) & 0xff;
47
+ b = c & 0xff;
48
+ a = Math.round(alphas[alphas.length - 1] * 255);
49
+ }
50
+ else {
51
+ for (let j = 0; j < ratios.length - 1; j++) {
52
+ const r0 = ratios[j];
53
+ const r1 = ratios[j + 1];
54
+ if (t >= r0 && t <= r1) {
55
+ const blend = r1 > r0 ? (t - r0) / (r1 - r0) : 0;
56
+ const c0 = colors[j];
57
+ const c1 = colors[j + 1];
58
+ r = Math.round(((c0 >> 16) & 0xff) * (1 - blend) + ((c1 >> 16) & 0xff) * blend);
59
+ g = Math.round(((c0 >> 8) & 0xff) * (1 - blend) + ((c1 >> 8) & 0xff) * blend);
60
+ b = Math.round((c0 & 0xff) * (1 - blend) + (c1 & 0xff) * blend);
61
+ a = Math.round(alphas[j] * 255 * (1 - blend) + alphas[j + 1] * 255 * blend);
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ out[i * 4] = r;
67
+ out[i * 4 + 1] = g;
68
+ out[i * 4 + 2] = b;
69
+ out[i * 4 + 3] = a;
70
+ }
71
+ return out;
72
+ }
73
+ // Builds a 256-entry RGBA gradient ramp texture on the GPU. The returned texture is cached and owned by
74
+ // the render state (see getWgpuEffectGradientRampTexture), so it is never destroyed mid-encoder.
75
+ function createWgpuEffectGradientRampTexture(state, colors, alphas, ratios) {
76
+ const data = buildRampData(colors, alphas, ratios);
77
+ const { device } = state;
78
+ const texture = device.createTexture({
79
+ size: [256, 1, 1],
80
+ format: 'rgba8unorm',
81
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
82
+ });
83
+ device.queue.writeTexture({ texture, origin: [0, 0, 0] }, data.buffer, { offset: 0, bytesPerRow: 256 * 4 }, [256, 1, 1]);
84
+ return texture;
85
+ }
86
+ // Per-render-state cache of ramp textures keyed by their stops. Textures live for the render state's
87
+ // lifetime; they are tiny (256×1) and the distinct-gradient set is bounded in practice.
88
+ const rampCaches = new WeakMap();
89
+ //# sourceMappingURL=wgpuEffectGradientRamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectGradientRamp.js","sourceRoot":"","sources":["../src/wgpuEffectGradientRamp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare const EFFECT_VERTEX_WGSL = "\nstruct VertexOut {\n @builtin(position) position : vec4f,\n @location(0) uv : vec2f,\n}\n\n@vertex\nfn vs_main(@builtin(vertex_index) vi : u32) -> VertexOut {\n let xi = vi == 1u || vi == 2u || vi == 4u;\n let yi = vi == 2u || vi == 4u || vi == 5u;\n var out : VertexOut;\n out.position = vec4f(select(-1.0, 1.0, xi), select(-1.0, 1.0, yi), 0.0, 1.0);\n out.uv = vec2f(select(0.0, 1.0, xi), select(1.0, 0.0, yi));\n return out;\n}\n";
3
+ export type WgpuEffectPipeline = {
4
+ pipeline: GPURenderPipeline;
5
+ blendMode: 'premul' | 'replace';
6
+ compileForFormat?: (format: GPUTextureFormat) => GPURenderPipeline;
7
+ variants?: Map<GPUTextureFormat, GPURenderPipeline>;
8
+ };
9
+ export type WgpuDualSourceEffectPipeline = WgpuEffectPipeline;
10
+ /** Clears a render target to fully transparent. Ends any active render pass. */
11
+ export declare function clearWgpuEffectTarget(state: WgpuRenderState, target: WgpuRenderTarget): void;
12
+ /** Compiles a dual-source WGSL effect pipeline (source0 = group 1, source1 = group 2). */
13
+ export declare function createWgpuDualSourceEffectPipeline(state: WgpuRenderState, fragmentWGSL: string, blend?: 'premul' | 'replace'): WgpuDualSourceEffectPipeline;
14
+ /** Compiles a WGSL effect pipeline, creating the combined vertex+fragment shader module. */
15
+ export declare function createWgpuEffectPipeline(state: WgpuRenderState, fragmentWGSL: string, blend?: 'premul' | 'replace'): WgpuEffectPipeline;
16
+ /**
17
+ * Draws a full-screen pass reading from two source textures.
18
+ * source0 binds to group 1, source1 to group 2.
19
+ */
20
+ export declare function drawWgpuDualSourceEffectPass(state: WgpuRenderState, source0: WgpuRenderTarget, source1: WgpuRenderTarget, dest: WgpuRenderTarget | null, pipeline: WgpuDualSourceEffectPipeline, setUniforms: (f32: Float32Array, i32: Int32Array) => void): void;
21
+ /**
22
+ * Draws a full-screen effect pass: reads from source (group 1), writes to dest.
23
+ * `setUniforms` is called with Float32Array and Int32Array views into the current
24
+ * ring-buffer slot for per-pass uniform uploads. Blend is premultiplied-alpha compositing.
25
+ * Ends any active render pass; does not restore it.
26
+ */
27
+ export declare function drawWgpuEffectPass(state: WgpuRenderState, source: WgpuRenderTarget, dest: WgpuRenderTarget | null, pipeline: WgpuEffectPipeline, setUniforms: (f32: Float32Array, i32: Int32Array) => void): void;
28
+ /**
29
+ * Returns the effect-pass state for the given render state, for use in shaders
30
+ * that need to bind a custom texture (e.g., a gradient ramp) as group 2 or 3.
31
+ */
32
+ export declare function getWgpuEffectPassState(state: WgpuRenderState): {
33
+ uniformBG: GPUBindGroup;
34
+ textureBGLayout: GPUBindGroupLayout;
35
+ uniformBGLayout: GPUBindGroupLayout;
36
+ sampler: GPUSampler;
37
+ acquireSlot: () => number;
38
+ writeSlot: (offset: number, fn: (f32: Float32Array, i32: Int32Array) => void) => void;
39
+ beginPass: (dest: WgpuRenderTarget | null, loadOp: GPULoadOp) => GPURenderPassEncoder;
40
+ };
41
+ //# sourceMappingURL=wgpuEffectPass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectPass.d.ts","sourceRoot":"","sources":["../src/wgpuEffectPass.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKzE,eAAO,MAAM,kBAAkB,+bAe9B,CAAC;AAcF,MAAM,MAAM,kBAAkB,GAAG;IAE/B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,QAAQ,GAAG,SAAS,CAAC;IAKhC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,iBAAiB,CAAC;IACnE,QAAQ,CAAC,EAAE,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,kBAAkB,CAAC;AA8K9D,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAG5F;AAED,0FAA0F;AAC1F,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,QAAQ,GAAG,SAAoB,GACrC,4BAA4B,CAsB9B;AAED,4FAA4F;AAC5F,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,QAAQ,GAAG,SAAoB,GACrC,kBAAkB,CAsBpB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,gBAAgB,GAAG,IAAI,EAC7B,QAAQ,EAAE,4BAA4B,EACtC,WAAW,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,KAAK,IAAI,GACxD,IAAI,CAiBN;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,gBAAgB,GAAG,IAAI,EAC7B,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,KAAK,IAAI,GACxD,IAAI,CAeN;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG;IAC9D,SAAS,EAAE,YAAY,CAAC;IACxB,eAAe,EAAE,kBAAkB,CAAC;IACpC,eAAe,EAAE,kBAAkB,CAAC;IACpC,OAAO,EAAE,UAAU,CAAC;IACpB,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,KAAK,IAAI,KAAK,IAAI,CAAC;IACtF,SAAS,EAAE,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK,oBAAoB,CAAC;CACvF,CAWA"}
@@ -0,0 +1,259 @@
1
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
2
+ // Shared vertex shader: full-screen quad via vertex_index, no vertex buffer needed.
3
+ // UV convention: y=0 = texture top, y=1 = texture bottom (Wgpu top-left origin).
4
+ // NDC y=+1 (top) → uv.y=0, NDC y=-1 (bottom) → uv.y=1.
5
+ export const EFFECT_VERTEX_WGSL = /* wgsl */ `
6
+ struct VertexOut {
7
+ @builtin(position) position : vec4f,
8
+ @location(0) uv : vec2f,
9
+ }
10
+
11
+ @vertex
12
+ fn vs_main(@builtin(vertex_index) vi : u32) -> VertexOut {
13
+ let xi = vi == 1u || vi == 2u || vi == 4u;
14
+ let yi = vi == 2u || vi == 4u || vi == 5u;
15
+ var out : VertexOut;
16
+ out.position = vec4f(select(-1.0, 1.0, xi), select(-1.0, 1.0, yi), 0.0, 1.0);
17
+ out.uv = vec2f(select(0.0, 1.0, xi), select(1.0, 0.0, yi));
18
+ return out;
19
+ }
20
+ `;
21
+ // Premultiplied-alpha compositing blend state, matching Gl's ONE + ONE_MINUS_SRC_ALPHA.
22
+ const PREMUL_BLEND = {
23
+ color: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
24
+ alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
25
+ };
26
+ // Opaque / replace blend: writes the effect result directly without compositing.
27
+ const REPLACE_BLEND = {
28
+ color: { srcFactor: 'one', dstFactor: 'zero', operation: 'add' },
29
+ alpha: { srcFactor: 'one', dstFactor: 'zero', operation: 'add' },
30
+ };
31
+ const effectPassStates = new WeakMap();
32
+ function getOrCreateEffectPassState(state) {
33
+ let fs = effectPassStates.get(state);
34
+ if (fs !== undefined)
35
+ return fs;
36
+ const { device, format } = state;
37
+ // 512 slots × 256 bytes = 128 KB ring buffer for effect-pass uniforms.
38
+ // 256 bytes/slot is enough for the largest pass (convolution: ~244 bytes).
39
+ // Using separate slots per draw avoids writeBuffer ordering issues when
40
+ // multiple passes of the same type run within a single command encoder.
41
+ // Wrapping back to slot 0 within a frame is safe in practice: 512 pass
42
+ // draws per frame would require more than 512 active pass applications.
43
+ const SLOTS = 512;
44
+ const STRIDE = 256;
45
+ const uniformBuffer = device.createBuffer({
46
+ size: SLOTS * STRIDE,
47
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
48
+ });
49
+ const uniformData = new Float32Array((SLOTS * STRIDE) / 4);
50
+ const uniformDataI32 = new Int32Array(uniformData.buffer);
51
+ const uniformBGLayout = device.createBindGroupLayout({
52
+ entries: [
53
+ {
54
+ binding: 0,
55
+ visibility: GPUShaderStage.FRAGMENT,
56
+ // minBindingSize omitted (0): the bound range size (uniformStride) is validated at
57
+ // draw time instead of statically, so passes with structs larger than any fixed
58
+ // minimum (color matrix 80B, convolution 244B) share this one layout.
59
+ buffer: { type: 'uniform', hasDynamicOffset: true },
60
+ },
61
+ ],
62
+ });
63
+ const uniformBG = device.createBindGroup({
64
+ layout: uniformBGLayout,
65
+ entries: [{ binding: 0, resource: { buffer: uniformBuffer, size: STRIDE } }],
66
+ });
67
+ const textureBGLayout = device.createBindGroupLayout({
68
+ entries: [
69
+ { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: {} },
70
+ { binding: 1, visibility: GPUShaderStage.FRAGMENT, sampler: {} },
71
+ ],
72
+ });
73
+ const sampler = device.createSampler({
74
+ minFilter: 'linear',
75
+ magFilter: 'linear',
76
+ addressModeU: 'clamp-to-edge',
77
+ addressModeV: 'clamp-to-edge',
78
+ });
79
+ fs = {
80
+ uniformBuffer,
81
+ uniformData,
82
+ uniformDataI32,
83
+ uniformOffset: 0,
84
+ uniformStride: STRIDE,
85
+ uniformSlots: SLOTS,
86
+ uniformBGLayout,
87
+ uniformBG,
88
+ textureBGLayout,
89
+ textureBGs: new WeakMap(),
90
+ sampler,
91
+ format,
92
+ };
93
+ effectPassStates.set(state, fs);
94
+ return fs;
95
+ }
96
+ function getOrCreateTextureBG(fs, device, view) {
97
+ let bg = fs.textureBGs.get(view);
98
+ if (bg === undefined) {
99
+ bg = device.createBindGroup({
100
+ layout: fs.textureBGLayout,
101
+ entries: [
102
+ { binding: 0, resource: view },
103
+ { binding: 1, resource: fs.sampler },
104
+ ],
105
+ });
106
+ fs.textureBGs.set(view, bg);
107
+ }
108
+ return bg;
109
+ }
110
+ function acquireUniformSlot(fs) {
111
+ const offset = fs.uniformOffset;
112
+ fs.uniformOffset = (offset + fs.uniformStride) % (fs.uniformSlots * fs.uniformStride);
113
+ return offset;
114
+ }
115
+ function writeUniformSlot(state, fs, slotOffset, setUniforms) {
116
+ const f32Start = slotOffset / 4;
117
+ const slotF32 = fs.uniformData.subarray(f32Start, f32Start + fs.uniformStride / 4);
118
+ const slotI32 = fs.uniformDataI32.subarray(f32Start, f32Start + fs.uniformStride / 4);
119
+ setUniforms(slotF32, slotI32);
120
+ state.device.queue.writeBuffer(fs.uniformBuffer, slotOffset, fs.uniformData.buffer, slotOffset, fs.uniformStride);
121
+ }
122
+ function beginEffectPass(state, dest, loadOp) {
123
+ const runtime = getWgpuRenderStateRuntime(state);
124
+ if (runtime.commandEncoder === null)
125
+ throw new Error('No active command encoder — call renderWgpuBackground first');
126
+ if (runtime.renderPass !== null) {
127
+ runtime.renderPass.end();
128
+ runtime.renderPass = null;
129
+ }
130
+ const view = dest !== null ? dest.view : runtime.canvasTextureView;
131
+ const pass = runtime.commandEncoder.beginRenderPass({
132
+ colorAttachments: [{ view, loadOp, storeOp: 'store', clearValue: { r: 0, g: 0, b: 0, a: 0 } }],
133
+ });
134
+ if (dest !== null) {
135
+ pass.setViewport(0, 0, dest.width, dest.height, 0, 1);
136
+ }
137
+ else {
138
+ const w = runtime.renderTargetViewport?.width ?? state.canvas.width;
139
+ const h = runtime.renderTargetViewport?.height ?? state.canvas.height;
140
+ pass.setViewport(0, 0, w, h, 0, 1);
141
+ }
142
+ return pass;
143
+ }
144
+ // Returns the GPURenderPipeline whose color target format matches `dest` (the canvas format when dest is
145
+ // null). Compiles and caches a per-format variant on demand so a pipeline built for the canvas format can
146
+ // still draw into an HDR (rgba16float) effect target without an attachment-format mismatch.
147
+ function resolveEffectPipeline(state, pipeline, dest) {
148
+ const canvasFormat = getOrCreateEffectPassState(state).format;
149
+ const targetFormat = dest !== null ? dest.format : canvasFormat;
150
+ if (pipeline.compileForFormat === undefined || pipeline.variants === undefined || targetFormat === canvasFormat) {
151
+ return pipeline.pipeline;
152
+ }
153
+ let variant = pipeline.variants.get(targetFormat);
154
+ if (variant === undefined) {
155
+ variant = pipeline.compileForFormat(targetFormat);
156
+ pipeline.variants.set(targetFormat, variant);
157
+ }
158
+ return variant;
159
+ }
160
+ /** Clears a render target to fully transparent. Ends any active render pass. */
161
+ export function clearWgpuEffectTarget(state, target) {
162
+ const pass = beginEffectPass(state, target, 'clear');
163
+ pass.end();
164
+ }
165
+ /** Compiles a dual-source WGSL effect pipeline (source0 = group 1, source1 = group 2). */
166
+ export function createWgpuDualSourceEffectPipeline(state, fragmentWGSL, blend = 'premul') {
167
+ const fs = getOrCreateEffectPassState(state);
168
+ const { device } = state;
169
+ const shaderModule = device.createShaderModule({ code: EFFECT_VERTEX_WGSL + fragmentWGSL });
170
+ const pipelineLayout = device.createPipelineLayout({
171
+ bindGroupLayouts: [fs.uniformBGLayout, fs.textureBGLayout, fs.textureBGLayout],
172
+ });
173
+ const compileForFormat = (format) => device.createRenderPipeline({
174
+ layout: pipelineLayout,
175
+ vertex: { module: shaderModule, entryPoint: 'vs_main' },
176
+ fragment: {
177
+ module: shaderModule,
178
+ entryPoint: 'fs_main',
179
+ targets: [{ format, blend: blend === 'premul' ? PREMUL_BLEND : REPLACE_BLEND }],
180
+ },
181
+ primitive: { topology: 'triangle-list' },
182
+ });
183
+ return { pipeline: compileForFormat(fs.format), blendMode: blend, compileForFormat, variants: new Map() };
184
+ }
185
+ /** Compiles a WGSL effect pipeline, creating the combined vertex+fragment shader module. */
186
+ export function createWgpuEffectPipeline(state, fragmentWGSL, blend = 'premul') {
187
+ const fs = getOrCreateEffectPassState(state);
188
+ const { device } = state;
189
+ const shaderModule = device.createShaderModule({ code: EFFECT_VERTEX_WGSL + fragmentWGSL });
190
+ const pipelineLayout = device.createPipelineLayout({
191
+ bindGroupLayouts: [fs.uniformBGLayout, fs.textureBGLayout],
192
+ });
193
+ const compileForFormat = (format) => device.createRenderPipeline({
194
+ layout: pipelineLayout,
195
+ vertex: { module: shaderModule, entryPoint: 'vs_main' },
196
+ fragment: {
197
+ module: shaderModule,
198
+ entryPoint: 'fs_main',
199
+ targets: [{ format, blend: blend === 'premul' ? PREMUL_BLEND : REPLACE_BLEND }],
200
+ },
201
+ primitive: { topology: 'triangle-list' },
202
+ });
203
+ return { pipeline: compileForFormat(fs.format), blendMode: blend, compileForFormat, variants: new Map() };
204
+ }
205
+ /**
206
+ * Draws a full-screen pass reading from two source textures.
207
+ * source0 binds to group 1, source1 to group 2.
208
+ */
209
+ export function drawWgpuDualSourceEffectPass(state, source0, source1, dest, pipeline, setUniforms) {
210
+ const fs = getOrCreateEffectPassState(state);
211
+ const { device } = state;
212
+ const slotOffset = acquireUniformSlot(fs);
213
+ writeUniformSlot(state, fs, slotOffset, setUniforms);
214
+ const source0BG = getOrCreateTextureBG(fs, device, source0.view);
215
+ const source1BG = getOrCreateTextureBG(fs, device, source1.view);
216
+ const pass = beginEffectPass(state, dest, 'load');
217
+ pass.setPipeline(resolveEffectPipeline(state, pipeline, dest));
218
+ pass.setBindGroup(0, fs.uniformBG, [slotOffset]);
219
+ pass.setBindGroup(1, source0BG);
220
+ pass.setBindGroup(2, source1BG);
221
+ pass.draw(6);
222
+ pass.end();
223
+ }
224
+ /**
225
+ * Draws a full-screen effect pass: reads from source (group 1), writes to dest.
226
+ * `setUniforms` is called with Float32Array and Int32Array views into the current
227
+ * ring-buffer slot for per-pass uniform uploads. Blend is premultiplied-alpha compositing.
228
+ * Ends any active render pass; does not restore it.
229
+ */
230
+ export function drawWgpuEffectPass(state, source, dest, pipeline, setUniforms) {
231
+ const fs = getOrCreateEffectPassState(state);
232
+ const { device } = state;
233
+ const slotOffset = acquireUniformSlot(fs);
234
+ writeUniformSlot(state, fs, slotOffset, setUniforms);
235
+ const sourceBG = getOrCreateTextureBG(fs, device, source.view);
236
+ const pass = beginEffectPass(state, dest, 'load');
237
+ pass.setPipeline(resolveEffectPipeline(state, pipeline, dest));
238
+ pass.setBindGroup(0, fs.uniformBG, [slotOffset]);
239
+ pass.setBindGroup(1, sourceBG);
240
+ pass.draw(6);
241
+ pass.end();
242
+ }
243
+ /**
244
+ * Returns the effect-pass state for the given render state, for use in shaders
245
+ * that need to bind a custom texture (e.g., a gradient ramp) as group 2 or 3.
246
+ */
247
+ export function getWgpuEffectPassState(state) {
248
+ const fs = getOrCreateEffectPassState(state);
249
+ return {
250
+ uniformBG: fs.uniformBG,
251
+ textureBGLayout: fs.textureBGLayout,
252
+ uniformBGLayout: fs.uniformBGLayout,
253
+ sampler: fs.sampler,
254
+ acquireSlot: () => acquireUniformSlot(fs),
255
+ writeSlot: (offset, fn) => writeUniformSlot(state, fs, offset, fn),
256
+ beginPass: (dest, loadOp) => beginEffectPass(state, dest, loadOp),
257
+ };
258
+ }
259
+ //# sourceMappingURL=wgpuEffectPass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectPass.js","sourceRoot":"","sources":["../src/wgpuEffectPass.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { WgpuFilterPipeline } from '@flighthq/filters-wgpu';
2
1
  import type { WgpuRenderState } from '@flighthq/types';
3
- export declare function getWgpuEffectPipeline(state: WgpuRenderState, key: string, fragmentWGSL: string, blend?: 'premul' | 'replace'): WgpuFilterPipeline;
2
+ import type { WgpuEffectPipeline } from './wgpuEffectPass';
3
+ export declare function getWgpuEffectPipeline(state: WgpuRenderState, key: string, fragmentWGSL: string, blend?: 'premul' | 'replace'): WgpuEffectPipeline;
4
4
  //# sourceMappingURL=wgpuEffectProgramCache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuEffectProgramCache.d.ts","sourceRoot":"","sources":["../src/wgpuEffectProgramCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAavD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,QAAQ,GAAG,SAAqB,GACtC,kBAAkB,CAWpB"}
1
+ {"version":3,"file":"wgpuEffectProgramCache.d.ts","sourceRoot":"","sources":["../src/wgpuEffectProgramCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAc3D,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,QAAQ,GAAG,SAAqB,GACtC,kBAAkB,CAWpB"}