[glsl-in] Support commas in structure definitions (#2400)

This commit is contained in:
Fredrik Fornwall
2023-07-17 17:22:25 +02:00
committed by GitHub
parent 04ef22f6dc
commit dfd88ee485
3 changed files with 47 additions and 25 deletions

View File

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

View File

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

View File

@@ -13,6 +13,16 @@ struct TestStruct {
b: f32,
}
struct LightScatteringParams {
BetaRay: f32,
BetaMie: array<f32, 3>,
HGg: f32,
DistanceMul: array<f32, 4>,
BlendCoeff: f32,
SunDirection: vec3<f32>,
SunColor: vec3<f32>,
}
struct FragmentOutput {
@location(0) position: vec2<f32>,
@location(1) a: vec2<f32>,