From dfd88ee485304fdbadeda32f9e8ebbe95a2ec538 Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Mon, 17 Jul 2023 17:22:25 +0200 Subject: [PATCH] [glsl-in] Support commas in structure definitions (#2400) --- src/front/glsl/parser/declarations.rs | 57 +++++++++++++++------------ tests/in/glsl/declarations.frag | 5 +++ tests/out/wgsl/declarations-frag.wgsl | 10 +++++ 3 files changed, 47 insertions(+), 25 deletions(-) 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,36 +628,43 @@ 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); + + 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; + + if self.bump_if(frontend, TokenValue::Comma).is_none() { + break; + } + } self.expect(frontend, TokenValue::Semicolon)?; - 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; - 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,