[glsl][ir] Add padding to inline structs

The inline struct emission follows a different path from the non-inline,
make sure inline structs are also padded.

Bug: 42251044
Change-Id: Ib7cbb113ec16dc722601485edad3fe1a4fadcfbf
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/210094
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/glsl/writer/access_test.cc b/src/tint/lang/glsl/writer/access_test.cc
index 3d24953..a7a9ad6 100644
--- a/src/tint/lang/glsl/writer/access_test.cc
+++ b/src/tint/lang/glsl/writer/access_test.cc
@@ -979,6 +979,7 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
 } v_1;
 void main() {
diff --git a/src/tint/lang/glsl/writer/printer/printer.cc b/src/tint/lang/glsl/writer/printer/printer.cc
index d8e1991..5ce9bf1 100644
--- a/src/tint/lang/glsl/writer/printer/printer.cc
+++ b/src/tint/lang/glsl/writer/printer/printer.cc
@@ -661,25 +661,12 @@
             TINT_ICE_ON_NO_MATCH);
     }
 
-    void EmitStructType(const core::type::Struct* str) {
-        if (!emitted_structs_.Add(str)) {
-            return;
-        }
-
-        // This does not append directly to the preamble because a struct may require other
-        // structs to get emitted before it. So, the struct emits into a temporary text buffer, then
-        // anything it depends on will emit to the preamble first, and then it copies the text
-        // buffer into the preamble.
-        TextBuffer str_buf;
-        Line(&str_buf) << "\n" << "struct " << StructName(str) << " {";
-
+    void EmitStructMembers(TextBuffer& str_buf, const core::type::Struct* str) {
         bool is_host_shareable = host_shareable_structs_.Contains(str);
-
         Vector<std::optional<uint32_t>, 4> new_struct_to_old;
 
         auto add_padding = [&](uint32_t size) {
             auto pad_size = size / 4;
-
             for (size_t i = 0; i < pad_size; ++i) {
                 std::string name;
                 do {
@@ -691,8 +678,6 @@
             }
         };
 
-        str_buf.IncrementIndent();
-
         uint32_t glsl_offset = 0;
         for (auto* mem : str->Members()) {
             auto out = Line(&str_buf);
@@ -733,14 +718,31 @@
             add_padding(str->Size() - glsl_offset);
         }
 
-        str_buf.DecrementIndent();
-        Line(&str_buf) << "};";
-
         // If the lengths differ then we've added padding, so we need to handle it when constructing
         // later.
         if (new_struct_to_old.Length() != str->Members().Length()) {
             struct_to_padding_struct_ids_.Add(str, new_struct_to_old);
         }
+    }
+
+    void EmitStructType(const core::type::Struct* str) {
+        if (!emitted_structs_.Add(str)) {
+            return;
+        }
+
+        // This does not append directly to the preamble because a struct may require other
+        // structs to get emitted before it. So, the struct emits into a temporary text buffer, then
+        // anything it depends on will emit to the preamble first, and then it copies the text
+        // buffer into the preamble.
+        TextBuffer str_buf;
+        Line(&str_buf) << "\n" << "struct " << StructName(str) << " {";
+
+        str_buf.IncrementIndent();
+
+        EmitStructMembers(str_buf, str);
+
+        str_buf.DecrementIndent();
+        Line(&str_buf) << "};";
 
         preamble_buffer_.Append(str_buf);
     }
@@ -1042,11 +1044,9 @@
         {
             ScopedIndent si(current_buffer_);
 
-            for (auto* mem : str->Members()) {
-                auto out = Line();
-                EmitTypeAndName(out, mem->Type(), mem->Name().Name());
-                out << ";";
-            }
+            TextBuffer str_buf;
+            EmitStructMembers(str_buf, str);
+            current_buffer_->Append(str_buf);
         }
 
         Line() << "} " << name << ";";
diff --git a/src/tint/lang/glsl/writer/type_test.cc b/src/tint/lang/glsl/writer/type_test.cc
index 9ce6a97..83a894c 100644
--- a/src/tint/lang/glsl/writer/type_test.cc
+++ b/src/tint/lang/glsl/writer/type_test.cc
@@ -1070,5 +1070,36 @@
         GlslStorageTextureData{core::type::TextureDimension::kCubeArray, core::Access::kReadWrite,
                                TextureDataType::kU32, "uimageCubeArray"}));
 
+TEST_F(GlslWriterTest, EmitType_PadInlineStruct) {
+    Vector members{ty.Get<core::type::StructMember>(
+                       b.ir.symbols.New("padding"), ty.u32(), /* index */ 0u,
+                       /* offset */ 0u, /* align */ 4u, /* size */ 20u, core::IOAttributes{}),
+                   ty.Get<core::type::StructMember>(
+                       b.ir.symbols.New("arr"), ty.array<u32>(), /* index */ 1u,
+                       /* offset */ 20u, /* align */ 4u, /* size */ 32u, core::IOAttributes{})};
+
+    auto* S = ty.Struct(mod.symbols.New("S"), std::move(members));
+
+    auto* var = b.Var("v", storage, S, core::Access::kReadWrite);
+    var->SetBindingPoint(0, 0);
+    b.ir.root_block->Append(var);
+
+    ASSERT_TRUE(Generate()) << err_ << output_.glsl;
+    EXPECT_EQ(output_.glsl, GlslHeader() + R"(
+layout(binding = 0, std430)
+buffer S_1_ssbo {
+  uint padding;
+  uint tint_pad;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+  uint arr[];
+} v;
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+}
+)");
+}
+
 }  // namespace
 }  // namespace tint::glsl::writer
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl
index 84d8be9..528403f 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl
@@ -3,6 +3,7 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
 } v;
 int counter = 0;
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl
index c6724b7..d830130 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl
@@ -3,6 +3,7 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
 } v;
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_builtin.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_builtin.wgsl.expected.ir.glsl
index 7f90d41..4303691 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_builtin.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_builtin.wgsl.expected.ir.glsl
@@ -3,6 +3,7 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
 } v;
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_fn.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_fn.wgsl.expected.ir.glsl
index c3c797e..396ed4f 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_fn.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_fn.wgsl.expected.ir.glsl
@@ -3,6 +3,7 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
 } v_1;
 void a(mat2x3 m) {
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_private.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_private.wgsl.expected.ir.glsl
index 39e5856..141d373 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_private.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_private.wgsl.expected.ir.glsl
@@ -3,6 +3,7 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
 } v;
 mat2x3 p = mat2x3(vec3(0.0f), vec3(0.0f));
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_storage.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_storage.wgsl.expected.ir.glsl
index f5c26a4..655dffa 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_storage.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_storage.wgsl.expected.ir.glsl
@@ -3,6 +3,7 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
 } v;
 layout(binding = 1, std430)
diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_workgroup.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_workgroup.wgsl.expected.ir.glsl
index 445bb35..114c5d6 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_workgroup.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_workgroup.wgsl.expected.ir.glsl
@@ -3,6 +3,7 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
 } v;
 shared mat2x3 w;
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl
index 8ce9705..78711c8 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl
@@ -3,7 +3,9 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
 } v;
 int counter = 0;
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl
index 8441f55..9a0c261 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl
@@ -3,7 +3,9 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
 } v;
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_builtin.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_builtin.wgsl.expected.ir.glsl
index 3861744..28bc43c 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_builtin.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_builtin.wgsl.expected.ir.glsl
@@ -3,7 +3,9 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
 } v;
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_fn.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_fn.wgsl.expected.ir.glsl
index ce9d2d4..79b3378 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_fn.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_fn.wgsl.expected.ir.glsl
@@ -3,7 +3,9 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
 } v_1;
 void a(mat3 m) {
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_private.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_private.wgsl.expected.ir.glsl
index e32aa4a..463b654 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_private.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_private.wgsl.expected.ir.glsl
@@ -3,7 +3,9 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
 } v;
 mat3 p = mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f));
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_storage.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_storage.wgsl.expected.ir.glsl
index fc229e2..562c47e 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_storage.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_storage.wgsl.expected.ir.glsl
@@ -3,7 +3,9 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
 } v;
 layout(binding = 1, std430)
diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_workgroup.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_workgroup.wgsl.expected.ir.glsl
index 6cfa424..d8241a0 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_workgroup.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_workgroup.wgsl.expected.ir.glsl
@@ -3,7 +3,9 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
 } v;
 shared mat3 w;
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl
index d6a2adb..d5e7138 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/dynamic_index_via_ptr.wgsl.expected.ir.glsl
@@ -3,8 +3,11 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
+  uint tint_pad_2;
   vec3 tint_symbol_col3;
 } v;
 int counter = 0;
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl
index 186cf0d..f4e6fb7 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/static_index_via_ptr.wgsl.expected.ir.glsl
@@ -3,8 +3,11 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
+  uint tint_pad_2;
   vec3 tint_symbol_col3;
 } v;
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_builtin.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_builtin.wgsl.expected.ir.glsl
index 65524fb..8b8520c 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_builtin.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_builtin.wgsl.expected.ir.glsl
@@ -3,8 +3,11 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
+  uint tint_pad_2;
   vec3 tint_symbol_col3;
 } v;
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_fn.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_fn.wgsl.expected.ir.glsl
index 876d6bb..7dadf06 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_fn.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_fn.wgsl.expected.ir.glsl
@@ -3,8 +3,11 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
+  uint tint_pad_2;
   vec3 tint_symbol_col3;
 } v_1;
 void a(mat4x3 m) {
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_private.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_private.wgsl.expected.ir.glsl
index 21725f1..2999953 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_private.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_private.wgsl.expected.ir.glsl
@@ -3,8 +3,11 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
+  uint tint_pad_2;
   vec3 tint_symbol_col3;
 } v;
 mat4x3 p = mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f));
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_storage.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_storage.wgsl.expected.ir.glsl
index fa97693f..039c91d 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_storage.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_storage.wgsl.expected.ir.glsl
@@ -3,8 +3,11 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
+  uint tint_pad_2;
   vec3 tint_symbol_col3;
 } v;
 layout(binding = 1, std430)
diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_workgroup.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_workgroup.wgsl.expected.ir.glsl
index eb841d4..c0f583b 100644
--- a/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_workgroup.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_workgroup.wgsl.expected.ir.glsl
@@ -3,8 +3,11 @@
 layout(binding = 0, std140)
 uniform tint_symbol_1_std140_1_ubo {
   vec3 tint_symbol_col0;
+  uint tint_pad;
   vec3 tint_symbol_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_col2;
+  uint tint_pad_2;
   vec3 tint_symbol_col3;
 } v;
 shared mat4x3 w;
diff --git a/test/tint/buffer/uniform/types/mat2x3_f32.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/types/mat2x3_f32.wgsl.expected.ir.glsl
index 26a17b8..a4f1c2d 100644
--- a/test/tint/buffer/uniform/types/mat2x3_f32.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/types/mat2x3_f32.wgsl.expected.ir.glsl
@@ -3,6 +3,7 @@
 layout(binding = 0, std140)
 uniform tint_symbol_2_std140_1_ubo {
   vec3 tint_symbol_1_col0;
+  uint tint_pad;
   vec3 tint_symbol_1_col1;
 } v;
 layout(binding = 1, std430)
diff --git a/test/tint/buffer/uniform/types/mat3x3_f32.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/types/mat3x3_f32.wgsl.expected.ir.glsl
index 4eb670f..3d92efc 100644
--- a/test/tint/buffer/uniform/types/mat3x3_f32.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/types/mat3x3_f32.wgsl.expected.ir.glsl
@@ -3,7 +3,9 @@
 layout(binding = 0, std140)
 uniform tint_symbol_2_std140_1_ubo {
   vec3 tint_symbol_1_col0;
+  uint tint_pad;
   vec3 tint_symbol_1_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_1_col2;
 } v;
 layout(binding = 1, std430)
diff --git a/test/tint/buffer/uniform/types/mat4x3_f32.wgsl.expected.ir.glsl b/test/tint/buffer/uniform/types/mat4x3_f32.wgsl.expected.ir.glsl
index 8ce4a72..73d5fc6 100644
--- a/test/tint/buffer/uniform/types/mat4x3_f32.wgsl.expected.ir.glsl
+++ b/test/tint/buffer/uniform/types/mat4x3_f32.wgsl.expected.ir.glsl
@@ -3,8 +3,11 @@
 layout(binding = 0, std140)
 uniform tint_symbol_2_std140_1_ubo {
   vec3 tint_symbol_1_col0;
+  uint tint_pad;
   vec3 tint_symbol_1_col1;
+  uint tint_pad_1;
   vec3 tint_symbol_1_col2;
+  uint tint_pad_2;
   vec3 tint_symbol_1_col3;
 } v;
 layout(binding = 1, std430)