@flighthq/effects-wgpu 0.4.0-next.1602.af48ed1 → 0.4.0-next.1663.d9c5746
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.
- package/dist/enableWgpuRenderEffectGuards.js +5 -5
- package/dist/enableWgpuRenderEffectGuards.js.map +1 -1
- package/dist/wgpuBlurEffect.d.ts +14 -0
- package/dist/wgpuBlurEffect.d.ts.map +1 -1
- package/dist/wgpuBlurEffect.js +41 -6
- package/dist/wgpuBlurEffect.js.map +1 -1
- package/dist/wgpuKuwaharaEffect.js +9 -3
- package/dist/wgpuKuwaharaEffect.js.map +1 -1
- package/dist/wgpuRenderEffectPipeline.d.ts.map +1 -1
- package/dist/wgpuRenderEffectPipeline.js +6 -14
- package/dist/wgpuRenderEffectPipeline.js.map +1 -1
- package/package.json +9 -9
- package/src/enableWgpuRenderEffectGuards.test.ts +21 -12
- package/src/wgpuBlurEffect.test.ts +28 -0
- package/src/wgpuRenderEffectPipeline.test.ts +20 -10
|
@@ -26,13 +26,13 @@ export function enableWgpuRenderEffectGuards(state) {
|
|
|
26
26
|
setWgpuRenderEffectPipelineSkipGuard(state, warnWgpuRenderEffectPipelineSkip);
|
|
27
27
|
_guardedStates.add(state);
|
|
28
28
|
}
|
|
29
|
-
// WGPU effect targets
|
|
30
|
-
//
|
|
31
|
-
//
|
|
29
|
+
// WGPU effect targets support one or four coverage samples. Counts outside that set are substituted
|
|
30
|
+
// rather than rejected so module-scope pipeline construction remains loadable; the guard makes the
|
|
31
|
+
// applied count explicit. Warn once per requested count.
|
|
32
32
|
function warnWgpuRenderEffectPipelineSampleCount(_state, requestedSampleCount, appliedSampleCount) {
|
|
33
|
-
logOnce(`effects-wgpu:pipeline-sample-count-
|
|
33
|
+
logOnce(`effects-wgpu:pipeline-sample-count-substituted:${requestedSampleCount}`, LogLevel.Warn, {
|
|
34
34
|
appliedSampleCount,
|
|
35
|
-
message: `createWgpuRenderEffectPipeline: sampleCount ${requestedSampleCount} requested, but WGPU effect targets
|
|
35
|
+
message: `createWgpuRenderEffectPipeline: sampleCount ${requestedSampleCount} requested, but WGPU effect targets support 1 or 4 — continuing with sampleCount ${appliedSampleCount}`,
|
|
36
36
|
requestedSampleCount,
|
|
37
37
|
}, 'effects-wgpu');
|
|
38
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enableWgpuRenderEffectGuards.js","sourceRoot":"","sources":["../src/enableWgpuRenderEffectGuards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EACL,2CAA2C,EAC3C,oCAAoC,GACrC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,mCAAmC,EAAE,MAAM,2BAA2B,CAAC;AAEhF,MAAM,UAAU,gCAAgC,CAAC,KAAsB;IACrE,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAsB;IAClE,mCAAmC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjD,2CAA2C,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzD,oCAAoC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClD,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,uGAAuG;AACvG,wGAAwG;AACxG,yGAAyG;AACzG,gFAAgF;AAChF,EAAE;AACF,oGAAoG;AACpG,0GAA0G;AAC1G,mGAAmG;AACnG,4FAA4F;AAC5F,MAAM,UAAU,4BAA4B,CAAC,KAAsB;IACjE,mCAAmC,CAAC,KAAK,EAAE,+BAA+B,CAAC,CAAC;IAC5E,2CAA2C,CAAC,KAAK,EAAE,uCAAuC,CAAC,CAAC;IAC5F,oCAAoC,CAAC,KAAK,EAAE,gCAAgC,CAAC,CAAC;IAC9E,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"enableWgpuRenderEffectGuards.js","sourceRoot":"","sources":["../src/enableWgpuRenderEffectGuards.ts"],"names":[],"mappings":"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"}
|
package/dist/wgpuBlurEffect.d.ts
CHANGED
|
@@ -5,5 +5,19 @@ export declare function applyGaussianBlurToWgpu(state: WgpuRenderState, source:
|
|
|
5
5
|
blurY?: number;
|
|
6
6
|
}>): void;
|
|
7
7
|
export declare const defaultWgpuBlurEffectRunner: WgpuRenderEffectRunner;
|
|
8
|
+
/**
|
|
9
|
+
* Texels per logical pixel in a target, used to keep a blur's width in LOGICAL units.
|
|
10
|
+
*
|
|
11
|
+
* `blurX`/`blurY` are Gaussian standard deviations in logical pixels — CSS `blur(Xpx)` semantics — while
|
|
12
|
+
* the blur pass steps in texels. Those coincide only at 1:1 density, and a `sampleCount: 4` effect target
|
|
13
|
+
* is allocated at 2x per axis, so an unscaled sigma covered half the intended distance and every
|
|
14
|
+
* blur-based Wgpu effect came out narrower than its Gl twin.
|
|
15
|
+
*
|
|
16
|
+
* ★ MEASURED FROM WIDTHS RATHER THAN READ OFF `sampleCount`, because the blur runs on POOL targets: those
|
|
17
|
+
* are allocated from a descriptor that already carries the supersampled width while their own sampleCount
|
|
18
|
+
* stays 1. A sampleCount-based factor returns 1 for exactly the targets that need scaling — the first
|
|
19
|
+
* version of this fix did that and changed nothing measurable.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getWgpuRenderTargetTexelScale(targetWidth: number, canvasWidth: number): number;
|
|
8
22
|
export declare function registerWgpuBlurEffect(state: WgpuRenderState): void;
|
|
9
23
|
//# sourceMappingURL=wgpuBlurEffect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuBlurEffect.d.ts","sourceRoot":"","sources":["../src/wgpuBlurEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AActH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAEN;
|
|
1
|
+
{"version":3,"file":"wgpuBlurEffect.d.ts","sourceRoot":"","sources":["../src/wgpuBlurEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AActH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAEN;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,OAAO,EAAE,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACpD,IAAI,CAwBN;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAKzC,CAAC;AAMF;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAG9F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEnE"}
|
package/dist/wgpuBlurEffect.js
CHANGED
|
@@ -12,13 +12,26 @@ import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
|
|
|
12
12
|
export function applyBlurEffectToWgpu(state, source, dest, temp, effect) {
|
|
13
13
|
applyGaussianBlurToWgpu(state, source, dest, temp, { blurX: effect.blurX, blurY: effect.blurY });
|
|
14
14
|
}
|
|
15
|
-
// Applies a faithful separable Gaussian blur to `source`, writing to `dest`. `blurX`/`blurY` are the
|
|
16
|
-
// Gaussian standard deviations in pixels (default 4). Runs two unconditional separable passes,
|
|
17
|
-
// source → temp (X) then temp → dest (Y); a zero-radius axis copies through unchanged, so the result
|
|
18
|
-
// always lands in `dest` without a separate blit. `temp` is a ping-pong scratch distinct from both.
|
|
19
15
|
export function applyGaussianBlurToWgpu(state, source, dest, temp, options) {
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
// ★ SIGMA IS IN LOGICAL PIXELS; THE PASS STEPS IN TEXELS. On a supersampled target those are not the
|
|
17
|
+
// same unit — a `sampleCount: 4` effect target is allocated at 2x per axis, so a sigma of 8 spanned
|
|
18
|
+
// only 4 logical pixels and every blur-based effect came out half as wide as its Gl twin. Bloom showed
|
|
19
|
+
// it most plainly: cores and background matched exactly while the halo ran 15.9 luminance short, with
|
|
20
|
+
// ZERO halo pixels brighter on Wgpu — a one-directional deficit, which is what a too-narrow blur looks
|
|
21
|
+
// like, not what a different blur looks like.
|
|
22
|
+
//
|
|
23
|
+
// Measured on effect-bloom: halo mean wgpu-webgl was -15.87 at sampleCount 4 and +1.02 with the same
|
|
24
|
+
// scene at sampleCount 1, where logical and texel units coincide. Scaling sigma by the supersample
|
|
25
|
+
// factor makes the two agree at any sample count, which is the contract the doc comment above states.
|
|
26
|
+
//
|
|
27
|
+
// ★ THE FACTOR IS MEASURED FROM THE TARGET, NOT READ OFF ITS sampleCount. The blur runs on POOL
|
|
28
|
+
// targets, and those are allocated from a descriptor that already carries the supersampled WIDTH while
|
|
29
|
+
// their own sampleCount is 1 — so asking `getWgpuRenderTargetSupersampleScale` gave 1 and the first
|
|
30
|
+
// version of this fix changed nothing at all. Texel density against the canvas is the thing that
|
|
31
|
+
// actually matters here, and it is true of any target however it was obtained.
|
|
32
|
+
const scale = getWgpuRenderTargetTexelScale(source.width, state.canvas.width);
|
|
33
|
+
const sigmaX = (options.blurX ?? 4) * scale;
|
|
34
|
+
const sigmaY = (options.blurY ?? 4) * scale;
|
|
22
35
|
const radiusX = sigmaX > 0 ? Math.ceil(sigmaX * 3) : 0;
|
|
23
36
|
const radiusY = sigmaY > 0 ? Math.ceil(sigmaY * 3) : 0;
|
|
24
37
|
applyWgpuGaussianBlurPass(state, source, temp, sigmaX, radiusX, 1, 0);
|
|
@@ -30,6 +43,28 @@ export const defaultWgpuBlurEffectRunner = (ctx, effect) => {
|
|
|
30
43
|
applyBlurEffectToWgpu(ctx.state, ctx.source, ctx.dest, temp, effect);
|
|
31
44
|
releaseWgpuRenderTarget(ctx.pool, temp);
|
|
32
45
|
};
|
|
46
|
+
// Applies a faithful separable Gaussian blur to `source`, writing to `dest`. `blurX`/`blurY` are the
|
|
47
|
+
// Gaussian standard deviations in pixels (default 4). Runs two unconditional separable passes,
|
|
48
|
+
// source → temp (X) then temp → dest (Y); a zero-radius axis copies through unchanged, so the result
|
|
49
|
+
// always lands in `dest` without a separate blit. `temp` is a ping-pong scratch distinct from both.
|
|
50
|
+
/**
|
|
51
|
+
* Texels per logical pixel in a target, used to keep a blur's width in LOGICAL units.
|
|
52
|
+
*
|
|
53
|
+
* `blurX`/`blurY` are Gaussian standard deviations in logical pixels — CSS `blur(Xpx)` semantics — while
|
|
54
|
+
* the blur pass steps in texels. Those coincide only at 1:1 density, and a `sampleCount: 4` effect target
|
|
55
|
+
* is allocated at 2x per axis, so an unscaled sigma covered half the intended distance and every
|
|
56
|
+
* blur-based Wgpu effect came out narrower than its Gl twin.
|
|
57
|
+
*
|
|
58
|
+
* ★ MEASURED FROM WIDTHS RATHER THAN READ OFF `sampleCount`, because the blur runs on POOL targets: those
|
|
59
|
+
* are allocated from a descriptor that already carries the supersampled width while their own sampleCount
|
|
60
|
+
* stays 1. A sampleCount-based factor returns 1 for exactly the targets that need scaling — the first
|
|
61
|
+
* version of this fix did that and changed nothing measurable.
|
|
62
|
+
*/
|
|
63
|
+
export function getWgpuRenderTargetTexelScale(targetWidth, canvasWidth) {
|
|
64
|
+
if (!Number.isFinite(targetWidth) || !Number.isFinite(canvasWidth) || canvasWidth <= 0)
|
|
65
|
+
return 1;
|
|
66
|
+
return Math.max(1, Math.round(targetWidth / canvasWidth));
|
|
67
|
+
}
|
|
33
68
|
export function registerWgpuBlurEffect(state) {
|
|
34
69
|
registerWgpuRenderEffect(state, 'BlurEffect', defaultWgpuBlurEffectRunner);
|
|
35
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuBlurEffect.js","sourceRoot":"","sources":["../src/wgpuBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAGlG,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,uGAAuG;AACvG,qGAAqG;AACrG,wGAAwG;AACxG,yGAAyG;AACzG,8GAA8G;AAE9G,kGAAkG;AAClG,iDAAiD;AACjD,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,IAAgC,EAChC,MAA4B;IAE5B,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"wgpuBlurEffect.js","sourceRoot":"","sources":["../src/wgpuBlurEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,16 +39,16 @@ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
|
39
39
|
let r = i32(min(f32(R), uni.u_radius));
|
|
40
40
|
var means : array<vec3f, 4>;
|
|
41
41
|
var vars : array<f32, 4>;
|
|
42
|
-
var lo = array<vec2i, 4>(vec2i(-1, -1), vec2i(0, -1), vec2i(-1, 0), vec2i(0, 0));
|
|
43
42
|
for (var q = 0; q < 4; q++) {
|
|
43
|
+
let ox = select(-r, 0, (q & 1) != 0);
|
|
44
|
+
let oy = select(-r, 0, (q & 2) != 0);
|
|
44
45
|
var sum = vec3f(0.0);
|
|
45
46
|
var sumSq = vec3f(0.0);
|
|
46
47
|
var n = 0.0;
|
|
47
48
|
for (var y = 0; y <= R; y++) {
|
|
48
49
|
for (var x = 0; x <= R; x++) {
|
|
49
50
|
if (x > r || y > r) { continue; }
|
|
50
|
-
let
|
|
51
|
-
let off = vec2f(f32(d.x), f32(d.y)) * texel;
|
|
51
|
+
let off = vec2f(f32(ox + x), f32(oy + y)) * texel;
|
|
52
52
|
let col = textureSampleLevel(tex, smp, uv + off, 0.0).rgb;
|
|
53
53
|
sum += col;
|
|
54
54
|
sumSq += col * col;
|
|
@@ -62,12 +62,18 @@ fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
|
62
62
|
}
|
|
63
63
|
var minVar = vars[0];
|
|
64
64
|
var result = means[0];
|
|
65
|
+
var tiedCount = 1.0;
|
|
65
66
|
for (var q = 1; q < 4; q++) {
|
|
66
67
|
if (vars[q] < minVar) {
|
|
67
68
|
minVar = vars[q];
|
|
68
69
|
result = means[q];
|
|
70
|
+
tiedCount = 1.0;
|
|
71
|
+
} else if (vars[q] == minVar) {
|
|
72
|
+
result += means[q];
|
|
73
|
+
tiedCount += 1.0;
|
|
69
74
|
}
|
|
70
75
|
}
|
|
76
|
+
result /= tiedCount;
|
|
71
77
|
return vec4f(result, textureSampleLevel(tex, smp, uv, 0.0).a);
|
|
72
78
|
}`;
|
|
73
79
|
//# sourceMappingURL=wgpuKuwaharaEffect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuKuwaharaEffect.js","sourceRoot":"","sources":["../src/wgpuKuwaharaEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,kGAAkG;AAClG,sGAAsG;AACtG,wEAAwE;AACxE,MAAM,UAAU,yBAAyB,CACvC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,SAAS,CAAC,CAAC;IACzG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7B,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,+BAA+B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACrF,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,KAAsB;IAC/D,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;AACrF,CAAC;AAED,uDAAuD;AACvD,MAAM,sBAAsB,GAAG,UAAU,CAAC
|
|
1
|
+
{"version":3,"file":"wgpuKuwaharaEffect.js","sourceRoot":"","sources":["../src/wgpuKuwaharaEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,kGAAkG;AAClG,sGAAsG;AACtG,wEAAwE;AACxE,MAAM,UAAU,yBAAyB,CACvC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,SAAS,CAAC,CAAC;IACzG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7B,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,+BAA+B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACrF,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,KAAsB;IAC/D,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;AACrF,CAAC;AAED,uDAAuD;AACvD,MAAM,sBAAsB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDxC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuRenderEffectPipeline.d.ts","sourceRoot":"","sources":["../src/wgpuRenderEffectPipeline.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,EACxB,wCAAwC,EACxC,iCAAiC,EACjC,eAAe,EAEhB,MAAM,0BAA0B,CAAC;AAmBlC,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,wBAAwB,EAClC,UAAU,GAAE,sBAA+B,GAC1C,IAAI,CAqBN;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE,QAAQ,CAAC,2BAA2B,CAAM,GAClD,wBAAwB,
|
|
1
|
+
{"version":3,"file":"wgpuRenderEffectPipeline.d.ts","sourceRoot":"","sources":["../src/wgpuRenderEffectPipeline.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,EACxB,wCAAwC,EACxC,iCAAiC,EACjC,eAAe,EAEhB,MAAM,0BAA0B,CAAC;AAmBlC,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,wBAAwB,EAClC,UAAU,GAAE,sBAA+B,GAC1C,IAAI,CAqBN;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE,QAAQ,CAAC,2BAA2B,CAAM,GAClD,wBAAwB,CAiB1B;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAYhH;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,wBAAwB,EAClC,UAAU,EAAE,aAAa,CAAC,YAAY,GAAG,UAAU,CAAC,GACnD,IAAI,CA2EN;AAID,wBAAgB,2CAA2C,CACzD,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,wCAAwC,GAAG,IAAI,GACrD,IAAI,CAGN;AAOD,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,iCAAiC,GAAG,IAAI,GAC9C,IAAI,CAGN;AAED,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,wBAAwB,EAClC,OAAO,EAAE,UAAU,GAAG,IAAI,GACzB,IAAI,CAEN"}
|
|
@@ -20,10 +20,10 @@ export function beginWgpuRenderEffectPipeline(state, pipeline, colorSpace = 'srg
|
|
|
20
20
|
const h = state.canvas.height;
|
|
21
21
|
const format = pipeline.options.format === 'rgba16f' ? 'rgba16float' : state.format;
|
|
22
22
|
if (pipeline.sceneTarget === null) {
|
|
23
|
-
pipeline.sceneTarget = createWgpuRenderTarget(state, w, h, format, colorSpace);
|
|
23
|
+
pipeline.sceneTarget = createWgpuRenderTarget(state, w, h, format, colorSpace, pipeline.options.sampleCount);
|
|
24
24
|
}
|
|
25
25
|
else {
|
|
26
|
-
resizeWgpuRenderTarget(state, pipeline.sceneTarget, w, h);
|
|
26
|
+
resizeWgpuRenderTarget(state, pipeline.sceneTarget, w, h, pipeline.options.sampleCount);
|
|
27
27
|
}
|
|
28
28
|
// Declare the producer's space before the pass opens: the clear value is packed sRGB input and
|
|
29
29
|
// must be decoded when the target stores linear scene color.
|
|
@@ -38,23 +38,15 @@ export function beginWgpuRenderEffectPipeline(state, pipeline, colorSpace = 'srg
|
|
|
38
38
|
beginWgpuRenderPass(state, pipeline.sceneTarget);
|
|
39
39
|
}
|
|
40
40
|
export function createWgpuRenderEffectPipeline(state, options = {}) {
|
|
41
|
-
// WebGPU effect targets are single-sample: a requested sampleCount above 1 cannot be honoured here and
|
|
42
|
-
// is normalised away. This ACCEPTS rather than rejects, deliberately. An earlier revision threw, which
|
|
43
|
-
// was authorised by a ruling that omitted the caller-migration constraint — 102 live call sites pass
|
|
44
|
-
// sampleCount 4, all at module scope, so the throw made those scene modules unloadable. Rejecting an
|
|
45
|
-
// argument a live population passes is a breaking change wearing the clothes of strictness; the fault in
|
|
46
|
-
// accept-and-drop was that it is SILENT, not that it is permissive. Do not restore the throw until
|
|
47
|
-
// sampleCount is genuinely forwarded or every caller has been migrated. The core reports through a
|
|
48
|
-
// message-free seam; enableWgpuRenderEffectGuards owns the caller-facing warning and logging dependency.
|
|
49
41
|
const requestedSampleCount = options.sampleCount ?? 1;
|
|
50
|
-
const appliedSampleCount = requestedSampleCount > 1 ?
|
|
42
|
+
const appliedSampleCount = requestedSampleCount > 1 ? 4 : 1;
|
|
51
43
|
if (requestedSampleCount !== appliedSampleCount) {
|
|
52
44
|
_sampleCountGuards.get(state)?.(state, requestedSampleCount, appliedSampleCount);
|
|
53
45
|
}
|
|
54
46
|
return {
|
|
55
47
|
options: {
|
|
56
48
|
...options,
|
|
57
|
-
|
|
49
|
+
sampleCount: appliedSampleCount,
|
|
58
50
|
},
|
|
59
51
|
sceneTarget: null,
|
|
60
52
|
pool: createWgpuRenderTargetPool(),
|
|
@@ -151,8 +143,8 @@ export function endWgpuRenderEffectPipeline(state, pipeline, operations) {
|
|
|
151
143
|
if (scratchB !== null)
|
|
152
144
|
releaseWgpuRenderTarget(pipeline.pool, scratchB);
|
|
153
145
|
}
|
|
154
|
-
// The diagnostics seam for
|
|
155
|
-
//
|
|
146
|
+
// The diagnostics seam for sample-count substitutions. Core stays free of warning strings and
|
|
147
|
+
// @flighthq/log; the separately-importable guard module installs the reporter when wanted.
|
|
156
148
|
export function setWgpuRenderEffectPipelineSampleCountGuard(state, guard) {
|
|
157
149
|
if (guard === null)
|
|
158
150
|
_sampleCountGuards.delete(state);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuRenderEffectPipeline.js","sourceRoot":"","sources":["../src/wgpuRenderEffectPipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,EACjB,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAaxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,iGAAiG;AACjG,gGAAgG;AAChG,2FAA2F;AAC3F,8BAA8B;AAC9B,kGAAkG;AAClG,kGAAkG;AAClG,+CAA+C;AAC/C,kGAAkG;AAClG,sGAAsG;AACtG,gFAAgF;AAEhF,MAAM,UAAU,6BAA6B,CAC3C,KAAsB,EACtB,QAAkC,EAClC,aAAqC,MAAM;IAE3C,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;IAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAEpF,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAClC,QAAQ,CAAC,WAAW,GAAG,sBAAsB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"wgpuRenderEffectPipeline.js","sourceRoot":"","sources":["../src/wgpuRenderEffectPipeline.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/effects-wgpu",
|
|
3
|
-
"version": "0.4.0-next.
|
|
3
|
+
"version": "0.4.0-next.1663.d9c5746",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,14 +38,14 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/adjustments": "0.4.0-next.
|
|
42
|
-
"@flighthq/color": "0.4.0-next.
|
|
43
|
-
"@flighthq/effects": "0.4.0-next.
|
|
44
|
-
"@flighthq/geometry": "0.4.0-next.
|
|
45
|
-
"@flighthq/log": "0.4.0-next.
|
|
46
|
-
"@flighthq/render-wgpu": "0.4.0-next.
|
|
47
|
-
"@flighthq/registry": "0.4.0-next.
|
|
48
|
-
"@flighthq/types": "0.4.0-next.
|
|
41
|
+
"@flighthq/adjustments": "0.4.0-next.1663.d9c5746",
|
|
42
|
+
"@flighthq/color": "0.4.0-next.1663.d9c5746",
|
|
43
|
+
"@flighthq/effects": "0.4.0-next.1663.d9c5746",
|
|
44
|
+
"@flighthq/geometry": "0.4.0-next.1663.d9c5746",
|
|
45
|
+
"@flighthq/log": "0.4.0-next.1663.d9c5746",
|
|
46
|
+
"@flighthq/render-wgpu": "0.4.0-next.1663.d9c5746",
|
|
47
|
+
"@flighthq/registry": "0.4.0-next.1663.d9c5746",
|
|
48
|
+
"@flighthq/types": "0.4.0-next.1663.d9c5746"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"@webgpu/types": "^0.1.70"
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
addLogSink,
|
|
3
|
+
clearLogOnceKeys,
|
|
4
|
+
createMemoryLogSink,
|
|
5
|
+
getMemoryLogSinkEntries,
|
|
6
|
+
removeLogSink,
|
|
7
|
+
} from '@flighthq/log/contract';
|
|
2
8
|
import {
|
|
3
9
|
acquireWgpuRenderTexture,
|
|
4
10
|
beginWgpuFrame,
|
|
@@ -23,6 +29,7 @@ import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
|
|
|
23
29
|
import { applyWgpuRenderEffectsToRenderTexture } from './wgpuRenderTextureEffect';
|
|
24
30
|
|
|
25
31
|
beforeAll(() => installWgpuMock());
|
|
32
|
+
beforeEach(() => clearLogOnceKeys());
|
|
26
33
|
|
|
27
34
|
describe('areWgpuRenderEffectGuardsEnabled', () => {
|
|
28
35
|
it('reports whether diagnostics were installed for the state', async () => {
|
|
@@ -52,9 +59,8 @@ describe('disableWgpuRenderEffectGuards', () => {
|
|
|
52
59
|
});
|
|
53
60
|
|
|
54
61
|
describe('enableWgpuRenderEffectGuards', () => {
|
|
55
|
-
// logOnce suppresses a key
|
|
56
|
-
//
|
|
57
|
-
// uses distinct effect kinds so no two share a key.
|
|
62
|
+
// logOnce suppresses a key until the next test reset. Both the fire and silence assertions still live
|
|
63
|
+
// in one test, in order, so the once-per-key behavior itself remains observable.
|
|
58
64
|
it('WARNS that an unregistered chain returned false without writing dest, then stays quiet', async () => {
|
|
59
65
|
const state = await createWgpuRenderStateForTest();
|
|
60
66
|
enableWgpuRenderEffectGuards(state);
|
|
@@ -115,29 +121,32 @@ describe('enableWgpuRenderEffectGuards', () => {
|
|
|
115
121
|
expect(again).toHaveLength(0);
|
|
116
122
|
});
|
|
117
123
|
|
|
118
|
-
it('WARNS once when
|
|
124
|
+
it('WARNS once when an unsupported sample count is substituted', async () => {
|
|
119
125
|
const state = await createWgpuRenderStateForTest();
|
|
120
126
|
enableWgpuRenderEffectGuards(state);
|
|
121
127
|
|
|
122
128
|
let pipeline = createWgpuRenderEffectPipeline(state);
|
|
123
129
|
const entries = captureLog(() => {
|
|
124
|
-
pipeline = createWgpuRenderEffectPipeline(state, { sampleCount:
|
|
125
|
-
createWgpuRenderEffectPipeline(state, { sampleCount:
|
|
130
|
+
pipeline = createWgpuRenderEffectPipeline(state, { sampleCount: 8 });
|
|
131
|
+
createWgpuRenderEffectPipeline(state, { sampleCount: 8 });
|
|
126
132
|
});
|
|
127
133
|
|
|
128
|
-
expect(pipeline.options.sampleCount).toBe(
|
|
134
|
+
expect(pipeline.options.sampleCount).toBe(4);
|
|
129
135
|
expect(entries).toHaveLength(1);
|
|
130
|
-
expect(messageOf(entries[0])).toContain('sampleCount
|
|
131
|
-
expect(messageOf(entries[0])).toContain('
|
|
132
|
-
expect(entries[0]
|
|
136
|
+
expect(messageOf(entries[0])).toContain('sampleCount 8 requested');
|
|
137
|
+
expect(messageOf(entries[0])).toContain('effect targets support 1 or 4');
|
|
138
|
+
expect(messageOf(entries[0])).toContain('continuing with sampleCount 4');
|
|
139
|
+
expect(messageOf(entries[0])).not.toContain('multisampling was NOT applied');
|
|
140
|
+
expect(entries[0]?.data).toMatchObject({ appliedSampleCount: 4, requestedSampleCount: 8 });
|
|
133
141
|
});
|
|
134
142
|
|
|
135
|
-
it('stays SILENT when the requested sample
|
|
143
|
+
it('stays SILENT when the requested sample counts are supported', async () => {
|
|
136
144
|
const state = await createWgpuRenderStateForTest();
|
|
137
145
|
enableWgpuRenderEffectGuards(state);
|
|
138
146
|
|
|
139
147
|
const entries = captureLog(() => {
|
|
140
148
|
expect(createWgpuRenderEffectPipeline(state, { sampleCount: 1 }).options.sampleCount).toBe(1);
|
|
149
|
+
expect(createWgpuRenderEffectPipeline(state, { sampleCount: 4 }).options.sampleCount).toBe(4);
|
|
141
150
|
});
|
|
142
151
|
|
|
143
152
|
expect(entries).toHaveLength(0);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createWgpuRenderStateForTest, installWgpuMock } from '@flighthq/render-wgpu/contract';
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
getWgpuRenderTargetTexelScale,
|
|
4
5
|
applyBlurEffectToWgpu,
|
|
5
6
|
applyGaussianBlurToWgpu,
|
|
6
7
|
defaultWgpuBlurEffectRunner,
|
|
@@ -28,6 +29,33 @@ describe('defaultWgpuBlurEffectRunner', () => {
|
|
|
28
29
|
});
|
|
29
30
|
});
|
|
30
31
|
|
|
32
|
+
describe('getWgpuRenderTargetTexelScale', () => {
|
|
33
|
+
// ★ THE DEFECT: sigma is in logical pixels, the pass steps in texels, and a supersampled effect target
|
|
34
|
+
// holds two texels per logical pixel. Every blur-based Wgpu effect ran half as wide as its Gl twin.
|
|
35
|
+
// Measured on effect-bloom, halo mean wgpu-webgl: -15.87 before, +1.12 after, with 41% of halo pixels
|
|
36
|
+
// darker and 0% brighter beforehand — one-directional, which is a too-narrow blur rather than a
|
|
37
|
+
// different one.
|
|
38
|
+
it('reports 2 for a supersampled target and 1 at native density', () => {
|
|
39
|
+
expect(getWgpuRenderTargetTexelScale(1600, 800)).toBe(2);
|
|
40
|
+
expect(getWgpuRenderTargetTexelScale(800, 800)).toBe(1);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// A target SMALLER than the canvas is a downsampled chain, not a negative supersample: scaling sigma
|
|
44
|
+
// below its authored value would narrow the blur further, so the factor floors at 1.
|
|
45
|
+
it('never scales below 1', () => {
|
|
46
|
+
expect(getWgpuRenderTargetTexelScale(400, 800)).toBe(1);
|
|
47
|
+
expect(getWgpuRenderTargetTexelScale(1, 800)).toBe(1);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Degenerate inputs return the identity rather than NaN or Infinity: a bad scale silently multiplies
|
|
51
|
+
// sigma and the failure would surface as a wrong picture rather than an error.
|
|
52
|
+
it('returns 1 for a zero or non-finite width instead of propagating it', () => {
|
|
53
|
+
expect(getWgpuRenderTargetTexelScale(800, 0)).toBe(1);
|
|
54
|
+
expect(getWgpuRenderTargetTexelScale(Number.NaN, 800)).toBe(1);
|
|
55
|
+
expect(getWgpuRenderTargetTexelScale(800, Number.POSITIVE_INFINITY)).toBe(1);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
31
59
|
describe('registerWgpuBlurEffect', () => {
|
|
32
60
|
it('registers the default runner under BlurEffect', async () => {
|
|
33
61
|
const state = await createWgpuRenderStateForTest();
|
|
@@ -71,6 +71,19 @@ describe('beginWgpuRenderEffectPipeline', () => {
|
|
|
71
71
|
expect(pipeline.sceneTarget?.clearColors).toEqual([]);
|
|
72
72
|
endWgpuRenderEffectPipeline(state, pipeline, []);
|
|
73
73
|
});
|
|
74
|
+
|
|
75
|
+
it('realizes a four-sample scene target at twice the canvas extent', async () => {
|
|
76
|
+
const state = await createWgpuRenderStateForTest();
|
|
77
|
+
const pipeline = createWgpuRenderEffectPipeline(state, { sampleCount: 4 });
|
|
78
|
+
|
|
79
|
+
beginWgpuFrame(state);
|
|
80
|
+
beginWgpuRenderEffectPipeline(state, pipeline);
|
|
81
|
+
|
|
82
|
+
expect(pipeline.sceneTarget?.width).toBe(state.canvas.width * 2);
|
|
83
|
+
expect(pipeline.sceneTarget?.height).toBe(state.canvas.height * 2);
|
|
84
|
+
expect(pipeline.sceneTarget?.sampleCount).toBe(4);
|
|
85
|
+
endWgpuRenderEffectPipeline(state, pipeline, []);
|
|
86
|
+
});
|
|
74
87
|
});
|
|
75
88
|
|
|
76
89
|
describe('createWgpuRenderEffectPipeline', () => {
|
|
@@ -97,31 +110,28 @@ describe('createWgpuRenderEffectPipeline', () => {
|
|
|
97
110
|
expect(pipeline.options.format).toBe('rgba16f');
|
|
98
111
|
});
|
|
99
112
|
|
|
100
|
-
|
|
101
|
-
// ACCEPT an unsupported count and normalise it. If this starts throwing again, the callers were not
|
|
102
|
-
// migrated first.
|
|
103
|
-
it('accepts an unsupported multisample request instead of refusing to build', async () => {
|
|
113
|
+
it('retains the supported four-sample request', async () => {
|
|
104
114
|
const state = await createWgpuRenderStateForTest();
|
|
105
115
|
|
|
106
116
|
const pipeline = createWgpuRenderEffectPipeline(state, { sampleCount: 4 });
|
|
107
117
|
|
|
108
|
-
expect(pipeline.options.sampleCount).toBe(
|
|
118
|
+
expect(pipeline.options.sampleCount).toBe(4);
|
|
109
119
|
});
|
|
110
120
|
|
|
111
121
|
describe('setWgpuRenderEffectPipelineSampleCountGuard', () => {
|
|
112
122
|
it('reports the requested and applied sample counts through the optional diagnostics seam', async () => {
|
|
113
123
|
const state = await createWgpuRenderStateForTest();
|
|
114
|
-
const
|
|
124
|
+
const substitutions: Array<[number, number]> = [];
|
|
115
125
|
setWgpuRenderEffectPipelineSampleCountGuard(state, (_state, requested, applied) => {
|
|
116
|
-
|
|
126
|
+
substitutions.push([requested, applied]);
|
|
117
127
|
});
|
|
118
128
|
|
|
119
|
-
createWgpuRenderEffectPipeline(state, { sampleCount:
|
|
120
|
-
expect(
|
|
129
|
+
createWgpuRenderEffectPipeline(state, { sampleCount: 2 });
|
|
130
|
+
expect(substitutions).toEqual([[2, 4]]);
|
|
121
131
|
|
|
122
132
|
setWgpuRenderEffectPipelineSampleCountGuard(state, null);
|
|
123
133
|
createWgpuRenderEffectPipeline(state, { sampleCount: 8 });
|
|
124
|
-
expect(
|
|
134
|
+
expect(substitutions).toEqual([[2, 4]]);
|
|
125
135
|
});
|
|
126
136
|
});
|
|
127
137
|
|