From 56ce439ff5d6cf9119bfbda56ee7bc28b4a437ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Wed, 28 Jul 2021 20:48:34 +0100 Subject: [PATCH] [glsl-in] Implement layouting for composite types --- src/front/glsl/offset.rs | 34 +++++++++++++++++++++++++++- src/front/glsl/parser.rs | 4 ++++ tests/out/wgsl/246-collatz-comp.wgsl | 2 +- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/front/glsl/offset.rs b/src/front/glsl/offset.rs index f20c30c28b..6d1dee99c3 100644 --- a/src/front/glsl/offset.rs +++ b/src/front/glsl/offset.rs @@ -115,7 +115,39 @@ pub fn calculate_offset( (align, align * columns as u32) } - TypeInner::Struct { .. } => todo!(), + TypeInner::Struct { + ref members, + top_level, + .. + } => { + let mut span = 0; + let mut align = 0; + let mut members = members.clone(); + let name = types[ty].name.clone(); + + for member in members.iter_mut() { + let info = calculate_offset(member.ty, meta, layout, types, constants)?; + + span = align_up(span, info.align); + align = align.max(info.align); + + member.ty = info.ty; + member.offset = span; + + span += info.span; + } + + ty = types.fetch_or_append(Type { + name, + inner: TypeInner::Struct { + top_level, + members, + span, + }, + }); + + (align, span) + } _ => { return Err(ErrorKind::SemanticError( meta, diff --git a/src/front/glsl/parser.rs b/src/front/glsl/parser.rs index 8068377f7f..3f01e926c4 100644 --- a/src/front/glsl/parser.rs +++ b/src/front/glsl/parser.rs @@ -993,6 +993,7 @@ impl<'source, 'program, 'options> Parser<'source, 'program, 'options> { layout: StructLayout, ) -> Result { let mut span = 0; + let mut align = 0; loop { // TODO: type_qualifier @@ -1016,6 +1017,7 @@ impl<'source, 'program, 'options> Parser<'source, 'program, 'options> { )?; span = offset::align_up(span, info.align); + align = align.max(info.align); members.push(StructMember { name: Some(name), @@ -1031,6 +1033,8 @@ impl<'source, 'program, 'options> Parser<'source, 'program, 'options> { } } + span = offset::align_up(span, align); + Ok(span) } diff --git a/tests/out/wgsl/246-collatz-comp.wgsl b/tests/out/wgsl/246-collatz-comp.wgsl index 21fde3265c..3ae8876394 100644 --- a/tests/out/wgsl/246-collatz-comp.wgsl +++ b/tests/out/wgsl/246-collatz-comp.wgsl @@ -1,6 +1,6 @@ [[block]] struct PrimeIndices { - indices: [[stride(4)]] array; + indices: [[stride(16)]] array; }; [[group(0), binding(0)]]