@@ -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