diff --git a/src/front/glsl/parser.rs b/src/front/glsl/parser.rs index b644de61a4..d9bf53f749 100644 --- a/src/front/glsl/parser.rs +++ b/src/front/glsl/parser.rs @@ -921,13 +921,24 @@ impl<'source, 'program> Parser<'source, 'program> { ty_name: String, mut meta: SourceMetadata, ) -> Result { - let layout = qualifiers - .iter() - .find_map(|&(ref qualifier, _)| match *qualifier { - TypeQualifier::Layout(layout) => Some(layout), - _ => None, - }) - .unwrap_or(StructLayout::Std140); + let mut storage = None; + let mut layout = None; + + for &(ref qualifier, _) in qualifiers { + match *qualifier { + TypeQualifier::StorageQualifier(StorageQualifier::StorageClass(c)) => { + storage = Some(c) + } + TypeQualifier::Layout(l) => layout = Some(l), + _ => continue, + } + } + + let layout = match (layout, storage) { + (Some(layout), _) => layout, + (None, Some(StorageClass::Storage { .. })) => StructLayout::Std430, + _ => StructLayout::Std140, + }; let mut members = Vec::new(); let span = self.parse_struct_declaration_list(&mut members, layout)?; diff --git a/tests/out/wgsl/246-collatz-comp.wgsl b/tests/out/wgsl/246-collatz-comp.wgsl index 3ae8876394..21fde3265c 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(16)]] array; + indices: [[stride(4)]] array; }; [[group(0), binding(0)]]