#version 450 // should get 3 SPV types for S: no layout, 140, and 430, plus extras for interpolation or invariant differences struct S { highp uvec3 a; mediump mat2 b[4]; lowp uint c; }; layout(set = 0, binding = 0, std140) uniform Block140 { mediump int u; S s[2][3]; mediump vec2 v; } inst140; layout(set = 0, binding = 1, std430) buffer Block430 { mediump int u; S s[2][3]; mediump vec2 v; } inst430; S s; // should get 5 SPV types for T: no layout, 140/row, 140/col, 430/row, and 430/col struct T { mat2 m; int a; }; T t; struct Nestor { T nestorT; }; layout(set = 1, binding = 0, std140) uniform Bt1 { layout(row_major) Nestor nt; } Btn1; layout(set = 1, binding = 0, std140) uniform Bt2 { layout(column_major) Nestor nt; } Btn2; layout(row_major, set = 1, binding = 0, std140) uniform Bt3 { layout(column_major) Nestor ntcol; Nestor ntrow; // should be row major decoration version of Nestor } Btn3; layout(set = 1, binding = 0, std430) buffer bBt1 { layout(row_major) Nestor nt; } bBtn1; layout(set = 1, binding = 0, std430) buffer bBt2 { layout(column_major) Nestor nt; } bBtn2; layout(set = 1, binding = 0, std430) buffer bBt3 { layout(row_major) Nestor ntcol; Nestor ntrow; // should be col major decoration version of Nestor } bBtn3; void main() { } flat out S sout; invariant out S soutinv;