Skip to content

Commit

Permalink
[glsl-in] Support commas in structure definitions
Browse files Browse the repository at this point in the history
Fixes #2384.
  • Loading branch information
fornwall committed Jul 7, 2023
1 parent 7624d6c commit 07aa64a
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 21 deletions.
57 changes: 36 additions & 21 deletions src/front/glsl/parser/declarations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -629,34 +629,49 @@ impl<'source> ParsingContext<'source> {
// TODO: type_qualifier

let (mut ty, mut meta) = self.parse_type_non_void(frontend)?;
let (name, end_meta) = self.expect_ident(frontend)?;
let (name, mut end_meta) = self.expect_ident(frontend)?;

let mut names = vec![name];
while let Some(&Token {
value: TokenValue::Comma,
..
}) = self.peek(frontend)
{
self.bump(frontend)?;

let (next_name, next_end_meta) = self.expect_ident(frontend)?;
names.push(next_name);
end_meta = next_end_meta;
}

meta.subsume(end_meta);

self.parse_array_specifier(frontend, &mut meta, &mut ty)?;

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;
for name in names {
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;
Expand Down
13 changes: 13 additions & 0 deletions src/front/glsl/parser_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -731,6 +731,19 @@ fn structs() {
"#,
)
.unwrap_err();

frontend
.parse(
&Options::from(ShaderStage::Vertex),
r#"
struct LightScatteringParams {
float BetaRay, BetaMie, HGg, DistanceMul, BlendCoeff;
vec3 SunDirection, SunColor;
};
void main() {}
"#,
)
.unwrap();
}

#[test]
Expand Down
9 changes: 9 additions & 0 deletions tests/in/glsl/struct-member-list.vert
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
struct LightScatteringParams {
float BetaRay, BetaMie, HGg, DistanceMul, BlendCoeff;
vec3 SunDirection, SunColor;
};

void main() {
gl_Position = vec4(1.0, 1.0, 1.0, 1.0);
}

27 changes: 27 additions & 0 deletions tests/out/wgsl/struct-member-list-vert.wgsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
struct LightScatteringParams {
BetaRay: f32,
BetaMie: f32,
HGg: f32,
DistanceMul: f32,
BlendCoeff: f32,
SunDirection: vec3<f32>,
SunColor: vec3<f32>,
}

struct VertexOutput {
@builtin(position) member: vec4<f32>,
}

var<private> gl_Position: vec4<f32>;

fn main_1() {
gl_Position = vec4<f32>(1.0, 1.0, 1.0, 1.0);
return;
}

@vertex
fn main() -> VertexOutput {
main_1();
let _e1 = gl_Position;
return VertexOutput(_e1);
}

0 comments on commit 07aa64a

Please sign in to comment.