diff --git a/src/front/glsl/parser/declarations.rs b/src/front/glsl/parser/declarations.rs index 79bf1bc8cb..4e43e75c86 100644 --- a/src/front/glsl/parser/declarations.rs +++ b/src/front/glsl/parser/declarations.rs @@ -628,35 +628,42 @@ impl<'source> ParsingContext<'source> { loop { // TODO: type_qualifier - let (mut ty, mut meta) = self.parse_type_non_void(frontend)?; - let (name, end_meta) = self.expect_ident(frontend)?; + let (base_ty, mut meta) = self.parse_type_non_void(frontend)?; - meta.subsume(end_meta); + loop { + let (name, name_meta) = self.expect_ident(frontend)?; + let mut ty = base_ty; + self.parse_array_specifier(frontend, &mut meta, &mut ty)?; - self.parse_array_specifier(frontend, &mut meta, &mut ty)?; + meta.subsume(name_meta); - self.expect(frontend, TokenValue::Semicolon)?; + let info = offset::calculate_offset( + ty, + meta, + layout, + &mut frontend.module.types, + &mut frontend.errors, + ); - let info = offset::calculate_offset( - ty, - meta, - layout, - &mut frontend.module.types, - &mut frontend.errors, - ); - - let member_alignment = info.align; - span = member_alignment.round_up(span); - align = member_alignment.max(align); - - members.push(StructMember { - name: Some(name), - ty: info.ty, - binding: None, - offset: span, - }); - - span += info.span; + let member_alignment = info.align; + span = member_alignment.round_up(span); + align = member_alignment.max(align); + + members.push(StructMember { + name: Some(name), + ty: info.ty, + binding: None, + offset: span, + }); + + span += info.span; + + if self.bump_if(frontend, TokenValue::Comma).is_none() { + break; + } + } + + self.expect(frontend, TokenValue::Semicolon)?; if let TokenValue::RightBrace = self.expect_peek(frontend)?.value { break; diff --git a/tests/in/glsl/declarations.frag b/tests/in/glsl/declarations.frag index 75122bc46c..7ef8b56a7c 100644 --- a/tests/in/glsl/declarations.frag +++ b/tests/in/glsl/declarations.frag @@ -21,6 +21,11 @@ struct TestStruct { float array_2d[2][2]; float array_toomanyd[2][2][2][2][2][2][2]; +struct LightScatteringParams { + float BetaRay, BetaMie[3], HGg, DistanceMul[4], BlendCoeff; + vec3 SunDirection, SunColor; +}; + void main() { const vec3 positions[2] = vec3[2]( vec3(-1.0, 1.0, 0.0), diff --git a/tests/out/wgsl/declarations-frag.wgsl b/tests/out/wgsl/declarations-frag.wgsl index bdcca29e0f..23c697a008 100644 --- a/tests/out/wgsl/declarations-frag.wgsl +++ b/tests/out/wgsl/declarations-frag.wgsl @@ -13,6 +13,16 @@ struct TestStruct { b: f32, } +struct LightScatteringParams { + BetaRay: f32, + BetaMie: array, + HGg: f32, + DistanceMul: array, + BlendCoeff: f32, + SunDirection: vec3, + SunColor: vec3, +} + struct FragmentOutput { @location(0) position: vec2, @location(1) a: vec2,