Skip to content

Commit e0540c5

Browse files
authored
Add chained swizzle tests (#4699)
Add some additional tests of chained swizzles ending in a single element swizzle. These are regression tests for the bug caught in: https://crbug.com/553777974
1 parent de0f06a commit e0540c5

1 file changed

Lines changed: 34 additions & 0 deletions

File tree

‎src/webgpu/shader/validation/expression/access/vector.spec.ts‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ const kConcreteCases = {
142142
gbra: { wgsl: 'let r : vec4<T> = v.gbra;', ok: (width: number) => width > 3 },
143143

144144
// swizzle chains
145+
xy_x: { wgsl: 'let r : T = v.xy.x;', ok: true },
145146
xy_yx: { wgsl: 'let r : vec2<T> = v.xy.yx;', ok: true },
146147
xyx_xxy: { wgsl: 'let r : vec3<T> = v.xyx.xxy;', ok: true },
147148
xyz_zyx: { wgsl: 'let r : vec3<T> = v.xyz.zyx;', ok: (width: number) => width > 2 },
@@ -346,6 +347,7 @@ const kAbstractCases = {
346347
gbra: { wgsl: 'const r = V.gbra;', result_width: 4, ok: (width: number) => width > 3 },
347348

348349
// swizzle chains
350+
xy_x: { wgsl: 'const r = V.xy.x;', result_width: 1, ok: true },
349351
xy_yx: { wgsl: 'const r = V.xy.yx;', result_width: 2, ok: true },
350352
xyx_xxy: { wgsl: 'const r = V.xyx.xxy;', result_width: 3, ok: true },
351353
xyz_zyx: { wgsl: 'const r = V.xyz.zyx;', result_width: 3, ok: (width: number) => width > 2 },
@@ -479,3 +481,35 @@ fn main() {
479481
const pass = convertible && (typeof c.ok === 'function' ? c.ok(t.params.vector_width) : c.ok);
480482
t.expectCompileResult(pass, code);
481483
});
484+
485+
const kChainedSwizzleCases = {
486+
// Single-element swizzle of a swizzle
487+
xy_x: 'xy.x',
488+
// Single-element swizzle of a swizzle with duplicate components
489+
xx_x: 'xx.x',
490+
// Multi-element swizzle of a swizzle
491+
xyy_xy: 'xyy.xy',
492+
};
493+
494+
g.test('chained_swizzle')
495+
.desc('Validate that chained swizzles on memory views succeed during pipeline creation.')
496+
.params(u =>
497+
u
498+
.combine('address_space', ['function', 'private'] as const)
499+
.combine('case', keysOf(kChainedSwizzleCases))
500+
)
501+
.fn(t => {
502+
const chain = kChainedSwizzleCases[t.params.case];
503+
const code =
504+
t.params.address_space === 'private' ? 'var<private> v = vec4f(1.0, 2.0, 3.0, 4.0);' : '';
505+
const statements =
506+
t.params.address_space === 'function'
507+
? ['var v = vec4f(1.0, 2.0, 3.0, 4.0);', `let a = v.${chain};`, '_ = a;']
508+
: [`let a = v.${chain};`, '_ = a;'];
509+
510+
t.expectPipelineResult({
511+
expectedResult: true,
512+
code,
513+
statements,
514+
});
515+
});

0 commit comments

Comments
 (0)