GLSL: Change Add[Spirv]BlockAttribute to support GLSL

Modify the AddSpirvBlockAttribute transform to fix top-level structure
access of uniform, storage and push-constant buffers for use in the
GLSL backend. The small change to the transform makes the transform
wrap host-sharable buffers, if they're also used as a
non-host-sharable structure. Also rename the transform to
AddBlockAttrbibute in order to reflect its wider applicability.

Change-Id: Ib2bf4ebf6bce72790791dbae9387032be765e4b9
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/101061
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Stephen White <senorblanco@chromium.org>
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index f53b520..ea32d78 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -390,9 +390,9 @@
     "program_builder.h",
     "program_id.cc",
     "program_id.h",
-    "reflection.h",
     "reader/reader.cc",
     "reader/reader.h",
+    "reflection.h",
     "resolver/const_eval.cc",
     "resolver/const_eval.h",
     "resolver/ctor_conv_intrinsic.cc",
@@ -470,10 +470,10 @@
     "text/unicode.cc",
     "text/unicode.h",
     "traits.h",
+    "transform/add_block_attribute.cc",
+    "transform/add_block_attribute.h",
     "transform/add_empty_entry_point.cc",
     "transform/add_empty_entry_point.h",
-    "transform/add_spirv_block_attribute.cc",
-    "transform/add_spirv_block_attribute.h",
     "transform/array_length_from_uniform.cc",
     "transform/array_length_from_uniform.h",
     "transform/binding_remapper.cc",
@@ -1186,8 +1186,8 @@
 
   tint_unittests_source_set("tint_unittests_transform_src") {
     sources = [
+      "transform/add_block_attribute_test.cc",
       "transform/add_empty_entry_point_test.cc",
-      "transform/add_spirv_block_attribute_test.cc",
       "transform/array_length_from_uniform_test.cc",
       "transform/binding_remapper_test.cc",
       "transform/builtin_polyfill_test.cc",
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index 3e0c5d1..08212d3 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -384,8 +384,8 @@
   traits.h
   transform/add_empty_entry_point.cc
   transform/add_empty_entry_point.h
-  transform/add_spirv_block_attribute.cc
-  transform/add_spirv_block_attribute.h
+  transform/add_block_attribute.cc
+  transform/add_block_attribute.h
   transform/array_length_from_uniform.cc
   transform/array_length_from_uniform.h
   transform/binding_remapper.cc
@@ -1102,7 +1102,7 @@
   if(${TINT_BUILD_WGSL_READER} AND ${TINT_BUILD_WGSL_WRITER})
     list(APPEND TINT_TEST_SRCS
       transform/add_empty_entry_point_test.cc
-      transform/add_spirv_block_attribute_test.cc
+      transform/add_block_attribute_test.cc
       transform/array_length_from_uniform_test.cc
       transform/binding_remapper_test.cc
       transform/builtin_polyfill_test.cc
diff --git a/src/tint/ast/struct_test.cc b/src/tint/ast/struct_test.cc
index 53ec9c8..29b9e9a 100644
--- a/src/tint/ast/struct_test.cc
+++ b/src/tint/ast/struct_test.cc
@@ -26,13 +26,13 @@
 #include "src/tint/ast/texture.h"
 #include "src/tint/ast/u32.h"
 #include "src/tint/ast/vector.h"
-#include "src/tint/transform/add_spirv_block_attribute.h"
+#include "src/tint/transform/add_block_attribute.h"
 
 namespace tint::ast {
 namespace {
 
 using AstStructTest = TestHelper;
-using SpirvBlockAttribute = transform::AddSpirvBlockAttribute::SpirvBlockAttribute;
+using BlockAttribute = transform::AddBlockAttribute::BlockAttribute;
 
 TEST_F(AstStructTest, Creation) {
     auto name = Sym("s");
@@ -51,12 +51,12 @@
 
     auto* s = create<Struct>(name, utils::Vector{Member("a", ty.i32())},
                              utils::Vector{
-                                 ASTNodes().Create<SpirvBlockAttribute>(ID(), AllocateNodeID()),
+                                 ASTNodes().Create<BlockAttribute>(ID(), AllocateNodeID()),
                              });
     EXPECT_EQ(s->name, name);
     EXPECT_EQ(s->members.Length(), 1u);
     ASSERT_EQ(s->attributes.Length(), 1u);
-    EXPECT_TRUE(s->attributes[0]->Is<SpirvBlockAttribute>());
+    EXPECT_TRUE(s->attributes[0]->Is<BlockAttribute>());
     EXPECT_EQ(s->source.range.begin.line, 0u);
     EXPECT_EQ(s->source.range.begin.column, 0u);
     EXPECT_EQ(s->source.range.end.line, 0u);
@@ -65,14 +65,14 @@
 
 TEST_F(AstStructTest, CreationWithSourceAndAttributes) {
     auto name = Sym("s");
-    auto* s = create<Struct>(
-        Source{Source::Range{Source::Location{27, 4}, Source::Location{27, 8}}}, name,
-        utils::Vector{Member("a", ty.i32())},
-        utils::Vector{ASTNodes().Create<SpirvBlockAttribute>(ID(), AllocateNodeID())});
+    auto* s =
+        create<Struct>(Source{Source::Range{Source::Location{27, 4}, Source::Location{27, 8}}},
+                       name, utils::Vector{Member("a", ty.i32())},
+                       utils::Vector{ASTNodes().Create<BlockAttribute>(ID(), AllocateNodeID())});
     EXPECT_EQ(s->name, name);
     EXPECT_EQ(s->members.Length(), 1u);
     ASSERT_EQ(s->attributes.Length(), 1u);
-    EXPECT_TRUE(s->attributes[0]->Is<SpirvBlockAttribute>());
+    EXPECT_TRUE(s->attributes[0]->Is<BlockAttribute>());
     EXPECT_EQ(s->source.range.begin.line, 27u);
     EXPECT_EQ(s->source.range.begin.column, 4u);
     EXPECT_EQ(s->source.range.end.line, 27u);
@@ -115,9 +115,9 @@
         {
             ProgramBuilder b1;
             ProgramBuilder b2;
-            b1.create<Struct>(b1.Sym("S"), utils::Vector{b1.Member("a", b1.ty.i32())},
-                              utils::Vector{b2.ASTNodes().Create<SpirvBlockAttribute>(
-                                  b2.ID(), b2.AllocateNodeID())});
+            b1.create<Struct>(
+                b1.Sym("S"), utils::Vector{b1.Member("a", b1.ty.i32())},
+                utils::Vector{b2.ASTNodes().Create<BlockAttribute>(b2.ID(), b2.AllocateNodeID())});
         },
         "internal compiler error");
 }
diff --git a/src/tint/resolver/attribute_validation_test.cc b/src/tint/resolver/attribute_validation_test.cc
index 0180589..7f573a8 100644
--- a/src/tint/resolver/attribute_validation_test.cc
+++ b/src/tint/resolver/attribute_validation_test.cc
@@ -15,7 +15,7 @@
 #include "src/tint/ast/disable_validation_attribute.h"
 #include "src/tint/resolver/resolver.h"
 #include "src/tint/resolver/resolver_test_helper.h"
-#include "src/tint/transform/add_spirv_block_attribute.h"
+#include "src/tint/transform/add_block_attribute.h"
 
 #include "gmock/gmock.h"
 
@@ -557,7 +557,7 @@
 
 namespace StructAndStructMemberTests {
 using StructAttributeTest = TestWithParams;
-using SpirvBlockAttribute = transform::AddSpirvBlockAttribute::SpirvBlockAttribute;
+using SpirvBlockAttribute = transform::AddBlockAttribute::BlockAttribute;
 TEST_P(StructAttributeTest, IsValid) {
     auto& params = GetParam();
 
diff --git a/src/tint/transform/add_spirv_block_attribute.cc b/src/tint/transform/add_block_attribute.cc
similarity index 67%
rename from src/tint/transform/add_spirv_block_attribute.cc
rename to src/tint/transform/add_block_attribute.cc
index 25abdce..619083d 100644
--- a/src/tint/transform/add_spirv_block_attribute.cc
+++ b/src/tint/transform/add_block_attribute.cc
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/transform/add_spirv_block_attribute.h"
+#include "src/tint/transform/add_block_attribute.h"
 
+#include <unordered_set>
 #include <utility>
 
 #include "src/tint/program_builder.h"
@@ -21,16 +22,29 @@
 #include "src/tint/utils/hashmap.h"
 #include "src/tint/utils/hashset.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::transform::AddSpirvBlockAttribute);
-TINT_INSTANTIATE_TYPEINFO(tint::transform::AddSpirvBlockAttribute::SpirvBlockAttribute);
+TINT_INSTANTIATE_TYPEINFO(tint::transform::AddBlockAttribute);
+TINT_INSTANTIATE_TYPEINFO(tint::transform::AddBlockAttribute::BlockAttribute);
 
 namespace tint::transform {
 
-AddSpirvBlockAttribute::AddSpirvBlockAttribute() = default;
+namespace {
 
-AddSpirvBlockAttribute::~AddSpirvBlockAttribute() = default;
+bool IsUsedAsNonBuffer(const std::unordered_set<tint::ast::StorageClass>& uses) {
+    for (auto use : uses) {
+        if (!ast::IsHostShareable(use)) {
+            return true;
+        }
+    }
+    return false;
+}
 
-void AddSpirvBlockAttribute::Run(CloneContext& ctx, const DataMap&, DataMap&) const {
+}  // namespace
+
+AddBlockAttribute::AddBlockAttribute() = default;
+
+AddBlockAttribute::~AddBlockAttribute() = default;
+
+void AddBlockAttribute::Run(CloneContext& ctx, const DataMap&, DataMap&) const {
     auto& sem = ctx.src->Sem();
 
     // Collect the set of structs that are nested in other types.
@@ -66,8 +80,10 @@
 
         auto* ty = var->Type()->UnwrapRef();
         auto* str = ty->As<sem::Struct>();
-        bool needs_wrapping = !str ||                        // Type is not a structure
-                              nested_structs.Contains(str);  // Structure is nested by another type
+        bool needs_wrapping =
+            !str ||                                       // Type is not a structure
+            nested_structs.Contains(str) ||               // Structure is nested by another type
+            IsUsedAsNonBuffer(str->StorageClassUsage());  // Structure is used as a non-buffer usage
 
         if (needs_wrapping) {
             const char* kMemberName = "inner";
@@ -75,8 +91,8 @@
             // This is a non-struct or a struct that is nested somewhere else, so we
             // need to wrap it first.
             auto* wrapper = wrapper_structs.GetOrCreate(ty, [&] {
-                auto* block = ctx.dst->ASTNodes().Create<SpirvBlockAttribute>(
-                    ctx.dst->ID(), ctx.dst->AllocateNodeID());
+                auto* block = ctx.dst->ASTNodes().Create<BlockAttribute>(ctx.dst->ID(),
+                                                                         ctx.dst->AllocateNodeID());
                 auto wrapper_name = ctx.src->Symbols().NameFor(global->symbol) + "_block";
                 auto* ret = ctx.dst->create<ast::Struct>(
                     ctx.dst->Symbols().New(wrapper_name),
@@ -95,8 +111,8 @@
             }
         } else {
             // Add a block attribute to this struct directly.
-            auto* block = ctx.dst->ASTNodes().Create<SpirvBlockAttribute>(
-                ctx.dst->ID(), ctx.dst->AllocateNodeID());
+            auto* block = ctx.dst->ASTNodes().Create<BlockAttribute>(ctx.dst->ID(),
+                                                                     ctx.dst->AllocateNodeID());
             ctx.InsertFront(str->Declaration()->attributes, block);
         }
     }
@@ -104,16 +120,16 @@
     ctx.Clone();
 }
 
-AddSpirvBlockAttribute::SpirvBlockAttribute::SpirvBlockAttribute(ProgramID pid, ast::NodeID nid)
+AddBlockAttribute::BlockAttribute::BlockAttribute(ProgramID pid, ast::NodeID nid)
     : Base(pid, nid) {}
-AddSpirvBlockAttribute::SpirvBlockAttribute::~SpirvBlockAttribute() = default;
-std::string AddSpirvBlockAttribute::SpirvBlockAttribute::InternalName() const {
-    return "spirv_block";
+AddBlockAttribute::BlockAttribute::~BlockAttribute() = default;
+std::string AddBlockAttribute::BlockAttribute::InternalName() const {
+    return "block";
 }
 
-const AddSpirvBlockAttribute::SpirvBlockAttribute*
-AddSpirvBlockAttribute::SpirvBlockAttribute::Clone(CloneContext* ctx) const {
-    return ctx->dst->ASTNodes().Create<AddSpirvBlockAttribute::SpirvBlockAttribute>(
+const AddBlockAttribute::BlockAttribute* AddBlockAttribute::BlockAttribute::Clone(
+    CloneContext* ctx) const {
+    return ctx->dst->ASTNodes().Create<AddBlockAttribute::BlockAttribute>(
         ctx->dst->ID(), ctx->dst->AllocateNodeID());
 }
 
diff --git a/src/tint/transform/add_spirv_block_attribute.h b/src/tint/transform/add_block_attribute.h
similarity index 68%
rename from src/tint/transform/add_spirv_block_attribute.h
rename to src/tint/transform/add_block_attribute.h
index 51409c8..69dfab5 100644
--- a/src/tint/transform/add_spirv_block_attribute.h
+++ b/src/tint/transform/add_block_attribute.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_TRANSFORM_ADD_SPIRV_BLOCK_ATTRIBUTE_H_
-#define SRC_TINT_TRANSFORM_ADD_SPIRV_BLOCK_ATTRIBUTE_H_
+#ifndef SRC_TINT_TRANSFORM_ADD_BLOCK_ATTRIBUTE_H_
+#define SRC_TINT_TRANSFORM_ADD_BLOCK_ATTRIBUTE_H_
 
 #include <string>
 
@@ -22,23 +22,23 @@
 
 namespace tint::transform {
 
-/// AddSpirvBlockAttribute is a transform that adds an
-/// `@internal(spirv_block)` attribute to any structure that is used as the
+/// AddBlockAttribute is a transform that adds an
+/// `@internal(block)` attribute to any structure that is used as the
 /// store type of a buffer. If that structure is nested inside another structure
 /// or an array, then it is wrapped inside another structure which gets the
-/// `@internal(spirv_block)` attribute instead.
-class AddSpirvBlockAttribute final : public Castable<AddSpirvBlockAttribute, Transform> {
+/// `@internal(block)` attribute instead.
+class AddBlockAttribute final : public Castable<AddBlockAttribute, Transform> {
   public:
-    /// SpirvBlockAttribute is an InternalAttribute that is used to decorate a
-    // structure that needs a SPIR-V block attribute.
-    class SpirvBlockAttribute final : public Castable<SpirvBlockAttribute, ast::InternalAttribute> {
+    /// BlockAttribute is an InternalAttribute that is used to decorate a
+    // structure that is used as a buffer in SPIR-V or GLSL.
+    class BlockAttribute final : public Castable<BlockAttribute, ast::InternalAttribute> {
       public:
         /// Constructor
         /// @param program_id the identifier of the program that owns this node
         /// @param nid the unique node identifier
-        SpirvBlockAttribute(ProgramID program_id, ast::NodeID nid);
+        BlockAttribute(ProgramID program_id, ast::NodeID nid);
         /// Destructor
-        ~SpirvBlockAttribute() override;
+        ~BlockAttribute() override;
 
         /// @return a short description of the internal attribute which will be
         /// displayed as `@internal(<name>)`
@@ -47,14 +47,14 @@
         /// Performs a deep clone of this object using the CloneContext `ctx`.
         /// @param ctx the clone context
         /// @return the newly cloned object
-        const SpirvBlockAttribute* Clone(CloneContext* ctx) const override;
+        const BlockAttribute* Clone(CloneContext* ctx) const override;
     };
 
     /// Constructor
-    AddSpirvBlockAttribute();
+    AddBlockAttribute();
 
     /// Destructor
-    ~AddSpirvBlockAttribute() override;
+    ~AddBlockAttribute() override;
 
   protected:
     /// Runs the transform using the CloneContext built for transforming a
@@ -68,4 +68,4 @@
 
 }  // namespace tint::transform
 
-#endif  // SRC_TINT_TRANSFORM_ADD_SPIRV_BLOCK_ATTRIBUTE_H_
+#endif  // SRC_TINT_TRANSFORM_ADD_BLOCK_ATTRIBUTE_H_
diff --git a/src/tint/transform/add_spirv_block_attribute_test.cc b/src/tint/transform/add_block_attribute_test.cc
similarity index 65%
rename from src/tint/transform/add_spirv_block_attribute_test.cc
rename to src/tint/transform/add_block_attribute_test.cc
index 62abae3..7bb5efc 100644
--- a/src/tint/transform/add_spirv_block_attribute_test.cc
+++ b/src/tint/transform/add_block_attribute_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/transform/add_spirv_block_attribute.h"
+#include "src/tint/transform/add_block_attribute.h"
 
 #include <memory>
 #include <utility>
@@ -22,18 +22,18 @@
 namespace tint::transform {
 namespace {
 
-using AddSpirvBlockAttributeTest = TransformTest;
+using AddBlockAttributeTest = TransformTest;
 
-TEST_F(AddSpirvBlockAttributeTest, EmptyModule) {
+TEST_F(AddBlockAttributeTest, EmptyModule) {
     auto* src = "";
     auto* expect = "";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, Noop_UsedForPrivateVar) {
+TEST_F(AddBlockAttributeTest, Noop_UsedForPrivateVar) {
     auto* src = R"(
 struct S {
   f : f32,
@@ -48,12 +48,12 @@
 )";
     auto* expect = src;
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, Noop_UsedForShaderIO) {
+TEST_F(AddBlockAttributeTest, Noop_UsedForShaderIO) {
     auto* src = R"(
 struct S {
   @location(0)
@@ -67,12 +67,12 @@
 )";
     auto* expect = src;
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, BasicScalar) {
+TEST_F(AddBlockAttributeTest, BasicScalar) {
     auto* src = R"(
 @group(0) @binding(0)
 var<uniform> u : f32;
@@ -83,7 +83,7 @@
 }
 )";
     auto* expect = R"(
-@internal(spirv_block)
+@internal(block)
 struct u_block {
   inner : f32,
 }
@@ -96,12 +96,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, BasicArray) {
+TEST_F(AddBlockAttributeTest, BasicArray) {
     auto* src = R"(
 @group(0) @binding(0)
 var<uniform> u : array<vec4<f32>, 4u>;
@@ -112,7 +112,7 @@
 }
 )";
     auto* expect = R"(
-@internal(spirv_block)
+@internal(block)
 struct u_block {
   inner : array<vec4<f32>, 4u>,
 }
@@ -125,12 +125,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, BasicArray_Alias) {
+TEST_F(AddBlockAttributeTest, BasicArray_Alias) {
     auto* src = R"(
 type Numbers = array<vec4<f32>, 4u>;
 
@@ -145,7 +145,7 @@
     auto* expect = R"(
 type Numbers = array<vec4<f32>, 4u>;
 
-@internal(spirv_block)
+@internal(block)
 struct u_block {
   inner : array<vec4<f32>, 4u>,
 }
@@ -158,12 +158,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, BasicStruct_AccessRoot) {
+TEST_F(AddBlockAttributeTest, BasicStruct_AccessRoot) {
     auto* src = R"(
 struct S {
   f : f32,
@@ -178,25 +178,29 @@
 }
 )";
     auto* expect = R"(
-@internal(spirv_block)
 struct S {
   f : f32,
 }
 
-@group(0) @binding(0) var<uniform> u : S;
+@internal(block)
+struct u_block {
+  inner : S,
+}
+
+@group(0) @binding(0) var<uniform> u : u_block;
 
 @fragment
 fn main() {
-  let f = u;
+  let f = u.inner;
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, BasicStruct_AccessField) {
+TEST_F(AddBlockAttributeTest, BasicStruct_AccessField) {
     auto* src = R"(
 struct S {
   f : f32,
@@ -211,7 +215,7 @@
 }
 )";
     auto* expect = R"(
-@internal(spirv_block)
+@internal(block)
 struct S {
   f : f32,
 }
@@ -224,12 +228,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, BasicScalar_PushConstant) {
+TEST_F(AddBlockAttributeTest, BasicScalar_PushConstant) {
     auto* src = R"(
 enable chromium_experimental_push_constant;
 var<push_constant> u : f32;
@@ -242,7 +246,7 @@
     auto* expect = R"(
 enable chromium_experimental_push_constant;
 
-@internal(spirv_block)
+@internal(block)
 struct u_block {
   inner : f32,
 }
@@ -255,12 +259,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, BasicStruct_PushConstant) {
+TEST_F(AddBlockAttributeTest, BasicStruct_PushConstant) {
     auto* src = R"(
 enable chromium_experimental_push_constant;
 struct S {
@@ -276,7 +280,7 @@
     auto* expect = R"(
 enable chromium_experimental_push_constant;
 
-@internal(spirv_block)
+@internal(block)
 struct S {
   f : f32,
 }
@@ -289,12 +293,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, Nested_OuterBuffer_InnerNotBuffer) {
+TEST_F(AddBlockAttributeTest, Nested_OuterBuffer_InnerNotBuffer) {
     auto* src = R"(
 struct Inner {
   f : f32,
@@ -317,7 +321,7 @@
   f : f32,
 }
 
-@internal(spirv_block)
+@internal(block)
 struct Outer {
   i : Inner,
 }
@@ -330,12 +334,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, Nested_OuterBuffer_InnerBuffer) {
+TEST_F(AddBlockAttributeTest, Nested_OuterBuffer_InnerBuffer) {
     auto* src = R"(
 struct Inner {
   f : f32,
@@ -362,14 +366,14 @@
   f : f32,
 }
 
-@internal(spirv_block)
+@internal(block)
 struct Outer {
   i : Inner,
 }
 
 @group(0) @binding(0) var<uniform> u0 : Outer;
 
-@internal(spirv_block)
+@internal(block)
 struct u1_block {
   inner : Inner,
 }
@@ -383,12 +387,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, Nested_OuterNotBuffer_InnerBuffer) {
+TEST_F(AddBlockAttributeTest, Nested_OuterNotBuffer_InnerBuffer) {
     auto* src = R"(
 struct Inner {
   f : f32,
@@ -420,7 +424,7 @@
 
 var<private> p : Outer;
 
-@internal(spirv_block)
+@internal(block)
 struct u_block {
   inner : Inner,
 }
@@ -434,12 +438,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, Nested_InnerUsedForMultipleBuffers) {
+TEST_F(AddBlockAttributeTest, Nested_InnerUsedForMultipleBuffers) {
     auto* src = R"(
 struct Inner {
   f : f32,
@@ -470,14 +474,14 @@
   f : f32,
 }
 
-@internal(spirv_block)
+@internal(block)
 struct S {
   i : Inner,
 }
 
 @group(0) @binding(0) var<uniform> u0 : S;
 
-@internal(spirv_block)
+@internal(block)
 struct u1_block {
   inner : Inner,
 }
@@ -494,12 +498,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, StructInArray) {
+TEST_F(AddBlockAttributeTest, StructInArray) {
     auto* src = R"(
 struct S {
   f : f32,
@@ -519,7 +523,7 @@
   f : f32,
 }
 
-@internal(spirv_block)
+@internal(block)
 struct u_block {
   inner : S,
 }
@@ -533,12 +537,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, StructInArray_MultipleBuffers) {
+TEST_F(AddBlockAttributeTest, StructInArray_MultipleBuffers) {
     auto* src = R"(
 struct S {
   f : f32,
@@ -562,7 +566,7 @@
   f : f32,
 }
 
-@internal(spirv_block)
+@internal(block)
 struct u0_block {
   inner : S,
 }
@@ -579,12 +583,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, Aliases_Nested_OuterBuffer_InnerBuffer) {
+TEST_F(AddBlockAttributeTest, Aliases_Nested_OuterBuffer_InnerBuffer) {
     auto* src = R"(
 struct Inner {
   f : f32,
@@ -617,7 +621,7 @@
 
 type MyInner = Inner;
 
-@internal(spirv_block)
+@internal(block)
 struct Outer {
   i : MyInner,
 }
@@ -626,7 +630,7 @@
 
 @group(0) @binding(0) var<uniform> u0 : MyOuter;
 
-@internal(spirv_block)
+@internal(block)
 struct u1_block {
   inner : Inner,
 }
@@ -640,12 +644,12 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
 
-TEST_F(AddSpirvBlockAttributeTest, Aliases_Nested_OuterBuffer_InnerBuffer_OutOfOrder) {
+TEST_F(AddBlockAttributeTest, Aliases_Nested_OuterBuffer_InnerBuffer_OutOfOrder) {
     auto* src = R"(
 @fragment
 fn main() {
@@ -678,7 +682,7 @@
   let f1 = u1.inner.f;
 }
 
-@internal(spirv_block)
+@internal(block)
 struct u1_block {
   inner : Inner,
 }
@@ -691,7 +695,7 @@
 
 type MyOuter = Outer;
 
-@internal(spirv_block)
+@internal(block)
 struct Outer {
   i : MyInner,
 }
@@ -701,7 +705,147 @@
 }
 )";
 
-    auto got = Run<AddSpirvBlockAttribute>(src);
+    auto got = Run<AddBlockAttribute>(src);
+
+    EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(AddBlockAttributeTest, UniformAndPrivateUsages) {
+    auto* src = R"(
+struct S {
+  f : f32,
+}
+
+@group(0) @binding(0) var<uniform> u : S;
+
+var<private> p : S;
+
+@fragment
+fn main() {
+  p = u;
+}
+)";
+    auto* expect = R"(
+struct S {
+  f : f32,
+}
+
+@internal(block)
+struct u_block {
+  inner : S,
+}
+
+@group(0) @binding(0) var<uniform> u : u_block;
+
+var<private> p : S;
+
+@fragment
+fn main() {
+  p = u.inner;
+}
+)";
+
+    auto got = Run<AddBlockAttribute>(src);
+
+    EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(AddBlockAttributeTest, StorageAndPrivateUsages) {
+    auto* src = R"(
+struct S {
+  f : f32,
+}
+
+@group(0) @binding(0) var<storage, read_write> s : S;
+
+var<private> p : S;
+
+@fragment
+fn main() {
+  p = s;
+  p.f = 1234.0;
+  s = p;
+}
+)";
+    auto* expect = R"(
+struct S {
+  f : f32,
+}
+
+@internal(block)
+struct s_block {
+  inner : S,
+}
+
+@group(0) @binding(0) var<storage, read_write> s : s_block;
+
+var<private> p : S;
+
+@fragment
+fn main() {
+  p = s.inner;
+  p.f = 1234.0;
+  s.inner = p;
+}
+)";
+
+    auto got = Run<AddBlockAttribute>(src);
+
+    EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(AddBlockAttributeTest, StorageAndUniformUsages) {
+    auto* src = R"(
+struct S {
+  f : f32,
+}
+
+@group(0) @binding(0) var<uniform> u : S;
+
+@group(0) @binding(1) var<storage, read_write> s : S;
+
+@fragment
+fn main() {
+  s = u;
+}
+)";
+    auto* expect = R"(
+@internal(block) @internal(block)
+struct S {
+  f : f32,
+}
+
+@group(0) @binding(0) var<uniform> u : S;
+
+@group(0) @binding(1) var<storage, read_write> s : S;
+
+@fragment
+fn main() {
+  s = u;
+}
+)";
+
+    auto got = Run<AddBlockAttribute>(src);
+
+    EXPECT_EQ(expect, str(got));
+}
+
+TEST_F(AddBlockAttributeTest, PrivateUsageOnly) {
+    auto* src = R"(
+struct S {
+  f : f32,
+}
+
+var<private> p : S;
+
+@fragment
+fn main() {
+  p.f = 4321.0f;
+}
+)";
+    auto* expect = src;
+
+    auto got = Run<AddBlockAttribute>(src);
 
     EXPECT_EQ(expect, str(got));
 }
diff --git a/src/tint/writer/glsl/generator_impl.cc b/src/tint/writer/glsl/generator_impl.cc
index e783b0b..d1261f1 100644
--- a/src/tint/writer/glsl/generator_impl.cc
+++ b/src/tint/writer/glsl/generator_impl.cc
@@ -46,8 +46,8 @@
 #include "src/tint/sem/type_constructor.h"
 #include "src/tint/sem/type_conversion.h"
 #include "src/tint/sem/variable.h"
+#include "src/tint/transform/add_block_attribute.h"
 #include "src/tint/transform/add_empty_entry_point.h"
-#include "src/tint/transform/add_spirv_block_attribute.h"
 #include "src/tint/transform/binding_remapper.h"
 #include "src/tint/transform/builtin_polyfill.h"
 #include "src/tint/transform/canonicalize_entry_point_io.h"
@@ -244,7 +244,7 @@
 
     manager.Add<transform::PromoteInitializersToLet>();
     manager.Add<transform::AddEmptyEntryPoint>();
-    manager.Add<transform::AddSpirvBlockAttribute>();
+    manager.Add<transform::AddBlockAttribute>();
     data.Add<transform::CanonicalizeEntryPointIO::Config>(
         transform::CanonicalizeEntryPointIO::ShaderStyle::kGlsl);
 
@@ -284,18 +284,15 @@
                 return false;
             }
         } else if (auto* str = decl->As<ast::Struct>()) {
-            // Skip emission if the struct contains a runtime-sized array, since its
-            // only use will be as the store-type of a buffer and we emit those
-            // elsewhere.
-            // TODO(crbug.com/tint/1339): We could also avoid emitting any other
-            // struct that is only used as a buffer store type.
-            const sem::Struct* sem_str = builder_.Sem().Get(str);
-            const auto& members = sem_str->Members();
-            TINT_ASSERT(Writer, members.size() > 0);
-            auto* last_member = members[members.size() - 1];
-            auto* arr = last_member->Type()->As<sem::Array>();
-            if (!arr || !arr->IsRuntimeSized()) {
-                if (!EmitStructType(current_buffer_, sem_str)) {
+            auto* sem = builder_.Sem().Get(str);
+            bool has_rt_arr = false;
+            if (auto* arr = sem->Members().back()->Type()->As<sem::Array>()) {
+                has_rt_arr = arr->IsRuntimeSized();
+            }
+            bool is_block =
+                ast::HasAttribute<transform::AddBlockAttribute::BlockAttribute>(str->attributes);
+            if (!has_rt_arr && !is_block) {
+                if (!EmitStructType(current_buffer_, sem)) {
                     return false;
                 }
             }
@@ -1915,7 +1912,7 @@
         if (version_.IsDesktop()) {
             out << ", std140";
         }
-        out << ") uniform " << UniqueIdentifier(StructName(str)) << " {";
+        out << ") uniform " << UniqueIdentifier(StructName(str) + "_ubo") << " {";
     }
     EmitStructMembers(current_buffer_, str, /* emit_offsets */ true);
     auto name = builder_.Symbols().NameFor(var->symbol);
@@ -1934,10 +1931,12 @@
     }
     auto bp = sem->As<sem::GlobalVariable>()->BindingPoint();
     line() << "layout(binding = " << bp.binding << ", std430) buffer "
-           << UniqueIdentifier(StructName(str)) << " {";
+           << UniqueIdentifier(StructName(str) + "_ssbo") << " {";
     EmitStructMembers(current_buffer_, str, /* emit_offsets */ true);
     auto name = builder_.Symbols().NameFor(var->symbol);
     line() << "} " << name << ";";
+    line();
+
     return true;
 }
 
diff --git a/src/tint/writer/glsl/generator_impl_function_test.cc b/src/tint/writer/glsl/generator_impl_function_test.cc
index 83ba37b..c388005 100644
--- a/src/tint/writer/glsl/generator_impl_function_test.cc
+++ b/src/tint/writer/glsl/generator_impl_function_test.cc
@@ -384,7 +384,7 @@
   vec4 coord;
 };
 
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   vec4 coord;
 } ubo;
 
@@ -425,7 +425,7 @@
   vec4 coord;
 };
 
-layout(binding = 0) uniform Uniforms_1 {
+layout(binding = 0) uniform Uniforms_ubo {
   vec4 coord;
 } uniforms;
 
@@ -462,15 +462,11 @@
     EXPECT_EQ(gen.result(), R"(#version 310 es
 precision mediump float;
 
-struct Data {
-  int a;
-  float b;
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   int a;
   float b;
 } coord;
+
 void frag_main() {
   float v = coord.b;
   return;
@@ -510,15 +506,11 @@
               R"(#version 310 es
 precision mediump float;
 
-struct Data {
-  int a;
-  float b;
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   int a;
   float b;
 } coord;
+
 void frag_main() {
   float v = coord.b;
   return;
@@ -555,15 +547,11 @@
     EXPECT_EQ(gen.result(), R"(#version 310 es
 precision mediump float;
 
-struct Data {
-  int a;
-  float b;
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   int a;
   float b;
 } coord;
+
 void frag_main() {
   coord.b = 2.0f;
   return;
@@ -600,15 +588,11 @@
     EXPECT_EQ(gen.result(), R"(#version 310 es
 precision mediump float;
 
-struct Data {
-  int a;
-  float b;
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   int a;
   float b;
 } coord;
+
 void frag_main() {
   coord.b = 2.0f;
   return;
@@ -651,7 +635,7 @@
   float x;
 };
 
-layout(binding = 0) uniform S_1 {
+layout(binding = 0) uniform S_ubo {
   float x;
 } coord;
 
@@ -694,13 +678,10 @@
               R"(#version 310 es
 precision mediump float;
 
-struct S {
-  float x;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   float x;
 } coord;
+
 float sub_func(float param) {
   return coord.x;
 }
@@ -930,13 +911,10 @@
     ASSERT_TRUE(gen.Generate()) << gen.error();
     EXPECT_EQ(gen.result(), R"(#version 310 es
 
-struct Data {
-  float d;
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   float d;
 } data;
+
 void a() {
   float v = data.d;
   return;
diff --git a/src/tint/writer/glsl/generator_impl_member_accessor_test.cc b/src/tint/writer/glsl/generator_impl_member_accessor_test.cc
index 1602068..b44a11b 100644
--- a/src/tint/writer/glsl/generator_impl_member_accessor_test.cc
+++ b/src/tint/writer/glsl/generator_impl_member_accessor_test.cc
@@ -277,15 +277,11 @@
         R"(#version 310 es
 precision mediump float;
 
-struct Data {
-  int a;
-  mat2x3 b;
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   int a;
   mat2x3 b;
 } data;
+
 void tint_symbol() {
   data.b = mat2x3(vec3(0.0f), vec3(0.0f));
 }
@@ -322,15 +318,11 @@
         R"(#version 310 es
 precision mediump float;
 
-struct Data {
-  float z;
-  mat4x3 a;
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   float z;
   mat4x3 a;
 } data;
+
 void tint_symbol() {
   float x = data.a[2][1];
 }
@@ -367,15 +359,11 @@
         R"(#version 310 es
 precision mediump float;
 
-struct Data {
-  float z;
-  int a[5];
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   float z;
   int a[5];
 } data;
+
 void tint_symbol() {
   int x = data.a[2];
 }
@@ -415,15 +403,11 @@
         R"(#version 310 es
 precision mediump float;
 
-struct Data {
-  float z;
-  int a[5];
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   float z;
   int a[5];
 } data;
+
 void tint_symbol() {
   int a = 2;
   int b = 4;
@@ -462,15 +446,11 @@
         R"(#version 310 es
 precision mediump float;
 
-struct Data {
-  float z;
-  int a[5];
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   float z;
   int a[5];
 } data;
+
 void tint_symbol() {
   data.a[2] = 2;
 }
@@ -520,13 +500,10 @@
   vec3 b;
 };
 
-struct Data {
-  Inner c[4];
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   Inner c[4];
 } data;
+
 void tint_symbol() {
   vec3 x = data.c[2].b;
 }
@@ -578,13 +555,10 @@
   vec3 b;
 };
 
-struct Data {
-  Inner c[4];
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   Inner c[4];
 } data;
+
 void tint_symbol() {
   vec2 x = data.c[2].b.xy;
 }
@@ -637,13 +611,10 @@
   vec3 b;
 };
 
-struct Data {
-  Inner c[4];
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   Inner c[4];
 } data;
+
 void tint_symbol() {
   float x = data.c[2].b.g;
 }
@@ -695,13 +666,10 @@
   vec3 b;
 };
 
-struct Data {
-  Inner c[4];
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   Inner c[4];
 } data;
+
 void tint_symbol() {
   float x = data.c[2].b[1];
 }
@@ -752,13 +720,10 @@
   vec3 b;
 };
 
-struct Data {
-  Inner c[4];
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   Inner c[4];
 } data;
+
 void tint_symbol() {
   data.c[2].b = vec3(1.0f, 2.0f, 3.0f);
 }
@@ -810,13 +775,10 @@
   vec3 b;
 };
 
-struct Data {
-  Inner c[4];
-};
-
-layout(binding = 0, std430) buffer Data_1 {
+layout(binding = 0, std430) buffer Data_ssbo {
   Inner c[4];
 } data;
+
 void tint_symbol() {
   data.c[2].b.y = 1.0f;
 }
diff --git a/src/tint/writer/glsl/generator_impl_sanitizer_test.cc b/src/tint/writer/glsl/generator_impl_sanitizer_test.cc
index f1157f1..2d0d1ce 100644
--- a/src/tint/writer/glsl/generator_impl_sanitizer_test.cc
+++ b/src/tint/writer/glsl/generator_impl_sanitizer_test.cc
@@ -45,9 +45,10 @@
     auto* expect = R"(#version 310 es
 precision mediump float;
 
-layout(binding = 1, std430) buffer my_struct_1 {
+layout(binding = 1, std430) buffer my_struct_ssbo {
   float a[];
 } b;
+
 void a_func() {
   uint len = uint(b.a.length());
 }
@@ -84,10 +85,11 @@
     auto* expect = R"(#version 310 es
 precision mediump float;
 
-layout(binding = 1, std430) buffer my_struct_1 {
+layout(binding = 1, std430) buffer my_struct_ssbo {
   float z;
   float a[];
 } b;
+
 void a_func() {
   uint len = uint(b.a.length());
 }
@@ -127,9 +129,10 @@
     auto* expect = R"(#version 310 es
 precision mediump float;
 
-layout(binding = 1, std430) buffer my_struct_1 {
+layout(binding = 1, std430) buffer my_struct_ssbo {
   float a[];
 } b;
+
 void a_func() {
   uint len = uint(b.a.length());
 }
diff --git a/src/tint/writer/glsl/generator_impl_storage_buffer_test.cc b/src/tint/writer/glsl/generator_impl_storage_buffer_test.cc
index 8c60374..2c7bed1 100644
--- a/src/tint/writer/glsl/generator_impl_storage_buffer_test.cc
+++ b/src/tint/writer/glsl/generator_impl_storage_buffer_test.cc
@@ -57,11 +57,12 @@
   float louie;
 };
 
-layout(binding = 0, std430) buffer Nephews_1 {
+layout(binding = 0, std430) buffer Nephews_ssbo {
   float huey;
   float dewey;
   float louie;
 } nephews;
+
 )");
 }
 
@@ -79,11 +80,12 @@
   float louie;
 };
 
-layout(binding = 0, std430) buffer Nephews_1 {
+layout(binding = 0, std430) buffer Nephews_ssbo {
   float huey;
   layout(offset=256) float dewey;
   layout(offset=512) float louie;
 } nephews;
+
 )");
 }
 
diff --git a/src/tint/writer/glsl/generator_impl_uniform_buffer_test.cc b/src/tint/writer/glsl/generator_impl_uniform_buffer_test.cc
index 555e237..e3d2eee 100644
--- a/src/tint/writer/glsl/generator_impl_uniform_buffer_test.cc
+++ b/src/tint/writer/glsl/generator_impl_uniform_buffer_test.cc
@@ -37,7 +37,7 @@
   float member;
 };
 
-layout(binding = 0) uniform Simple_1 {
+layout(binding = 0) uniform Simple_ubo {
   float member;
 } simple;
 
@@ -57,7 +57,7 @@
   float member;
 };
 
-layout(binding = 0, std140) uniform Simple_1 {
+layout(binding = 0, std140) uniform Simple_ubo {
   float member;
 } simple;
 
diff --git a/src/tint/writer/spirv/builder.cc b/src/tint/writer/spirv/builder.cc
index c2056a4..04cbaac 100644
--- a/src/tint/writer/spirv/builder.cc
+++ b/src/tint/writer/spirv/builder.cc
@@ -43,7 +43,7 @@
 #include "src/tint/sem/type_conversion.h"
 #include "src/tint/sem/variable.h"
 #include "src/tint/sem/vector.h"
-#include "src/tint/transform/add_spirv_block_attribute.h"
+#include "src/tint/transform/add_block_attribute.h"
 #include "src/tint/utils/defer.h"
 #include "src/tint/utils/map.h"
 #include "src/tint/writer/append_vector.h"
@@ -4059,8 +4059,7 @@
     ops.push_back(result);
 
     auto* decl = struct_type->Declaration();
-    if (decl && ast::HasAttribute<transform::AddSpirvBlockAttribute::SpirvBlockAttribute>(
-                    decl->attributes)) {
+    if (decl && ast::HasAttribute<transform::AddBlockAttribute::BlockAttribute>(decl->attributes)) {
         push_annot(spv::Op::OpDecorate, {Operand(struct_id), U32Operand(SpvDecorationBlock)});
     }
 
diff --git a/src/tint/writer/spirv/generator_impl.cc b/src/tint/writer/spirv/generator_impl.cc
index d7a2b80..06f8613 100644
--- a/src/tint/writer/spirv/generator_impl.cc
+++ b/src/tint/writer/spirv/generator_impl.cc
@@ -17,8 +17,8 @@
 #include <utility>
 #include <vector>
 
+#include "src/tint/transform/add_block_attribute.h"
 #include "src/tint/transform/add_empty_entry_point.h"
-#include "src/tint/transform/add_spirv_block_attribute.h"
 #include "src/tint/transform/builtin_polyfill.h"
 #include "src/tint/transform/canonicalize_entry_point_io.h"
 #include "src/tint/transform/disable_uniformity_analysis.h"
@@ -86,7 +86,7 @@
     manager.Add<transform::WhileToLoop>();    // ZeroInitWorkgroupMemory
     manager.Add<transform::CanonicalizeEntryPointIO>();
     manager.Add<transform::AddEmptyEntryPoint>();
-    manager.Add<transform::AddSpirvBlockAttribute>();
+    manager.Add<transform::AddBlockAttribute>();
     manager.Add<transform::VarForDynamicIndex>();
 
     data.Add<transform::CanonicalizeEntryPointIO::Config>(
diff --git a/test/tint/array/assign_to_function_var.wgsl.expected.glsl b/test/tint/array/assign_to_function_var.wgsl.expected.glsl
index ef532a6..ecaba84 100644
--- a/test/tint/array/assign_to_function_var.wgsl.expected.glsl
+++ b/test/tint/array/assign_to_function_var.wgsl.expected.glsl
@@ -10,13 +10,14 @@
 
 ivec4 src_private[4] = ivec4[4](ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0));
 shared ivec4 src_workgroup[4];
-layout(binding = 0) uniform S_1 {
-  ivec4 arr[4];
+layout(binding = 0) uniform src_uniform_block_ubo {
+  S inner;
 } src_uniform;
 
-layout(binding = 1, std430) buffer S_2 {
-  ivec4 arr[4];
+layout(binding = 1, std430) buffer src_uniform_block_ssbo {
+  S inner;
 } src_storage;
+
 ivec4[4] ret_arr() {
   ivec4 tint_symbol_1[4] = ivec4[4](ivec4(0), ivec4(0), ivec4(0), ivec4(0));
   return tint_symbol_1;
@@ -41,8 +42,8 @@
   dst = src_workgroup;
   S tint_symbol = ret_struct_arr();
   dst = tint_symbol.arr;
-  dst = src_uniform.arr;
-  dst = src_storage.arr;
+  dst = src_uniform.inner.arr;
+  dst = src_storage.inner.arr;
   int dst_nested[4][3][2] = int[4][3][2](int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)));
   int src_nested[4][3][2] = int[4][3][2](int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)));
   dst_nested = src_nested;
diff --git a/test/tint/array/assign_to_function_var.wgsl.expected.spvasm b/test/tint/array/assign_to_function_var.wgsl.expected.spvasm
index 636346d..46e5c7f 100644
--- a/test/tint/array/assign_to_function_var.wgsl.expected.spvasm
+++ b/test/tint/array/assign_to_function_var.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 64
+; Bound: 65
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -9,6 +9,8 @@
                OpExecutionMode %unused_entry_point LocalSize 1 1 1
                OpName %src_private "src_private"
                OpName %src_workgroup "src_workgroup"
+               OpName %src_uniform_block "src_uniform_block"
+               OpMemberName %src_uniform_block 0 "inner"
                OpName %S "S"
                OpMemberName %S 0 "arr"
                OpName %src_uniform "src_uniform"
@@ -23,7 +25,8 @@
                OpName %dst_nested "dst_nested"
                OpName %src_nested "src_nested"
                OpDecorate %_arr_v4int_uint_4 ArrayStride 16
-               OpDecorate %S Block
+               OpDecorate %src_uniform_block Block
+               OpMemberDecorate %src_uniform_block 0 Offset 0
                OpMemberDecorate %S 0 Offset 0
                OpDecorate %src_uniform NonWritable
                OpDecorate %src_uniform DescriptorSet 0
@@ -44,24 +47,25 @@
 %_ptr_Workgroup__arr_v4int_uint_4 = OpTypePointer Workgroup %_arr_v4int_uint_4
 %src_workgroup = OpVariable %_ptr_Workgroup__arr_v4int_uint_4 Workgroup
           %S = OpTypeStruct %_arr_v4int_uint_4
-%_ptr_Uniform_S = OpTypePointer Uniform %S
-%src_uniform = OpVariable %_ptr_Uniform_S Uniform
-%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
-%src_storage = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%src_uniform_block = OpTypeStruct %S
+%_ptr_Uniform_src_uniform_block = OpTypePointer Uniform %src_uniform_block
+%src_uniform = OpVariable %_ptr_Uniform_src_uniform_block Uniform
+%_ptr_StorageBuffer_src_uniform_block = OpTypePointer StorageBuffer %src_uniform_block
+%src_storage = OpVariable %_ptr_StorageBuffer_src_uniform_block StorageBuffer
        %void = OpTypeVoid
-         %16 = OpTypeFunction %void
-         %20 = OpTypeFunction %_arr_v4int_uint_4
-         %23 = OpTypeFunction %S
-         %26 = OpConstantNull %S
-         %27 = OpTypeFunction %void %_arr_v4int_uint_4
+         %17 = OpTypeFunction %void
+         %21 = OpTypeFunction %_arr_v4int_uint_4
+         %24 = OpTypeFunction %S
+         %27 = OpConstantNull %S
+         %28 = OpTypeFunction %void %_arr_v4int_uint_4
 %_ptr_Function__arr_v4int_uint_4 = OpTypePointer Function %_arr_v4int_uint_4
       %int_1 = OpConstant %int 1
-         %35 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+         %36 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
       %int_2 = OpConstant %int 2
-         %37 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
+         %38 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
       %int_3 = OpConstant %int 3
-         %39 = OpConstantComposite %v4int %int_3 %int_3 %int_3 %int_3
-         %40 = OpConstantComposite %_arr_v4int_uint_4 %35 %37 %39 %39
+         %40 = OpConstantComposite %v4int %int_3 %int_3 %int_3 %int_3
+         %41 = OpConstantComposite %_arr_v4int_uint_4 %36 %38 %40 %40
      %uint_0 = OpConstant %uint 0
 %_ptr_Uniform__arr_v4int_uint_4 = OpTypePointer Uniform %_arr_v4int_uint_4
 %_ptr_StorageBuffer__arr_v4int_uint_4 = OpTypePointer StorageBuffer %_arr_v4int_uint_4
@@ -71,47 +75,47 @@
 %_arr__arr_int_uint_2_uint_3 = OpTypeArray %_arr_int_uint_2 %uint_3
 %_arr__arr__arr_int_uint_2_uint_3_uint_4 = OpTypeArray %_arr__arr_int_uint_2_uint_3 %uint_4
 %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 = OpTypePointer Function %_arr__arr__arr_int_uint_2_uint_3_uint_4
-         %61 = OpConstantNull %_arr__arr__arr_int_uint_2_uint_3_uint_4
-%unused_entry_point = OpFunction %void None %16
-         %19 = OpLabel
+         %62 = OpConstantNull %_arr__arr__arr_int_uint_2_uint_3_uint_4
+%unused_entry_point = OpFunction %void None %17
+         %20 = OpLabel
                OpReturn
                OpFunctionEnd
-    %ret_arr = OpFunction %_arr_v4int_uint_4 None %20
-         %22 = OpLabel
+    %ret_arr = OpFunction %_arr_v4int_uint_4 None %21
+         %23 = OpLabel
                OpReturnValue %8
                OpFunctionEnd
-%ret_struct_arr = OpFunction %S None %23
-         %25 = OpLabel
-               OpReturnValue %26
+%ret_struct_arr = OpFunction %S None %24
+         %26 = OpLabel
+               OpReturnValue %27
                OpFunctionEnd
-        %foo = OpFunction %void None %27
+        %foo = OpFunction %void None %28
   %src_param = OpFunctionParameter %_arr_v4int_uint_4
-         %30 = OpLabel
+         %31 = OpLabel
 %src_function = OpVariable %_ptr_Function__arr_v4int_uint_4 Function %8
         %dst = OpVariable %_ptr_Function__arr_v4int_uint_4 Function %8
- %dst_nested = OpVariable %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 Function %61
- %src_nested = OpVariable %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 Function %61
-               OpStore %dst %40
-               OpStore %dst %src_param
-         %41 = OpFunctionCall %_arr_v4int_uint_4 %ret_arr
+ %dst_nested = OpVariable %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 Function %62
+ %src_nested = OpVariable %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 Function %62
                OpStore %dst %41
-               OpStore %dst %8
-         %42 = OpLoad %_arr_v4int_uint_4 %src_function
+               OpStore %dst %src_param
+         %42 = OpFunctionCall %_arr_v4int_uint_4 %ret_arr
                OpStore %dst %42
-         %43 = OpLoad %_arr_v4int_uint_4 %src_private
+               OpStore %dst %8
+         %43 = OpLoad %_arr_v4int_uint_4 %src_function
                OpStore %dst %43
-         %44 = OpLoad %_arr_v4int_uint_4 %src_workgroup
+         %44 = OpLoad %_arr_v4int_uint_4 %src_private
                OpStore %dst %44
-         %45 = OpFunctionCall %S %ret_struct_arr
-         %46 = OpCompositeExtract %_arr_v4int_uint_4 %45 0
-               OpStore %dst %46
-         %49 = OpAccessChain %_ptr_Uniform__arr_v4int_uint_4 %src_uniform %uint_0
-         %50 = OpLoad %_arr_v4int_uint_4 %49
-               OpStore %dst %50
-         %52 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %src_storage %uint_0
-         %53 = OpLoad %_arr_v4int_uint_4 %52
-               OpStore %dst %53
-         %63 = OpLoad %_arr__arr__arr_int_uint_2_uint_3_uint_4 %src_nested
-               OpStore %dst_nested %63
+         %45 = OpLoad %_arr_v4int_uint_4 %src_workgroup
+               OpStore %dst %45
+         %46 = OpFunctionCall %S %ret_struct_arr
+         %47 = OpCompositeExtract %_arr_v4int_uint_4 %46 0
+               OpStore %dst %47
+         %50 = OpAccessChain %_ptr_Uniform__arr_v4int_uint_4 %src_uniform %uint_0 %uint_0
+         %51 = OpLoad %_arr_v4int_uint_4 %50
+               OpStore %dst %51
+         %53 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %src_storage %uint_0 %uint_0
+         %54 = OpLoad %_arr_v4int_uint_4 %53
+               OpStore %dst %54
+         %64 = OpLoad %_arr__arr__arr_int_uint_2_uint_3_uint_4 %src_nested
+               OpStore %dst_nested %64
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/array/assign_to_private_var.wgsl.expected.glsl b/test/tint/array/assign_to_private_var.wgsl.expected.glsl
index 6a18417..57630d5 100644
--- a/test/tint/array/assign_to_private_var.wgsl.expected.glsl
+++ b/test/tint/array/assign_to_private_var.wgsl.expected.glsl
@@ -10,13 +10,14 @@
 
 ivec4 src_private[4] = ivec4[4](ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0));
 shared ivec4 src_workgroup[4];
-layout(binding = 0) uniform S_1 {
-  ivec4 arr[4];
+layout(binding = 0) uniform src_uniform_block_ubo {
+  S inner;
 } src_uniform;
 
-layout(binding = 1, std430) buffer S_2 {
-  ivec4 arr[4];
+layout(binding = 1, std430) buffer src_uniform_block_ssbo {
+  S inner;
 } src_storage;
+
 ivec4 dst[4] = ivec4[4](ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0));
 int dst_nested[4][3][2] = int[4][3][2](int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)));
 ivec4[4] ret_arr() {
@@ -42,8 +43,8 @@
   dst = src_workgroup;
   S tint_symbol = ret_struct_arr();
   dst = tint_symbol.arr;
-  dst = src_uniform.arr;
-  dst = src_storage.arr;
+  dst = src_uniform.inner.arr;
+  dst = src_storage.inner.arr;
   int src_nested[4][3][2] = int[4][3][2](int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)));
   dst_nested = src_nested;
 }
diff --git a/test/tint/array/assign_to_private_var.wgsl.expected.spvasm b/test/tint/array/assign_to_private_var.wgsl.expected.spvasm
index 3427ea7..caae540 100644
--- a/test/tint/array/assign_to_private_var.wgsl.expected.spvasm
+++ b/test/tint/array/assign_to_private_var.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 65
+; Bound: 66
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -9,6 +9,8 @@
                OpExecutionMode %unused_entry_point LocalSize 1 1 1
                OpName %src_private "src_private"
                OpName %src_workgroup "src_workgroup"
+               OpName %src_uniform_block "src_uniform_block"
+               OpMemberName %src_uniform_block 0 "inner"
                OpName %S "S"
                OpMemberName %S 0 "arr"
                OpName %src_uniform "src_uniform"
@@ -23,7 +25,8 @@
                OpName %src_function "src_function"
                OpName %src_nested "src_nested"
                OpDecorate %_arr_v4int_uint_4 ArrayStride 16
-               OpDecorate %S Block
+               OpDecorate %src_uniform_block Block
+               OpMemberDecorate %src_uniform_block 0 Offset 0
                OpMemberDecorate %S 0 Offset 0
                OpDecorate %src_uniform NonWritable
                OpDecorate %src_uniform DescriptorSet 0
@@ -44,10 +47,11 @@
 %_ptr_Workgroup__arr_v4int_uint_4 = OpTypePointer Workgroup %_arr_v4int_uint_4
 %src_workgroup = OpVariable %_ptr_Workgroup__arr_v4int_uint_4 Workgroup
           %S = OpTypeStruct %_arr_v4int_uint_4
-%_ptr_Uniform_S = OpTypePointer Uniform %S
-%src_uniform = OpVariable %_ptr_Uniform_S Uniform
-%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
-%src_storage = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%src_uniform_block = OpTypeStruct %S
+%_ptr_Uniform_src_uniform_block = OpTypePointer Uniform %src_uniform_block
+%src_uniform = OpVariable %_ptr_Uniform_src_uniform_block Uniform
+%_ptr_StorageBuffer_src_uniform_block = OpTypePointer StorageBuffer %src_uniform_block
+%src_storage = OpVariable %_ptr_StorageBuffer_src_uniform_block StorageBuffer
         %dst = OpVariable %_ptr_Private__arr_v4int_uint_4 Private %8
      %uint_2 = OpConstant %uint 2
 %_arr_int_uint_2 = OpTypeArray %int %uint_2
@@ -55,64 +59,64 @@
 %_arr__arr_int_uint_2_uint_3 = OpTypeArray %_arr_int_uint_2 %uint_3
 %_arr__arr__arr_int_uint_2_uint_3_uint_4 = OpTypeArray %_arr__arr_int_uint_2_uint_3 %uint_4
 %_ptr_Private__arr__arr__arr_int_uint_2_uint_3_uint_4 = OpTypePointer Private %_arr__arr__arr_int_uint_2_uint_3_uint_4
-         %24 = OpConstantNull %_arr__arr__arr_int_uint_2_uint_3_uint_4
- %dst_nested = OpVariable %_ptr_Private__arr__arr__arr_int_uint_2_uint_3_uint_4 Private %24
+         %25 = OpConstantNull %_arr__arr__arr_int_uint_2_uint_3_uint_4
+ %dst_nested = OpVariable %_ptr_Private__arr__arr__arr_int_uint_2_uint_3_uint_4 Private %25
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
-         %29 = OpTypeFunction %_arr_v4int_uint_4
-         %32 = OpTypeFunction %S
-         %35 = OpConstantNull %S
-         %36 = OpTypeFunction %void %_arr_v4int_uint_4
+         %26 = OpTypeFunction %void
+         %30 = OpTypeFunction %_arr_v4int_uint_4
+         %33 = OpTypeFunction %S
+         %36 = OpConstantNull %S
+         %37 = OpTypeFunction %void %_arr_v4int_uint_4
 %_ptr_Function__arr_v4int_uint_4 = OpTypePointer Function %_arr_v4int_uint_4
       %int_1 = OpConstant %int 1
-         %43 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+         %44 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
       %int_2 = OpConstant %int 2
-         %45 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
+         %46 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
       %int_3 = OpConstant %int 3
-         %47 = OpConstantComposite %v4int %int_3 %int_3 %int_3 %int_3
-         %48 = OpConstantComposite %_arr_v4int_uint_4 %43 %45 %47 %47
+         %48 = OpConstantComposite %v4int %int_3 %int_3 %int_3 %int_3
+         %49 = OpConstantComposite %_arr_v4int_uint_4 %44 %46 %48 %48
      %uint_0 = OpConstant %uint 0
 %_ptr_Uniform__arr_v4int_uint_4 = OpTypePointer Uniform %_arr_v4int_uint_4
 %_ptr_StorageBuffer__arr_v4int_uint_4 = OpTypePointer StorageBuffer %_arr_v4int_uint_4
 %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 = OpTypePointer Function %_arr__arr__arr_int_uint_2_uint_3_uint_4
-%unused_entry_point = OpFunction %void None %25
-         %28 = OpLabel
+%unused_entry_point = OpFunction %void None %26
+         %29 = OpLabel
                OpReturn
                OpFunctionEnd
-    %ret_arr = OpFunction %_arr_v4int_uint_4 None %29
-         %31 = OpLabel
+    %ret_arr = OpFunction %_arr_v4int_uint_4 None %30
+         %32 = OpLabel
                OpReturnValue %8
                OpFunctionEnd
-%ret_struct_arr = OpFunction %S None %32
-         %34 = OpLabel
-               OpReturnValue %35
+%ret_struct_arr = OpFunction %S None %33
+         %35 = OpLabel
+               OpReturnValue %36
                OpFunctionEnd
-        %foo = OpFunction %void None %36
+        %foo = OpFunction %void None %37
   %src_param = OpFunctionParameter %_arr_v4int_uint_4
-         %39 = OpLabel
+         %40 = OpLabel
 %src_function = OpVariable %_ptr_Function__arr_v4int_uint_4 Function %8
- %src_nested = OpVariable %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 Function %24
-               OpStore %dst %48
-               OpStore %dst %src_param
-         %49 = OpFunctionCall %_arr_v4int_uint_4 %ret_arr
+ %src_nested = OpVariable %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 Function %25
                OpStore %dst %49
-               OpStore %dst %8
-         %50 = OpLoad %_arr_v4int_uint_4 %src_function
+               OpStore %dst %src_param
+         %50 = OpFunctionCall %_arr_v4int_uint_4 %ret_arr
                OpStore %dst %50
-         %51 = OpLoad %_arr_v4int_uint_4 %src_private
+               OpStore %dst %8
+         %51 = OpLoad %_arr_v4int_uint_4 %src_function
                OpStore %dst %51
-         %52 = OpLoad %_arr_v4int_uint_4 %src_workgroup
+         %52 = OpLoad %_arr_v4int_uint_4 %src_private
                OpStore %dst %52
-         %53 = OpFunctionCall %S %ret_struct_arr
-         %54 = OpCompositeExtract %_arr_v4int_uint_4 %53 0
-               OpStore %dst %54
-         %57 = OpAccessChain %_ptr_Uniform__arr_v4int_uint_4 %src_uniform %uint_0
-         %58 = OpLoad %_arr_v4int_uint_4 %57
-               OpStore %dst %58
-         %60 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %src_storage %uint_0
-         %61 = OpLoad %_arr_v4int_uint_4 %60
-               OpStore %dst %61
-         %64 = OpLoad %_arr__arr__arr_int_uint_2_uint_3_uint_4 %src_nested
-               OpStore %dst_nested %64
+         %53 = OpLoad %_arr_v4int_uint_4 %src_workgroup
+               OpStore %dst %53
+         %54 = OpFunctionCall %S %ret_struct_arr
+         %55 = OpCompositeExtract %_arr_v4int_uint_4 %54 0
+               OpStore %dst %55
+         %58 = OpAccessChain %_ptr_Uniform__arr_v4int_uint_4 %src_uniform %uint_0 %uint_0
+         %59 = OpLoad %_arr_v4int_uint_4 %58
+               OpStore %dst %59
+         %61 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %src_storage %uint_0 %uint_0
+         %62 = OpLoad %_arr_v4int_uint_4 %61
+               OpStore %dst %62
+         %65 = OpLoad %_arr__arr__arr_int_uint_2_uint_3_uint_4 %src_nested
+               OpStore %dst_nested %65
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/array/assign_to_storage_var.wgsl.expected.glsl b/test/tint/array/assign_to_storage_var.wgsl.expected.glsl
index bda5283..fd9a95f 100644
--- a/test/tint/array/assign_to_storage_var.wgsl.expected.glsl
+++ b/test/tint/array/assign_to_storage_var.wgsl.expected.glsl
@@ -8,25 +8,24 @@
   ivec4 arr[4];
 };
 
-struct S_nested {
-  int arr[4][3][2];
-};
-
 ivec4 src_private[4] = ivec4[4](ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0));
 shared ivec4 src_workgroup[4];
-layout(binding = 0) uniform S_1 {
-  ivec4 arr[4];
+layout(binding = 0) uniform src_uniform_block_ubo {
+  S inner;
 } src_uniform;
 
-layout(binding = 1, std430) buffer S_2 {
-  ivec4 arr[4];
+layout(binding = 1, std430) buffer src_uniform_block_ssbo {
+  S inner;
 } src_storage;
-layout(binding = 2, std430) buffer S_3 {
-  ivec4 arr[4];
+
+layout(binding = 2, std430) buffer src_uniform_block_ssbo_1 {
+  S inner;
 } dst;
-layout(binding = 3, std430) buffer S_nested_1 {
+
+layout(binding = 3, std430) buffer S_nested_ssbo {
   int arr[4][3][2];
 } dst_nested;
+
 ivec4[4] ret_arr() {
   ivec4 tint_symbol_2[4] = ivec4[4](ivec4(0), ivec4(0), ivec4(0), ivec4(0));
   return tint_symbol_2;
@@ -40,19 +39,19 @@
 void foo(ivec4 src_param[4]) {
   ivec4 src_function[4] = ivec4[4](ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0));
   ivec4 tint_symbol_4[4] = ivec4[4](ivec4(1), ivec4(2), ivec4(3), ivec4(3));
-  dst.arr = tint_symbol_4;
-  dst.arr = src_param;
+  dst.inner.arr = tint_symbol_4;
+  dst.inner.arr = src_param;
   ivec4 tint_symbol[4] = ret_arr();
-  dst.arr = tint_symbol;
+  dst.inner.arr = tint_symbol;
   ivec4 src_let[4] = ivec4[4](ivec4(0), ivec4(0), ivec4(0), ivec4(0));
-  dst.arr = src_let;
-  dst.arr = src_function;
-  dst.arr = src_private;
-  dst.arr = src_workgroup;
+  dst.inner.arr = src_let;
+  dst.inner.arr = src_function;
+  dst.inner.arr = src_private;
+  dst.inner.arr = src_workgroup;
   S tint_symbol_1 = ret_struct_arr();
-  dst.arr = tint_symbol_1.arr;
-  dst.arr = src_uniform.arr;
-  dst.arr = src_storage.arr;
+  dst.inner.arr = tint_symbol_1.arr;
+  dst.inner.arr = src_uniform.inner.arr;
+  dst.inner.arr = src_storage.inner.arr;
   int src_nested[4][3][2] = int[4][3][2](int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)));
   dst_nested.arr = src_nested;
 }
diff --git a/test/tint/array/assign_to_storage_var.wgsl.expected.spvasm b/test/tint/array/assign_to_storage_var.wgsl.expected.spvasm
index f33dfbe..df20726 100644
--- a/test/tint/array/assign_to_storage_var.wgsl.expected.spvasm
+++ b/test/tint/array/assign_to_storage_var.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 78
+; Bound: 79
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -9,6 +9,8 @@
                OpExecutionMode %unused_entry_point LocalSize 1 1 1
                OpName %src_private "src_private"
                OpName %src_workgroup "src_workgroup"
+               OpName %src_uniform_block "src_uniform_block"
+               OpMemberName %src_uniform_block 0 "inner"
                OpName %S "S"
                OpMemberName %S 0 "arr"
                OpName %src_uniform "src_uniform"
@@ -25,7 +27,8 @@
                OpName %src_function "src_function"
                OpName %src_nested "src_nested"
                OpDecorate %_arr_v4int_uint_4 ArrayStride 16
-               OpDecorate %S Block
+               OpDecorate %src_uniform_block Block
+               OpMemberDecorate %src_uniform_block 0 Offset 0
                OpMemberDecorate %S 0 Offset 0
                OpDecorate %src_uniform NonWritable
                OpDecorate %src_uniform DescriptorSet 0
@@ -52,11 +55,12 @@
 %_ptr_Workgroup__arr_v4int_uint_4 = OpTypePointer Workgroup %_arr_v4int_uint_4
 %src_workgroup = OpVariable %_ptr_Workgroup__arr_v4int_uint_4 Workgroup
           %S = OpTypeStruct %_arr_v4int_uint_4
-%_ptr_Uniform_S = OpTypePointer Uniform %S
-%src_uniform = OpVariable %_ptr_Uniform_S Uniform
-%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
-%src_storage = OpVariable %_ptr_StorageBuffer_S StorageBuffer
-        %dst = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%src_uniform_block = OpTypeStruct %S
+%_ptr_Uniform_src_uniform_block = OpTypePointer Uniform %src_uniform_block
+%src_uniform = OpVariable %_ptr_Uniform_src_uniform_block Uniform
+%_ptr_StorageBuffer_src_uniform_block = OpTypePointer StorageBuffer %src_uniform_block
+%src_storage = OpVariable %_ptr_StorageBuffer_src_uniform_block StorageBuffer
+        %dst = OpVariable %_ptr_StorageBuffer_src_uniform_block StorageBuffer
      %uint_2 = OpConstant %uint 2
 %_arr_int_uint_2 = OpTypeArray %int %uint_2
      %uint_3 = OpConstant %uint 3
@@ -66,74 +70,74 @@
 %_ptr_StorageBuffer_S_nested = OpTypePointer StorageBuffer %S_nested
  %dst_nested = OpVariable %_ptr_StorageBuffer_S_nested StorageBuffer
        %void = OpTypeVoid
-         %25 = OpTypeFunction %void
-         %29 = OpTypeFunction %_arr_v4int_uint_4
-         %32 = OpTypeFunction %S
-         %35 = OpConstantNull %S
-         %36 = OpTypeFunction %void %_arr_v4int_uint_4
+         %26 = OpTypeFunction %void
+         %30 = OpTypeFunction %_arr_v4int_uint_4
+         %33 = OpTypeFunction %S
+         %36 = OpConstantNull %S
+         %37 = OpTypeFunction %void %_arr_v4int_uint_4
 %_ptr_Function__arr_v4int_uint_4 = OpTypePointer Function %_arr_v4int_uint_4
      %uint_0 = OpConstant %uint 0
 %_ptr_StorageBuffer__arr_v4int_uint_4 = OpTypePointer StorageBuffer %_arr_v4int_uint_4
       %int_1 = OpConstant %int 1
-         %46 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+         %47 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
       %int_2 = OpConstant %int 2
-         %48 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
+         %49 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
       %int_3 = OpConstant %int 3
-         %50 = OpConstantComposite %v4int %int_3 %int_3 %int_3 %int_3
-         %51 = OpConstantComposite %_arr_v4int_uint_4 %46 %48 %50 %50
+         %51 = OpConstantComposite %v4int %int_3 %int_3 %int_3 %int_3
+         %52 = OpConstantComposite %_arr_v4int_uint_4 %47 %49 %51 %51
 %_ptr_Uniform__arr_v4int_uint_4 = OpTypePointer Uniform %_arr_v4int_uint_4
 %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 = OpTypePointer Function %_arr__arr__arr_int_uint_2_uint_3_uint_4
-         %74 = OpConstantNull %_arr__arr__arr_int_uint_2_uint_3_uint_4
+         %75 = OpConstantNull %_arr__arr__arr_int_uint_2_uint_3_uint_4
 %_ptr_StorageBuffer__arr__arr__arr_int_uint_2_uint_3_uint_4 = OpTypePointer StorageBuffer %_arr__arr__arr_int_uint_2_uint_3_uint_4
-%unused_entry_point = OpFunction %void None %25
-         %28 = OpLabel
+%unused_entry_point = OpFunction %void None %26
+         %29 = OpLabel
                OpReturn
                OpFunctionEnd
-    %ret_arr = OpFunction %_arr_v4int_uint_4 None %29
-         %31 = OpLabel
+    %ret_arr = OpFunction %_arr_v4int_uint_4 None %30
+         %32 = OpLabel
                OpReturnValue %8
                OpFunctionEnd
-%ret_struct_arr = OpFunction %S None %32
-         %34 = OpLabel
-               OpReturnValue %35
+%ret_struct_arr = OpFunction %S None %33
+         %35 = OpLabel
+               OpReturnValue %36
                OpFunctionEnd
-        %foo = OpFunction %void None %36
+        %foo = OpFunction %void None %37
   %src_param = OpFunctionParameter %_arr_v4int_uint_4
-         %39 = OpLabel
+         %40 = OpLabel
 %src_function = OpVariable %_ptr_Function__arr_v4int_uint_4 Function %8
- %src_nested = OpVariable %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 Function %74
-         %44 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0
-               OpStore %44 %51
-         %52 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0
-               OpStore %52 %src_param
-         %53 = OpFunctionCall %_arr_v4int_uint_4 %ret_arr
-         %54 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0
-               OpStore %54 %53
-         %55 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0
-               OpStore %55 %8
-         %56 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0
-         %57 = OpLoad %_arr_v4int_uint_4 %src_function
-               OpStore %56 %57
-         %58 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0
-         %59 = OpLoad %_arr_v4int_uint_4 %src_private
-               OpStore %58 %59
-         %60 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0
-         %61 = OpLoad %_arr_v4int_uint_4 %src_workgroup
-               OpStore %60 %61
-         %62 = OpFunctionCall %S %ret_struct_arr
-         %63 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0
-         %64 = OpCompositeExtract %_arr_v4int_uint_4 %62 0
-               OpStore %63 %64
-         %65 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0
-         %67 = OpAccessChain %_ptr_Uniform__arr_v4int_uint_4 %src_uniform %uint_0
-         %68 = OpLoad %_arr_v4int_uint_4 %67
-               OpStore %65 %68
-         %69 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0
-         %70 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %src_storage %uint_0
-         %71 = OpLoad %_arr_v4int_uint_4 %70
-               OpStore %69 %71
-         %76 = OpAccessChain %_ptr_StorageBuffer__arr__arr__arr_int_uint_2_uint_3_uint_4 %dst_nested %uint_0
-         %77 = OpLoad %_arr__arr__arr_int_uint_2_uint_3_uint_4 %src_nested
-               OpStore %76 %77
+ %src_nested = OpVariable %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 Function %75
+         %45 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
+               OpStore %45 %52
+         %53 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
+               OpStore %53 %src_param
+         %54 = OpFunctionCall %_arr_v4int_uint_4 %ret_arr
+         %55 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
+               OpStore %55 %54
+         %56 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
+               OpStore %56 %8
+         %57 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
+         %58 = OpLoad %_arr_v4int_uint_4 %src_function
+               OpStore %57 %58
+         %59 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
+         %60 = OpLoad %_arr_v4int_uint_4 %src_private
+               OpStore %59 %60
+         %61 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
+         %62 = OpLoad %_arr_v4int_uint_4 %src_workgroup
+               OpStore %61 %62
+         %63 = OpFunctionCall %S %ret_struct_arr
+         %64 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
+         %65 = OpCompositeExtract %_arr_v4int_uint_4 %63 0
+               OpStore %64 %65
+         %66 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
+         %68 = OpAccessChain %_ptr_Uniform__arr_v4int_uint_4 %src_uniform %uint_0 %uint_0
+         %69 = OpLoad %_arr_v4int_uint_4 %68
+               OpStore %66 %69
+         %70 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
+         %71 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %src_storage %uint_0 %uint_0
+         %72 = OpLoad %_arr_v4int_uint_4 %71
+               OpStore %70 %72
+         %77 = OpAccessChain %_ptr_StorageBuffer__arr__arr__arr_int_uint_2_uint_3_uint_4 %dst_nested %uint_0
+         %78 = OpLoad %_arr__arr__arr_int_uint_2_uint_3_uint_4 %src_nested
+               OpStore %77 %78
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/array/assign_to_workgroup_var.wgsl.expected.glsl b/test/tint/array/assign_to_workgroup_var.wgsl.expected.glsl
index e32aa22..c023ca5 100644
--- a/test/tint/array/assign_to_workgroup_var.wgsl.expected.glsl
+++ b/test/tint/array/assign_to_workgroup_var.wgsl.expected.glsl
@@ -10,13 +10,14 @@
 
 ivec4 src_private[4] = ivec4[4](ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0));
 shared ivec4 src_workgroup[4];
-layout(binding = 0) uniform S_1 {
-  ivec4 arr[4];
+layout(binding = 0) uniform src_uniform_block_ubo {
+  S inner;
 } src_uniform;
 
-layout(binding = 1, std430) buffer S_2 {
-  ivec4 arr[4];
+layout(binding = 1, std430) buffer src_uniform_block_ssbo {
+  S inner;
 } src_storage;
+
 shared ivec4 dst[4];
 shared int dst_nested[4][3][2];
 ivec4[4] ret_arr() {
@@ -42,8 +43,8 @@
   dst = src_workgroup;
   S tint_symbol = ret_struct_arr();
   dst = tint_symbol.arr;
-  dst = src_uniform.arr;
-  dst = src_storage.arr;
+  dst = src_uniform.inner.arr;
+  dst = src_storage.inner.arr;
   int src_nested[4][3][2] = int[4][3][2](int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)));
   dst_nested = src_nested;
 }
diff --git a/test/tint/array/assign_to_workgroup_var.wgsl.expected.spvasm b/test/tint/array/assign_to_workgroup_var.wgsl.expected.spvasm
index a834fb2..85496ae 100644
--- a/test/tint/array/assign_to_workgroup_var.wgsl.expected.spvasm
+++ b/test/tint/array/assign_to_workgroup_var.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 65
+; Bound: 66
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -9,6 +9,8 @@
                OpExecutionMode %unused_entry_point LocalSize 1 1 1
                OpName %src_private "src_private"
                OpName %src_workgroup "src_workgroup"
+               OpName %src_uniform_block "src_uniform_block"
+               OpMemberName %src_uniform_block 0 "inner"
                OpName %S "S"
                OpMemberName %S 0 "arr"
                OpName %src_uniform "src_uniform"
@@ -23,7 +25,8 @@
                OpName %src_function "src_function"
                OpName %src_nested "src_nested"
                OpDecorate %_arr_v4int_uint_4 ArrayStride 16
-               OpDecorate %S Block
+               OpDecorate %src_uniform_block Block
+               OpMemberDecorate %src_uniform_block 0 Offset 0
                OpMemberDecorate %S 0 Offset 0
                OpDecorate %src_uniform NonWritable
                OpDecorate %src_uniform DescriptorSet 0
@@ -44,10 +47,11 @@
 %_ptr_Workgroup__arr_v4int_uint_4 = OpTypePointer Workgroup %_arr_v4int_uint_4
 %src_workgroup = OpVariable %_ptr_Workgroup__arr_v4int_uint_4 Workgroup
           %S = OpTypeStruct %_arr_v4int_uint_4
-%_ptr_Uniform_S = OpTypePointer Uniform %S
-%src_uniform = OpVariable %_ptr_Uniform_S Uniform
-%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
-%src_storage = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%src_uniform_block = OpTypeStruct %S
+%_ptr_Uniform_src_uniform_block = OpTypePointer Uniform %src_uniform_block
+%src_uniform = OpVariable %_ptr_Uniform_src_uniform_block Uniform
+%_ptr_StorageBuffer_src_uniform_block = OpTypePointer StorageBuffer %src_uniform_block
+%src_storage = OpVariable %_ptr_StorageBuffer_src_uniform_block StorageBuffer
         %dst = OpVariable %_ptr_Workgroup__arr_v4int_uint_4 Workgroup
      %uint_2 = OpConstant %uint 2
 %_arr_int_uint_2 = OpTypeArray %int %uint_2
@@ -57,62 +61,62 @@
 %_ptr_Workgroup__arr__arr__arr_int_uint_2_uint_3_uint_4 = OpTypePointer Workgroup %_arr__arr__arr_int_uint_2_uint_3_uint_4
  %dst_nested = OpVariable %_ptr_Workgroup__arr__arr__arr_int_uint_2_uint_3_uint_4 Workgroup
        %void = OpTypeVoid
-         %24 = OpTypeFunction %void
-         %28 = OpTypeFunction %_arr_v4int_uint_4
-         %31 = OpTypeFunction %S
-         %34 = OpConstantNull %S
-         %35 = OpTypeFunction %void %_arr_v4int_uint_4
+         %25 = OpTypeFunction %void
+         %29 = OpTypeFunction %_arr_v4int_uint_4
+         %32 = OpTypeFunction %S
+         %35 = OpConstantNull %S
+         %36 = OpTypeFunction %void %_arr_v4int_uint_4
 %_ptr_Function__arr_v4int_uint_4 = OpTypePointer Function %_arr_v4int_uint_4
       %int_1 = OpConstant %int 1
-         %42 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+         %43 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
       %int_2 = OpConstant %int 2
-         %44 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
+         %45 = OpConstantComposite %v4int %int_2 %int_2 %int_2 %int_2
       %int_3 = OpConstant %int 3
-         %46 = OpConstantComposite %v4int %int_3 %int_3 %int_3 %int_3
-         %47 = OpConstantComposite %_arr_v4int_uint_4 %42 %44 %46 %46
+         %47 = OpConstantComposite %v4int %int_3 %int_3 %int_3 %int_3
+         %48 = OpConstantComposite %_arr_v4int_uint_4 %43 %45 %47 %47
      %uint_0 = OpConstant %uint 0
 %_ptr_Uniform__arr_v4int_uint_4 = OpTypePointer Uniform %_arr_v4int_uint_4
 %_ptr_StorageBuffer__arr_v4int_uint_4 = OpTypePointer StorageBuffer %_arr_v4int_uint_4
 %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 = OpTypePointer Function %_arr__arr__arr_int_uint_2_uint_3_uint_4
-         %63 = OpConstantNull %_arr__arr__arr_int_uint_2_uint_3_uint_4
-%unused_entry_point = OpFunction %void None %24
-         %27 = OpLabel
+         %64 = OpConstantNull %_arr__arr__arr_int_uint_2_uint_3_uint_4
+%unused_entry_point = OpFunction %void None %25
+         %28 = OpLabel
                OpReturn
                OpFunctionEnd
-    %ret_arr = OpFunction %_arr_v4int_uint_4 None %28
-         %30 = OpLabel
+    %ret_arr = OpFunction %_arr_v4int_uint_4 None %29
+         %31 = OpLabel
                OpReturnValue %8
                OpFunctionEnd
-%ret_struct_arr = OpFunction %S None %31
-         %33 = OpLabel
-               OpReturnValue %34
+%ret_struct_arr = OpFunction %S None %32
+         %34 = OpLabel
+               OpReturnValue %35
                OpFunctionEnd
-        %foo = OpFunction %void None %35
+        %foo = OpFunction %void None %36
   %src_param = OpFunctionParameter %_arr_v4int_uint_4
-         %38 = OpLabel
+         %39 = OpLabel
 %src_function = OpVariable %_ptr_Function__arr_v4int_uint_4 Function %8
- %src_nested = OpVariable %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 Function %63
-               OpStore %dst %47
-               OpStore %dst %src_param
-         %48 = OpFunctionCall %_arr_v4int_uint_4 %ret_arr
+ %src_nested = OpVariable %_ptr_Function__arr__arr__arr_int_uint_2_uint_3_uint_4 Function %64
                OpStore %dst %48
-               OpStore %dst %8
-         %49 = OpLoad %_arr_v4int_uint_4 %src_function
+               OpStore %dst %src_param
+         %49 = OpFunctionCall %_arr_v4int_uint_4 %ret_arr
                OpStore %dst %49
-         %50 = OpLoad %_arr_v4int_uint_4 %src_private
+               OpStore %dst %8
+         %50 = OpLoad %_arr_v4int_uint_4 %src_function
                OpStore %dst %50
-         %51 = OpLoad %_arr_v4int_uint_4 %src_workgroup
+         %51 = OpLoad %_arr_v4int_uint_4 %src_private
                OpStore %dst %51
-         %52 = OpFunctionCall %S %ret_struct_arr
-         %53 = OpCompositeExtract %_arr_v4int_uint_4 %52 0
-               OpStore %dst %53
-         %56 = OpAccessChain %_ptr_Uniform__arr_v4int_uint_4 %src_uniform %uint_0
-         %57 = OpLoad %_arr_v4int_uint_4 %56
-               OpStore %dst %57
-         %59 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %src_storage %uint_0
-         %60 = OpLoad %_arr_v4int_uint_4 %59
-               OpStore %dst %60
-         %64 = OpLoad %_arr__arr__arr_int_uint_2_uint_3_uint_4 %src_nested
-               OpStore %dst_nested %64
+         %52 = OpLoad %_arr_v4int_uint_4 %src_workgroup
+               OpStore %dst %52
+         %53 = OpFunctionCall %S %ret_struct_arr
+         %54 = OpCompositeExtract %_arr_v4int_uint_4 %53 0
+               OpStore %dst %54
+         %57 = OpAccessChain %_ptr_Uniform__arr_v4int_uint_4 %src_uniform %uint_0 %uint_0
+         %58 = OpLoad %_arr_v4int_uint_4 %57
+               OpStore %dst %58
+         %60 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %src_storage %uint_0 %uint_0
+         %61 = OpLoad %_arr_v4int_uint_4 %60
+               OpStore %dst %61
+         %65 = OpLoad %_arr__arr__arr_int_uint_2_uint_3_uint_4 %src_nested
+               OpStore %dst_nested %65
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/array/strides.spvasm.expected.glsl b/test/tint/array/strides.spvasm.expected.glsl
index 6d3f329..90c988a 100644
--- a/test/tint/array/strides.spvasm.expected.glsl
+++ b/test/tint/array/strides.spvasm.expected.glsl
@@ -8,13 +8,10 @@
   strided_arr el[3][2];
 };
 
-struct S {
-  strided_arr_1 a[4];
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   strided_arr_1 a[4];
 } s;
+
 void f_1() {
   strided_arr_1 x_19[4] = s.a;
   strided_arr x_24[3][2] = s.a[3].el;
diff --git a/test/tint/benchmark/particles.wgsl.expected.glsl b/test/tint/benchmark/particles.wgsl.expected.glsl
index 88e5156..4f82c9e 100644
--- a/test/tint/benchmark/particles.wgsl.expected.glsl
+++ b/test/tint/benchmark/particles.wgsl.expected.glsl
@@ -7,13 +7,7 @@
 layout(location = 2) in vec2 quad_pos_1;
 layout(location = 0) out vec4 color_2;
 layout(location = 1) out vec2 quad_pos_2;
-struct RenderParams {
-  mat4 modelViewProjectionMatrix;
-  vec3 right;
-  vec3 up;
-};
-
-layout(binding = 0) uniform RenderParams_1 {
+layout(binding = 0) uniform RenderParams_ubo {
   mat4 modelViewProjectionMatrix;
   vec3 right;
   vec3 up;
@@ -147,11 +141,6 @@
   vec2 quad_pos;
 };
 
-struct SimulationParams {
-  float deltaTime;
-  vec4 seed;
-};
-
 struct Particle {
   vec3 position;
   float lifetime;
@@ -159,14 +148,15 @@
   vec3 velocity;
 };
 
-layout(binding = 0) uniform SimulationParams_1 {
+layout(binding = 0) uniform SimulationParams_ubo {
   float deltaTime;
   vec4 seed;
 } sim_params;
 
-layout(binding = 1, std430) buffer Particles_1 {
+layout(binding = 1, std430) buffer Particles_ssbo {
   Particle particles[];
 } data;
+
 struct UBO {
   uint width;
 };
@@ -214,8 +204,8 @@
   return;
 }
 Error parsing GLSL shader:
-ERROR: 0:64: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:64: '' : compilation terminated 
+ERROR: 0:60: 'textureQueryLevels' : no matching overloaded function found
+ERROR: 0:60: '' : compilation terminated
 ERROR: 2 compilation errors.  No code generated.
 
 
@@ -252,20 +242,18 @@
   vec3 velocity;
 };
 
-struct UBO {
-  uint width;
-};
-
-layout(binding = 3) uniform UBO_1 {
+layout(binding = 3) uniform UBO_ubo {
   uint width;
 } ubo;
 
-layout(binding = 4, std430) buffer Buffer_1 {
+layout(binding = 4, std430) buffer Buffer_ssbo {
   float weights[];
 } buf_in;
-layout(binding = 5, std430) buffer Buffer_2 {
+
+layout(binding = 5, std430) buffer Buffer_ssbo_1 {
   float weights[];
 } buf_out;
+
 uniform highp sampler2D tex_in_1;
 void import_level(uvec3 coord) {
   uint offset = (coord.x + (coord.y * ubo.width));
@@ -309,20 +297,18 @@
   vec3 velocity;
 };
 
-struct UBO {
-  uint width;
-};
-
-layout(binding = 3) uniform UBO_1 {
+layout(binding = 3) uniform UBO_ubo {
   uint width;
 } ubo;
 
-layout(binding = 4, std430) buffer Buffer_1 {
+layout(binding = 4, std430) buffer Buffer_ssbo {
   float weights[];
 } buf_in;
-layout(binding = 5, std430) buffer Buffer_2 {
+
+layout(binding = 5, std430) buffer Buffer_ssbo_1 {
   float weights[];
 } buf_out;
+
 layout(rgba8) uniform highp writeonly image2D tex_out;
 void export_level(uvec3 coord) {
   if (all(lessThan(coord.xy, uvec2(imageSize(tex_out))))) {
diff --git a/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.glsl b/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.glsl
index c2aca77..6ef2768 100644
--- a/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/dynamic_index/read.wgsl.expected.glsl
@@ -12,9 +12,10 @@
   ivec4 i[4];
 };
 
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   Inner arr[];
 } s;
+
 void tint_symbol(uint idx) {
   ivec3 a = s.arr[idx].a;
   int b = s.arr[idx].b;
diff --git a/test/tint/buffer/storage/dynamic_index/write.wgsl.expected.glsl b/test/tint/buffer/storage/dynamic_index/write.wgsl.expected.glsl
index 827cccc..71c6708 100644
--- a/test/tint/buffer/storage/dynamic_index/write.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/dynamic_index/write.wgsl.expected.glsl
@@ -12,9 +12,10 @@
   ivec4 i[4];
 };
 
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   Inner arr[];
 } s;
+
 void tint_symbol(uint idx) {
   s.arr[idx].a = ivec3(0);
   s.arr[idx].b = 0;
diff --git a/test/tint/buffer/storage/static_index/read.wgsl.expected.glsl b/test/tint/buffer/storage/static_index/read.wgsl.expected.glsl
index b2e9f78..447a5fc 100644
--- a/test/tint/buffer/storage/static_index/read.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/static_index/read.wgsl.expected.glsl
@@ -4,20 +4,7 @@
   int x;
 };
 
-struct S {
-  ivec3 a;
-  int b;
-  uvec3 c;
-  uint d;
-  vec3 e;
-  float f;
-  mat2x3 g;
-  mat3x2 h;
-  Inner i;
-  Inner j[4];
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec3 a;
   int b;
   uvec3 c;
@@ -29,6 +16,7 @@
   Inner i;
   Inner j[4];
 } s;
+
 void tint_symbol() {
   ivec3 a = s.a;
   int b = s.b;
diff --git a/test/tint/buffer/storage/static_index/write.wgsl.expected.glsl b/test/tint/buffer/storage/static_index/write.wgsl.expected.glsl
index 947728e..f2f9b98 100644
--- a/test/tint/buffer/storage/static_index/write.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/static_index/write.wgsl.expected.glsl
@@ -4,20 +4,7 @@
   int x;
 };
 
-struct S {
-  ivec3 a;
-  int b;
-  uvec3 c;
-  uint d;
-  vec3 e;
-  float f;
-  mat2x3 g;
-  mat3x2 h;
-  Inner i;
-  Inner j[4];
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec3 a;
   int b;
   uvec3 c;
@@ -29,6 +16,7 @@
   Inner i;
   Inner j[4];
 } s;
+
 void tint_symbol() {
   s.a = ivec3(0);
   s.b = 0;
diff --git a/test/tint/buffer/storage/types/array.wgsl.expected.glsl b/test/tint/buffer/storage/types/array.wgsl.expected.glsl
index 490065e..f90230b 100644
--- a/test/tint/buffer/storage/types/array.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/array.wgsl.expected.glsl
@@ -1,15 +1,13 @@
 #version 310 es
 
-struct tint_symbol_block {
-  float inner[4];
-};
-
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   float inner[4];
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   float inner[4];
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner = tint_symbol.inner;
 }
diff --git a/test/tint/buffer/storage/types/f32.wgsl.expected.glsl b/test/tint/buffer/storage/types/f32.wgsl.expected.glsl
index 8b5a1ad..7c9cd92 100644
--- a/test/tint/buffer/storage/types/f32.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/f32.wgsl.expected.glsl
@@ -1,15 +1,13 @@
 #version 310 es
 
-struct tint_symbol_block {
-  float inner;
-};
-
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   float inner;
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   float inner;
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner = tint_symbol.inner;
 }
diff --git a/test/tint/buffer/storage/types/i32.wgsl.expected.glsl b/test/tint/buffer/storage/types/i32.wgsl.expected.glsl
index 7d4b0e8..3f9cb20 100644
--- a/test/tint/buffer/storage/types/i32.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/i32.wgsl.expected.glsl
@@ -1,15 +1,13 @@
 #version 310 es
 
-struct tint_symbol_block {
-  int inner;
-};
-
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   int inner;
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   int inner;
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner = tint_symbol.inner;
 }
diff --git a/test/tint/buffer/storage/types/mat2x2.wgsl.expected.glsl b/test/tint/buffer/storage/types/mat2x2.wgsl.expected.glsl
index 44e0e39..2266eb1 100644
--- a/test/tint/buffer/storage/types/mat2x2.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/mat2x2.wgsl.expected.glsl
@@ -1,15 +1,13 @@
 #version 310 es
 
-struct tint_symbol_block {
-  mat2 inner;
-};
-
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   mat2 inner;
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   mat2 inner;
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner = tint_symbol.inner;
 }
diff --git a/test/tint/buffer/storage/types/mat2x3.wgsl.expected.glsl b/test/tint/buffer/storage/types/mat2x3.wgsl.expected.glsl
index 81b2a71..8112c5d 100644
--- a/test/tint/buffer/storage/types/mat2x3.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/mat2x3.wgsl.expected.glsl
@@ -1,15 +1,13 @@
 #version 310 es
 
-struct tint_symbol_block {
-  mat2x3 inner;
-};
-
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   mat2x3 inner;
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   mat2x3 inner;
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner = tint_symbol.inner;
 }
diff --git a/test/tint/buffer/storage/types/mat3x2.wgsl.expected.glsl b/test/tint/buffer/storage/types/mat3x2.wgsl.expected.glsl
index d2ee221..ce99ab0 100644
--- a/test/tint/buffer/storage/types/mat3x2.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/mat3x2.wgsl.expected.glsl
@@ -1,15 +1,13 @@
 #version 310 es
 
-struct tint_symbol_block {
-  mat3x2 inner;
-};
-
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   mat3x2 inner;
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   mat3x2 inner;
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner = tint_symbol.inner;
 }
diff --git a/test/tint/buffer/storage/types/mat4x4.wgsl.expected.glsl b/test/tint/buffer/storage/types/mat4x4.wgsl.expected.glsl
index 2b60247..b6c957a 100644
--- a/test/tint/buffer/storage/types/mat4x4.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/mat4x4.wgsl.expected.glsl
@@ -1,15 +1,13 @@
 #version 310 es
 
-struct tint_symbol_block {
-  mat4 inner;
-};
-
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   mat4 inner;
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   mat4 inner;
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner = tint_symbol.inner;
 }
diff --git a/test/tint/buffer/storage/types/runtime_array.wgsl.expected.glsl b/test/tint/buffer/storage/types/runtime_array.wgsl.expected.glsl
index 438385f..40eb01b 100644
--- a/test/tint/buffer/storage/types/runtime_array.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/runtime_array.wgsl.expected.glsl
@@ -4,12 +4,14 @@
   float f;
 };
 
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   S inner[];
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   S inner[];
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner[0] = tint_symbol.inner[0];
 }
diff --git a/test/tint/buffer/storage/types/struct.wgsl.expected.glsl b/test/tint/buffer/storage/types/struct.wgsl.expected.glsl
index e20caab..d33f278 100644
--- a/test/tint/buffer/storage/types/struct.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/struct.wgsl.expected.glsl
@@ -6,16 +6,14 @@
   float f;
 };
 
-struct S {
-  Inner inner;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   Inner inner;
 } tint_symbol;
-layout(binding = 1, std430) buffer S_2 {
+
+layout(binding = 1, std430) buffer S_ssbo_1 {
   Inner inner;
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1 = tint_symbol;
 }
@@ -26,8 +24,8 @@
   return;
 }
 Error parsing GLSL shader:
-ERROR: 0:18: 'assign' :  cannot convert from 'layout( binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{ global highp float f} inner}' to 'layout( binding=1 column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{ global highp float f} inner}'
-ERROR: 0:18: '' : compilation terminated 
+ERROR: 0:16: 'assign' :  cannot convert from 'layout( binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{ global highp float f} inner}' to 'layout( binding=1 column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{ global highp float f} inner}'
+ERROR: 0:16: '' : compilation terminated
 ERROR: 2 compilation errors.  No code generated.
 
 
diff --git a/test/tint/buffer/storage/types/u32.wgsl.expected.glsl b/test/tint/buffer/storage/types/u32.wgsl.expected.glsl
index c239e5a..5ee3c7c 100644
--- a/test/tint/buffer/storage/types/u32.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/u32.wgsl.expected.glsl
@@ -1,15 +1,13 @@
 #version 310 es
 
-struct tint_symbol_block {
-  uint inner;
-};
-
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   uint inner;
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   uint inner;
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner = tint_symbol.inner;
 }
diff --git a/test/tint/buffer/storage/types/vec2.wgsl.expected.glsl b/test/tint/buffer/storage/types/vec2.wgsl.expected.glsl
index 65e25d0..078f7e6 100644
--- a/test/tint/buffer/storage/types/vec2.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/vec2.wgsl.expected.glsl
@@ -1,15 +1,13 @@
 #version 310 es
 
-struct tint_symbol_block {
-  ivec2 inner;
-};
-
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   ivec2 inner;
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   ivec2 inner;
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner = tint_symbol.inner;
 }
diff --git a/test/tint/buffer/storage/types/vec3.wgsl.expected.glsl b/test/tint/buffer/storage/types/vec3.wgsl.expected.glsl
index 3d37255..899f170 100644
--- a/test/tint/buffer/storage/types/vec3.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/vec3.wgsl.expected.glsl
@@ -1,15 +1,13 @@
 #version 310 es
 
-struct tint_symbol_block {
-  uvec3 inner;
-};
-
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   uvec3 inner;
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   uvec3 inner;
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner = tint_symbol.inner;
 }
diff --git a/test/tint/buffer/storage/types/vec4.wgsl.expected.glsl b/test/tint/buffer/storage/types/vec4.wgsl.expected.glsl
index 4dc8ec5..fcb4b51 100644
--- a/test/tint/buffer/storage/types/vec4.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/vec4.wgsl.expected.glsl
@@ -1,15 +1,13 @@
 #version 310 es
 
-struct tint_symbol_block {
-  vec4 inner;
-};
-
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   vec4 inner;
 } tint_symbol;
-layout(binding = 1, std430) buffer tint_symbol_block_2 {
+
+layout(binding = 1, std430) buffer tint_symbol_block_ssbo_1 {
   vec4 inner;
 } tint_symbol_1;
+
 void tint_symbol_2() {
   tint_symbol_1.inner = tint_symbol.inner;
 }
diff --git a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl
index f9e6f8c..ebf8edb 100644
--- a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl
@@ -34,11 +34,7 @@
   Inner arr[8];
 };
 
-struct S_std140 {
-  Inner_std140 arr[8];
-};
-
-layout(binding = 0) uniform S_std140_1 {
+layout(binding = 0) uniform S_std140_ubo {
   Inner_std140 arr[8];
 } s;
 
diff --git a/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl b/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl
index 20d5414..82cc9d0 100644
--- a/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl
@@ -19,24 +19,7 @@
   Inner l[4];
 };
 
-struct S_std140 {
-  ivec3 a;
-  int b;
-  uvec3 c;
-  uint d;
-  vec3 e;
-  float f;
-  ivec2 g;
-  ivec2 h;
-  mat2x3 i;
-  vec2 j_0;
-  vec2 j_1;
-  vec2 j_2;
-  Inner k;
-  Inner l[4];
-};
-
-layout(binding = 0) uniform S_std140_1 {
+layout(binding = 0) uniform S_std140_ubo {
   ivec3 a;
   int b;
   uvec3 c;
diff --git a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl
index 9f698b3..e53a2e0 100644
--- a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -17,11 +17,7 @@
   Inner_std140 a[4];
 };
 
-struct a_block {
-  Outer_std140 inner[4];
-};
-
-layout(binding = 0) uniform a_block_1 {
+layout(binding = 0) uniform a_block_ubo {
   Outer_std140 inner[4];
 } a;
 
diff --git a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.glsl
index 38280cd..7f11118 100644
--- a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.glsl
@@ -17,11 +17,7 @@
   Inner_std140 a[4];
 };
 
-struct a_block {
-  Outer_std140 inner[4];
-};
-
-layout(binding = 0) uniform a_block_1 {
+layout(binding = 0) uniform a_block_ubo {
   Outer_std140 inner[4];
 } a;
 
diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.glsl
index 91beaa7..1850c73 100644
--- a/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.glsl
@@ -13,11 +13,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.glsl
index b2fc7d8..576ddd0 100644
--- a/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.glsl
@@ -13,11 +13,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.glsl
index 7d8afca..a6b76c6 100644
--- a/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.glsl
@@ -13,11 +13,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.glsl
index 6961e35..afca67d 100644
--- a/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.glsl
@@ -13,21 +13,14 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
-struct s_block {
-  S inner[4];
-};
-
-layout(binding = 1, std430) buffer s_block_1 {
+layout(binding = 1, std430) buffer s_block_ssbo {
   S inner[4];
 } s;
+
 S conv_S(S_std140 val) {
   S tint_symbol = S(val.before, mat2(val.m_0, val.m_1), val.after);
   return tint_symbol;
diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.glsl
index 0f49e3f..af5d513 100644
--- a/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.glsl
@@ -13,11 +13,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl
index 77e3585..8aaf4c2 100644
--- a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -18,11 +18,7 @@
   Inner_std140 a[4];
 };
 
-struct a_block {
-  Outer_std140 inner[4];
-};
-
-layout(binding = 0) uniform a_block_1 {
+layout(binding = 0) uniform a_block_ubo {
   Outer_std140 inner[4];
 } a;
 
diff --git a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.glsl
index 3df60e5..47bf6ba 100644
--- a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.glsl
@@ -18,11 +18,7 @@
   Inner_std140 a[4];
 };
 
-struct a_block {
-  Outer_std140 inner[4];
-};
-
-layout(binding = 0) uniform a_block_1 {
+layout(binding = 0) uniform a_block_ubo {
   Outer_std140 inner[4];
 } a;
 
diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.glsl
index 9ffd3ac..d940c27 100644
--- a/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.glsl
@@ -14,11 +14,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.glsl
index 04a65eb..8bcd005 100644
--- a/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.glsl
@@ -14,11 +14,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.glsl
index f9eeb07..3c89125 100644
--- a/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.glsl
@@ -14,11 +14,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.glsl
index 3a1cb49..df93b26 100644
--- a/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.glsl
@@ -14,21 +14,14 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
-struct s_block {
-  S inner[4];
-};
-
-layout(binding = 1, std430) buffer s_block_1 {
+layout(binding = 1, std430) buffer s_block_ssbo {
   S inner[4];
 } s;
+
 S conv_S(S_std140 val) {
   S tint_symbol = S(val.before, mat3x2(val.m_0, val.m_1, val.m_2), val.after);
   return tint_symbol;
diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.glsl
index 1c5b65e..d004b4b 100644
--- a/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.glsl
@@ -14,11 +14,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl
index f495bbd..1ccb8d2 100644
--- a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl
@@ -19,11 +19,7 @@
   Inner_std140 a[4];
 };
 
-struct a_block {
-  Outer_std140 inner[4];
-};
-
-layout(binding = 0) uniform a_block_1 {
+layout(binding = 0) uniform a_block_ubo {
   Outer_std140 inner[4];
 } a;
 
diff --git a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.glsl
index c1a89f6..5c10cfb 100644
--- a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.glsl
@@ -19,11 +19,7 @@
   Inner_std140 a[4];
 };
 
-struct a_block {
-  Outer_std140 inner[4];
-};
-
-layout(binding = 0) uniform a_block_1 {
+layout(binding = 0) uniform a_block_ubo {
   Outer_std140 inner[4];
 } a;
 
diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.glsl
index 110d8e5..46fbeb6 100644
--- a/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.glsl
@@ -15,11 +15,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.glsl
index a73babb..c409f8b 100644
--- a/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.glsl
@@ -15,11 +15,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.glsl
index 9bf0359..9696062 100644
--- a/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.glsl
@@ -15,11 +15,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.glsl
index fa43041..72e4c1c 100644
--- a/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.glsl
@@ -15,21 +15,14 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
-struct s_block {
-  S inner[4];
-};
-
-layout(binding = 1, std430) buffer s_block_1 {
+layout(binding = 1, std430) buffer s_block_ssbo {
   S inner[4];
 } s;
+
 S conv_S(S_std140 val) {
   S tint_symbol = S(val.before, mat4x2(val.m_0, val.m_1, val.m_2, val.m_3), val.after);
   return tint_symbol;
diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.glsl
index 945cbcf..5f308a1 100644
--- a/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.glsl
@@ -15,11 +15,7 @@
   int after;
 };
 
-struct u_block {
-  S_std140 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   S_std140 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/types/array.wgsl.expected.glsl b/test/tint/buffer/uniform/types/array.wgsl.expected.glsl
index 68352ce..d07ae63 100644
--- a/test/tint/buffer/uniform/types/array.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/array.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct u_block {
-  vec4 inner[4];
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   vec4 inner[4];
 } u;
 
diff --git a/test/tint/buffer/uniform/types/f32.wgsl.expected.glsl b/test/tint/buffer/uniform/types/f32.wgsl.expected.glsl
index 4c45bc3..664b5a3 100644
--- a/test/tint/buffer/uniform/types/f32.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/f32.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct u_block {
-  float inner;
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   float inner;
 } u;
 
diff --git a/test/tint/buffer/uniform/types/i32.wgsl.expected.glsl b/test/tint/buffer/uniform/types/i32.wgsl.expected.glsl
index 7d07279..69fc627 100644
--- a/test/tint/buffer/uniform/types/i32.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/i32.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct u_block {
-  int inner;
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   int inner;
 } u;
 
diff --git a/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.glsl b/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.glsl
index 2e7ee4f..e53fad7 100644
--- a/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct u_block {
-  mat2 inner;
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   mat2 inner;
 } u;
 
diff --git a/test/tint/buffer/uniform/types/mat2x3.wgsl.expected.glsl b/test/tint/buffer/uniform/types/mat2x3.wgsl.expected.glsl
index a47210b..ce089a2 100644
--- a/test/tint/buffer/uniform/types/mat2x3.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/mat2x3.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct u_block {
-  mat2x3 inner;
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   mat2x3 inner;
 } u;
 
diff --git a/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.glsl b/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.glsl
index 2915d77..4bf66e3 100644
--- a/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct u_block {
-  mat3x2 inner;
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   mat3x2 inner;
 } u;
 
diff --git a/test/tint/buffer/uniform/types/mat4x4.wgsl.expected.glsl b/test/tint/buffer/uniform/types/mat4x4.wgsl.expected.glsl
index 5fb106fd..f0b2c98 100644
--- a/test/tint/buffer/uniform/types/mat4x4.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/mat4x4.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct u_block {
-  mat4 inner;
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   mat4 inner;
 } u;
 
diff --git a/test/tint/buffer/uniform/types/struct.wgsl.expected.glsl b/test/tint/buffer/uniform/types/struct.wgsl.expected.glsl
index e844ec6..708f176 100644
--- a/test/tint/buffer/uniform/types/struct.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/struct.wgsl.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 struct Inner {
@@ -10,12 +8,12 @@
   Inner inner;
 };
 
-layout(binding = 0) uniform S_1 {
-  Inner inner;
+layout(binding = 0) uniform u_block_ubo {
+  S inner;
 } u;
 
 void tint_symbol() {
-  S x = u;
+  S x = u.inner;
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -23,10 +21,3 @@
   tint_symbol();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:16: '=' :  cannot convert from 'layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform structure{ global highp float f} inner}' to ' temp structure{ global structure{ global highp float f} inner}'
-ERROR: 0:16: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/buffer/uniform/types/struct.wgsl.expected.spvasm b/test/tint/buffer/uniform/types/struct.wgsl.expected.spvasm
index b8d2ad8..9c63d49 100644
--- a/test/tint/buffer/uniform/types/struct.wgsl.expected.spvasm
+++ b/test/tint/buffer/uniform/types/struct.wgsl.expected.spvasm
@@ -1,19 +1,22 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 11
+; Bound: 16
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
+               OpName %u_block "u_block"
+               OpMemberName %u_block 0 "inner"
                OpName %S "S"
                OpMemberName %S 0 "inner"
                OpName %Inner "Inner"
                OpMemberName %Inner 0 "f"
                OpName %u "u"
                OpName %main "main"
-               OpDecorate %S Block
+               OpDecorate %u_block Block
+               OpMemberDecorate %u_block 0 Offset 0
                OpMemberDecorate %S 0 Offset 0
                OpMemberDecorate %Inner 0 Offset 0
                OpDecorate %u NonWritable
@@ -22,12 +25,17 @@
       %float = OpTypeFloat 32
       %Inner = OpTypeStruct %float
           %S = OpTypeStruct %Inner
-%_ptr_Uniform_S = OpTypePointer Uniform %S
-          %u = OpVariable %_ptr_Uniform_S Uniform
+    %u_block = OpTypeStruct %S
+%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block
+          %u = OpVariable %_ptr_Uniform_u_block Uniform
        %void = OpTypeVoid
-          %6 = OpTypeFunction %void
-       %main = OpFunction %void None %6
-          %9 = OpLabel
-         %10 = OpLoad %S %u
+          %7 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_S = OpTypePointer Uniform %S
+       %main = OpFunction %void None %7
+         %10 = OpLabel
+         %14 = OpAccessChain %_ptr_Uniform_S %u %uint_0
+         %15 = OpLoad %S %14
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/buffer/uniform/types/u32.wgsl.expected.glsl b/test/tint/buffer/uniform/types/u32.wgsl.expected.glsl
index c3369ca..68cf9bc 100644
--- a/test/tint/buffer/uniform/types/u32.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/u32.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct u_block {
-  uint inner;
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   uint inner;
 } u;
 
diff --git a/test/tint/buffer/uniform/types/vec2.wgsl.expected.glsl b/test/tint/buffer/uniform/types/vec2.wgsl.expected.glsl
index 208277d..d3a3922 100644
--- a/test/tint/buffer/uniform/types/vec2.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/vec2.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct u_block {
-  ivec2 inner;
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   ivec2 inner;
 } u;
 
diff --git a/test/tint/buffer/uniform/types/vec3.wgsl.expected.glsl b/test/tint/buffer/uniform/types/vec3.wgsl.expected.glsl
index 05975ff..473cdcd 100644
--- a/test/tint/buffer/uniform/types/vec3.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/vec3.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct u_block {
-  uvec3 inner;
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   uvec3 inner;
 } u;
 
diff --git a/test/tint/buffer/uniform/types/vec4.wgsl.expected.glsl b/test/tint/buffer/uniform/types/vec4.wgsl.expected.glsl
index 93a224e..2006679 100644
--- a/test/tint/buffer/uniform/types/vec4.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/vec4.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct u_block {
-  vec4 inner;
-};
-
-layout(binding = 0) uniform u_block_1 {
+layout(binding = 0) uniform u_block_ubo {
   vec4 inner;
 } u;
 
diff --git a/test/tint/bug/chromium/1273230.wgsl.expected.glsl b/test/tint/bug/chromium/1273230.wgsl.expected.glsl
index 5793189..685ab03 100644
--- a/test/tint/bug/chromium/1273230.wgsl.expected.glsl
+++ b/test/tint/bug/chromium/1273230.wgsl.expected.glsl
@@ -1,30 +1,6 @@
 #version 310 es
 
-struct Uniforms {
-  uint numTriangles;
-  uint gridSize;
-  uint puuuuuuuuuuuuuuuuad1;
-  uint pad2;
-  vec3 bbMin;
-  vec3 bbMax;
-};
-
-struct Dbg {
-  uint offsetCounter;
-  uint pad0;
-  uint pad1;
-  uint pad2;
-  uint value0;
-  uint value1;
-  uint value2;
-  uint value3;
-  float value_f32_0;
-  float value_f32_1;
-  float value_f32_2;
-  float value_f32_3;
-};
-
-layout(binding = 0) uniform Uniforms_1 {
+layout(binding = 0) uniform Uniforms_ubo {
   uint numTriangles;
   uint gridSize;
   uint puuuuuuuuuuuuuuuuad1;
@@ -33,19 +9,23 @@
   vec3 bbMax;
 } uniforms;
 
-layout(binding = 10, std430) buffer U32s_1 {
+layout(binding = 10, std430) buffer U32s_ssbo {
   uint values[];
 } indices;
-layout(binding = 11, std430) buffer F32s_1 {
+
+layout(binding = 11, std430) buffer F32s_ssbo {
   float values[];
 } positions;
-layout(binding = 20, std430) buffer AU32s_1 {
+
+layout(binding = 20, std430) buffer AU32s_ssbo {
   uint values[];
 } counters;
-layout(binding = 21, std430) buffer AI32s_1 {
+
+layout(binding = 21, std430) buffer AI32s_ssbo {
   int values[];
 } LUT;
-layout(binding = 50, std430) buffer Dbg_1 {
+
+layout(binding = 50, std430) buffer Dbg_ssbo {
   uint offsetCounter;
   uint pad0;
   uint pad1;
@@ -59,6 +39,7 @@
   float value_f32_2;
   float value_f32_3;
 } dbg;
+
 vec3 toVoxelPos(vec3 position) {
   vec3 bbMin = vec3(uniforms.bbMin.x, uniforms.bbMin.y, uniforms.bbMin.z);
   vec3 bbMax = vec3(uniforms.bbMax.x, uniforms.bbMax.y, uniforms.bbMax.z);
diff --git a/test/tint/bug/chromium/1290107.wgsl.expected.glsl b/test/tint/bug/chromium/1290107.wgsl.expected.glsl
index 4073388..7c5b1d3 100644
--- a/test/tint/bug/chromium/1290107.wgsl.expected.glsl
+++ b/test/tint/bug/chromium/1290107.wgsl.expected.glsl
@@ -4,9 +4,10 @@
   float f;
 };
 
-layout(binding = 0, std430) buffer arr_block_1 {
+layout(binding = 0, std430) buffer arr_block_ssbo {
   S inner[];
 } arr;
+
 void tint_symbol() {
   uint len = uint(arr.inner.length());
 }
diff --git a/test/tint/bug/dawn/947.wgsl.expected.glsl b/test/tint/bug/dawn/947.wgsl.expected.glsl
index ce20459..1eb7221 100644
--- a/test/tint/bug/dawn/947.wgsl.expected.glsl
+++ b/test/tint/bug/dawn/947.wgsl.expected.glsl
@@ -13,12 +13,7 @@
 #version 310 es
 
 layout(location = 0) out vec2 texcoords_1;
-struct Uniforms {
-  vec2 u_scale;
-  vec2 u_offset;
-};
-
-layout(binding = 0) uniform Uniforms_1 {
+layout(binding = 0) uniform Uniforms_ubo {
   vec2 u_scale;
   vec2 u_offset;
 } uniforms;
diff --git a/test/tint/bug/fxc/dyn_array_idx/read/function.wgsl.expected.glsl b/test/tint/bug/fxc/dyn_array_idx/read/function.wgsl.expected.glsl
index c1318a7..e7bad69 100644
--- a/test/tint/bug/fxc/dyn_array_idx/read/function.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/dyn_array_idx/read/function.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct UBO {
-  int dynamic_idx;
-};
-
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   int dynamic_idx;
 } ubo;
 
@@ -12,13 +8,10 @@
   int data[64];
 };
 
-struct Result {
-  int tint_symbol;
-};
-
-layout(binding = 1, std430) buffer Result_1 {
+layout(binding = 1, std430) buffer Result_ssbo {
   int tint_symbol;
 } result;
+
 void f() {
   S s = S(int[64](0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
   result.tint_symbol = s.data[ubo.dynamic_idx];
diff --git a/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.glsl b/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.glsl
index f0795b3..8ed17e0 100644
--- a/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/dyn_array_idx/read/private.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct UBO {
-  int dynamic_idx;
-};
-
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   int dynamic_idx;
 } ubo;
 
@@ -12,13 +8,10 @@
   int data[64];
 };
 
-struct Result {
-  int tint_symbol;
-};
-
-layout(binding = 1, std430) buffer Result_1 {
+layout(binding = 1, std430) buffer Result_ssbo {
   int tint_symbol;
 } result;
+
 S s = S(int[64](0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
 void f() {
   result.tint_symbol = s.data[ubo.dynamic_idx];
diff --git a/test/tint/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.glsl b/test/tint/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.glsl
index 549058c..68fb649 100644
--- a/test/tint/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.glsl
@@ -1,27 +1,17 @@
 #version 310 es
 
-struct UBO {
-  int dynamic_idx;
-};
-
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   int dynamic_idx;
 } ubo;
 
-struct Result {
-  int tint_symbol;
-};
-
-layout(binding = 2, std430) buffer Result_1 {
+layout(binding = 2, std430) buffer Result_ssbo {
   int tint_symbol;
 } result;
-struct SSBO {
-  int data[4];
-};
 
-layout(binding = 1, std430) buffer SSBO_1 {
+layout(binding = 1, std430) buffer SSBO_ssbo {
   int data[4];
 } ssbo;
+
 void f() {
   result.tint_symbol = ssbo.data[ubo.dynamic_idx];
 }
diff --git a/test/tint/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.glsl b/test/tint/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.glsl
index 641aa10..e980b5d 100644
--- a/test/tint/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.glsl
@@ -1,22 +1,14 @@
 #version 310 es
 
-struct UBO {
-  ivec4 data[4];
-  int dynamic_idx;
-};
-
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   ivec4 data[4];
   int dynamic_idx;
 } ubo;
 
-struct Result {
-  int tint_symbol;
-};
-
-layout(binding = 2, std430) buffer Result_1 {
+layout(binding = 2, std430) buffer Result_ssbo {
   int tint_symbol;
 } result;
+
 void f() {
   result.tint_symbol = ubo.data[ubo.dynamic_idx].x;
 }
diff --git a/test/tint/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.glsl b/test/tint/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.glsl
index 6f0710e..c98cbdf 100644
--- a/test/tint/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct UBO {
-  int dynamic_idx;
-};
-
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   int dynamic_idx;
 } ubo;
 
@@ -12,13 +8,10 @@
   int data[64];
 };
 
-struct Result {
-  int tint_symbol;
-};
-
-layout(binding = 1, std430) buffer Result_1 {
+layout(binding = 1, std430) buffer Result_ssbo {
   int tint_symbol;
 } result;
+
 shared S s;
 void f(uint local_invocation_index) {
   {
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/function.wgsl.expected.glsl b/test/tint/bug/fxc/dyn_array_idx/write/function.wgsl.expected.glsl
index a2b99f2..1798e8b 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/function.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/function.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct UBO {
-  int dynamic_idx;
-};
-
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   int dynamic_idx;
 } ubo;
 
@@ -12,13 +8,10 @@
   int data[64];
 };
 
-struct Result {
-  int tint_symbol;
-};
-
-layout(binding = 1, std430) buffer Result_1 {
+layout(binding = 1, std430) buffer Result_ssbo {
   int tint_symbol;
 } result;
+
 void f() {
   S s = S(int[64](0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
   s.data[ubo.dynamic_idx] = 1;
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.glsl b/test/tint/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.glsl
index a2dd311..a5ca9c7 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct UBO {
-  int dynamic_idx;
-};
-
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   int dynamic_idx;
 } ubo;
 
@@ -12,13 +8,10 @@
   int data[64];
 };
 
-struct Result {
-  int tint_symbol;
-};
-
-layout(binding = 1, std430) buffer Result_1 {
+layout(binding = 1, std430) buffer Result_ssbo {
   int tint_symbol;
 } result;
+
 void x(inout S p) {
   p.data[ubo.dynamic_idx] = 1;
 }
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.glsl b/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.glsl
index 23f401b..f5737c7 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/private.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct UBO {
-  int dynamic_idx;
-};
-
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   int dynamic_idx;
 } ubo;
 
@@ -12,13 +8,10 @@
   int data[64];
 };
 
-struct Result {
-  int tint_symbol;
-};
-
-layout(binding = 1, std430) buffer Result_1 {
+layout(binding = 1, std430) buffer Result_ssbo {
   int tint_symbol;
 } result;
+
 S s = S(int[64](0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
 void f() {
   s.data[ubo.dynamic_idx] = 1;
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.glsl b/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.glsl
index 3044061..6ecdef3 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct UBO {
-  int dynamic_idx;
-};
-
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   int dynamic_idx;
 } ubo;
 
@@ -12,13 +8,10 @@
   int data[64];
 };
 
-struct Result {
-  int tint_symbol;
-};
-
-layout(binding = 1, std430) buffer Result_1 {
+layout(binding = 1, std430) buffer Result_ssbo {
   int tint_symbol;
 } result;
+
 S s = S(int[64](0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
 void x(inout S p) {
   p.data[ubo.dynamic_idx] = 1;
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.glsl b/test/tint/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.glsl
index 306a76e..8fc82a2 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.glsl
@@ -1,27 +1,17 @@
 #version 310 es
 
-struct UBO {
-  int dynamic_idx;
-};
-
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   int dynamic_idx;
 } ubo;
 
-struct Result {
-  int tint_symbol;
-};
-
-layout(binding = 2, std430) buffer Result_1 {
+layout(binding = 2, std430) buffer Result_ssbo {
   int tint_symbol;
 } result;
-struct SSBO {
-  int data[4];
-};
 
-layout(binding = 1, std430) buffer SSBO_1 {
+layout(binding = 1, std430) buffer SSBO_ssbo {
   int data[4];
 } ssbo;
+
 void f() {
   ssbo.data[ubo.dynamic_idx] = 1;
   result.tint_symbol = ssbo.data[3];
diff --git a/test/tint/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.glsl b/test/tint/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.glsl
index 5571c82..11cf201 100644
--- a/test/tint/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct UBO {
-  int dynamic_idx;
-};
-
-layout(binding = 0) uniform UBO_1 {
+layout(binding = 0) uniform UBO_ubo {
   int dynamic_idx;
 } ubo;
 
@@ -12,13 +8,10 @@
   int data[64];
 };
 
-struct Result {
-  int tint_symbol;
-};
-
-layout(binding = 1, std430) buffer Result_1 {
+layout(binding = 1, std430) buffer Result_ssbo {
   int tint_symbol;
 } result;
+
 shared S s;
 void f(uint local_invocation_index) {
   {
diff --git a/test/tint/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.glsl b/test/tint/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.glsl
index dcce86f..af6d544 100644
--- a/test/tint/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.glsl
@@ -1,9 +1,5 @@
 #version 310 es
 
-struct Simulation {
-  uint i;
-};
-
 struct Particle {
   vec3 position[8];
   float lifetime;
@@ -11,10 +7,11 @@
   vec3 velocity;
 };
 
-layout(binding = 3, std430) buffer Particles_1 {
+layout(binding = 3, std430) buffer Particles_ssbo {
   Particle p[];
 } particles;
-layout(binding = 4) uniform Simulation_1 {
+
+layout(binding = 4) uniform Simulation_ubo {
   uint i;
 } sim;
 
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.glsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.glsl
index efc5916..719abc4 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.glsl
@@ -1,11 +1,6 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.glsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.glsl
index 3c4ef9e..d3300f2 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.glsl
@@ -1,11 +1,6 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.glsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.glsl
index e2f093e..daf05d3 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.glsl
@@ -1,11 +1,6 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.glsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.glsl
index 8e13a9f..dfeccec 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.glsl
@@ -1,11 +1,6 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.glsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.glsl
index 127b0a1..647fc86 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.glsl
@@ -1,11 +1,6 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.glsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.glsl
index e301809..c0f23a7 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.glsl
@@ -1,11 +1,6 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.glsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.glsl
index e2f093e..daf05d3 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.glsl
@@ -1,11 +1,6 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
diff --git a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.glsl b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.glsl
index 59c7f97..309d081 100644
--- a/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.glsl
+++ b/test/tint/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.glsl
@@ -1,11 +1,6 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
diff --git a/test/tint/bug/tint/1046.wgsl.expected.glsl b/test/tint/bug/tint/1046.wgsl.expected.glsl
index 25caf19..a65f344 100644
--- a/test/tint/bug/tint/1046.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1046.wgsl.expected.glsl
@@ -10,15 +10,7 @@
   vec4 position;
 };
 
-struct Uniforms {
-  mat4 worldView;
-  mat4 proj;
-  uint numPointLights;
-  uint color_source;
-  vec4 color;
-};
-
-layout(binding = 0) uniform Uniforms_1 {
+layout(binding = 0) uniform Uniforms_ubo {
   mat4 worldView;
   mat4 proj;
   uint numPointLights;
@@ -26,9 +18,10 @@
   vec4 color;
 } uniforms;
 
-layout(binding = 1, std430) buffer PointLights_1 {
+layout(binding = 1, std430) buffer PointLights_ssbo {
   PointLight values[];
 } pointLights;
+
 struct FragmentInput {
   vec4 position;
   vec4 view_position;
diff --git a/test/tint/bug/tint/1061.spvasm.expected.glsl b/test/tint/bug/tint/1061.spvasm.expected.glsl
index 57d9959..edeb86c 100644
--- a/test/tint/bug/tint/1061.spvasm.expected.glsl
+++ b/test/tint/bug/tint/1061.spvasm.expected.glsl
@@ -2,11 +2,7 @@
 precision mediump float;
 
 layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec4 ref;
-};
-
-layout(binding = 0) uniform buf0_1 {
+layout(binding = 0) uniform buf0_ubo {
   vec4 ref;
 } x_7;
 
diff --git a/test/tint/bug/tint/1088.spvasm.expected.glsl b/test/tint/bug/tint/1088.spvasm.expected.glsl
index 20c3aba..6084c12 100644
--- a/test/tint/bug/tint/1088.spvasm.expected.glsl
+++ b/test/tint/bug/tint/1088.spvasm.expected.glsl
@@ -8,15 +8,8 @@
   float el;
 };
 
-struct LeftOver {
-  mat4 worldViewProjection;
-  float time;
-  mat4 test2[2];
-  strided_arr test[4];
-};
-
 vec3 position = vec3(0.0f, 0.0f, 0.0f);
-layout(binding = 2) uniform LeftOver_1 {
+layout(binding = 2) uniform LeftOver_ubo {
   mat4 worldViewProjection;
   float time;
   mat4 test2[2];
diff --git a/test/tint/bug/tint/1113.wgsl.expected.glsl b/test/tint/bug/tint/1113.wgsl.expected.glsl
index 43d7029..c077619 100644
--- a/test/tint/bug/tint/1113.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1113.wgsl.expected.glsl
@@ -1,30 +1,6 @@
 #version 310 es
 
-struct Uniforms {
-  uint numTriangles;
-  uint gridSize;
-  uint pad1;
-  uint pad2;
-  vec3 bbMin;
-  vec3 bbMax;
-};
-
-struct Dbg {
-  uint offsetCounter;
-  uint pad0;
-  uint pad1;
-  uint pad2;
-  uint value0;
-  uint value1;
-  uint value2;
-  uint value3;
-  float value_f32_0;
-  float value_f32_1;
-  float value_f32_2;
-  float value_f32_3;
-};
-
-layout(binding = 0) uniform Uniforms_1 {
+layout(binding = 0) uniform Uniforms_ubo {
   uint numTriangles;
   uint gridSize;
   uint pad1;
@@ -33,19 +9,23 @@
   vec3 bbMax;
 } uniforms;
 
-layout(binding = 10, std430) buffer U32s_1 {
+layout(binding = 10, std430) buffer U32s_ssbo {
   uint values[];
 } indices;
-layout(binding = 11, std430) buffer F32s_1 {
+
+layout(binding = 11, std430) buffer F32s_ssbo {
   float values[];
 } positions;
-layout(binding = 20, std430) buffer AU32s_1 {
+
+layout(binding = 20, std430) buffer AU32s_ssbo {
   uint values[];
 } counters;
-layout(binding = 21, std430) buffer AI32s_1 {
+
+layout(binding = 21, std430) buffer AI32s_ssbo {
   int values[];
 } LUT;
-layout(binding = 50, std430) buffer Dbg_1 {
+
+layout(binding = 50, std430) buffer Dbg_ssbo {
   uint offsetCounter;
   uint pad0;
   uint pad1;
@@ -59,6 +39,7 @@
   float value_f32_2;
   float value_f32_3;
 } dbg;
+
 vec3 toVoxelPos(vec3 position) {
   vec3 bbMin = vec3(uniforms.bbMin.x, uniforms.bbMin.y, uniforms.bbMin.z);
   vec3 bbMax = vec3(uniforms.bbMax.x, uniforms.bbMax.y, uniforms.bbMax.z);
@@ -121,31 +102,7 @@
 }
 #version 310 es
 
-struct Uniforms {
-  uint numTriangles;
-  uint gridSize;
-  uint pad1;
-  uint pad2;
-  vec3 bbMin;
-  vec3 bbMax;
-};
-
-struct Dbg {
-  uint offsetCounter;
-  uint pad0;
-  uint pad1;
-  uint pad2;
-  uint value0;
-  uint value1;
-  uint value2;
-  uint value3;
-  float value_f32_0;
-  float value_f32_1;
-  float value_f32_2;
-  float value_f32_3;
-};
-
-layout(binding = 0) uniform Uniforms_1 {
+layout(binding = 0) uniform Uniforms_ubo {
   uint numTriangles;
   uint gridSize;
   uint pad1;
@@ -154,19 +111,23 @@
   vec3 bbMax;
 } uniforms;
 
-layout(binding = 10, std430) buffer U32s_1 {
+layout(binding = 10, std430) buffer U32s_ssbo {
   uint values[];
 } indices;
-layout(binding = 11, std430) buffer F32s_1 {
+
+layout(binding = 11, std430) buffer F32s_ssbo {
   float values[];
 } positions;
-layout(binding = 20, std430) buffer AU32s_1 {
+
+layout(binding = 20, std430) buffer AU32s_ssbo {
   uint values[];
 } counters;
-layout(binding = 21, std430) buffer AI32s_1 {
+
+layout(binding = 21, std430) buffer AI32s_ssbo {
   int values[];
 } LUT;
-layout(binding = 50, std430) buffer Dbg_1 {
+
+layout(binding = 50, std430) buffer Dbg_ssbo {
   uint offsetCounter;
   uint pad0;
   uint pad1;
@@ -180,6 +141,7 @@
   float value_f32_2;
   float value_f32_3;
 } dbg;
+
 void doIgnore() {
   uint g42 = uniforms.numTriangles;
   uint kj6 = dbg.value1;
@@ -212,31 +174,7 @@
 }
 #version 310 es
 
-struct Uniforms {
-  uint numTriangles;
-  uint gridSize;
-  uint pad1;
-  uint pad2;
-  vec3 bbMin;
-  vec3 bbMax;
-};
-
-struct Dbg {
-  uint offsetCounter;
-  uint pad0;
-  uint pad1;
-  uint pad2;
-  uint value0;
-  uint value1;
-  uint value2;
-  uint value3;
-  float value_f32_0;
-  float value_f32_1;
-  float value_f32_2;
-  float value_f32_3;
-};
-
-layout(binding = 0) uniform Uniforms_1 {
+layout(binding = 0) uniform Uniforms_ubo {
   uint numTriangles;
   uint gridSize;
   uint pad1;
@@ -245,19 +183,23 @@
   vec3 bbMax;
 } uniforms;
 
-layout(binding = 10, std430) buffer U32s_1 {
+layout(binding = 10, std430) buffer U32s_ssbo {
   uint values[];
 } indices;
-layout(binding = 11, std430) buffer F32s_1 {
+
+layout(binding = 11, std430) buffer F32s_ssbo {
   float values[];
 } positions;
-layout(binding = 20, std430) buffer AU32s_1 {
+
+layout(binding = 20, std430) buffer AU32s_ssbo {
   uint values[];
 } counters;
-layout(binding = 21, std430) buffer AI32s_1 {
+
+layout(binding = 21, std430) buffer AI32s_ssbo {
   int values[];
 } LUT;
-layout(binding = 50, std430) buffer Dbg_1 {
+
+layout(binding = 50, std430) buffer Dbg_ssbo {
   uint offsetCounter;
   uint pad0;
   uint pad1;
@@ -271,6 +213,7 @@
   float value_f32_2;
   float value_f32_3;
 } dbg;
+
 vec3 toVoxelPos(vec3 position) {
   vec3 bbMin = vec3(uniforms.bbMin.x, uniforms.bbMin.y, uniforms.bbMin.z);
   vec3 bbMax = vec3(uniforms.bbMax.x, uniforms.bbMax.y, uniforms.bbMax.z);
diff --git a/test/tint/bug/tint/1118.wgsl.expected.glsl b/test/tint/bug/tint/1118.wgsl.expected.glsl
index a39c375..a695211 100644
--- a/test/tint/bug/tint/1118.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1118.wgsl.expected.glsl
@@ -16,29 +16,13 @@
 layout(location = 2) in float fClipDistance3_param_1;
 layout(location = 3) in float fClipDistance4_param_1;
 layout(location = 0) out vec4 glFragColor_1_1;
-struct Scene {
-  vec4 vEyePosition;
-};
-
-struct Material {
-  vec4 vDiffuseColor;
-  vec3 vAmbientColor;
-  float placeholder;
-  vec3 vEmissiveColor;
-  float placeholder2;
-};
-
-struct Mesh {
-  float visibility;
-};
-
 float fClipDistance3 = 0.0f;
 float fClipDistance4 = 0.0f;
-layout(binding = 0) uniform Scene_1 {
+layout(binding = 0) uniform Scene_ubo {
   vec4 vEyePosition;
 } x_29;
 
-layout(binding = 1) uniform Material_1 {
+layout(binding = 1) uniform Material_ubo {
   vec4 vDiffuseColor;
   vec3 vAmbientColor;
   float placeholder;
@@ -46,7 +30,7 @@
   float placeholder2;
 } x_49;
 
-layout(binding = 2) uniform Mesh_1 {
+layout(binding = 2) uniform Mesh_ubo {
   float visibility;
 } x_137;
 
diff --git a/test/tint/bug/tint/1121.wgsl.expected.glsl b/test/tint/bug/tint/1121.wgsl.expected.glsl
index da9bf0f..e509937 100644
--- a/test/tint/bug/tint/1121.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1121.wgsl.expected.glsl
@@ -6,31 +6,20 @@
   float radius;
 };
 
-layout(binding = 0, std430) buffer LightsBuffer_1 {
+layout(binding = 0, std430) buffer LightsBuffer_ssbo {
   LightData lights[];
 } lightsBuffer;
+
 struct TileLightIdData {
   uint count;
   uint lightId[64];
 };
 
-struct Tiles {
-  TileLightIdData data[4];
-};
-
-layout(binding = 0, std430) buffer Tiles_1 {
+layout(binding = 0, std430) buffer Tiles_ssbo {
   TileLightIdData data[4];
 } tileLightId;
-struct Config {
-  uint numLights;
-  uint numTiles;
-  uint tileCountX;
-  uint tileCountY;
-  uint numTileLightSlot;
-  uint tileSize;
-};
 
-layout(binding = 0) uniform Config_1 {
+layout(binding = 0) uniform Config_ubo {
   uint numLights;
   uint numTiles;
   uint tileCountX;
@@ -39,15 +28,7 @@
   uint tileSize;
 } config;
 
-struct Uniforms {
-  vec4 tint_symbol;
-  vec4 tint_symbol_1;
-  mat4 viewMatrix;
-  mat4 projectionMatrix;
-  vec4 fullScreenSize;
-};
-
-layout(binding = 0) uniform Uniforms_1 {
+layout(binding = 0) uniform Uniforms_ubo {
   vec4 tint_symbol;
   vec4 tint_symbol_1;
   mat4 viewMatrix;
diff --git a/test/tint/bug/tint/1136.wgsl.expected.glsl b/test/tint/bug/tint/1136.wgsl.expected.glsl
index 38b94ee..958228b 100644
--- a/test/tint/bug/tint/1136.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1136.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct Buffer {
-  uint data;
-};
-
-layout(binding = 0, std430) buffer Buffer_1 {
+layout(binding = 0, std430) buffer Buffer_ssbo {
   uint data;
 } tint_symbol;
+
 void tint_symbol_1() {
   tint_symbol.data = (tint_symbol.data + 1u);
 }
diff --git a/test/tint/bug/tint/1385.wgsl.expected.glsl b/test/tint/bug/tint/1385.wgsl.expected.glsl
index caa6386..b4f293a 100644
--- a/test/tint/bug/tint/1385.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1385.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 1, std430) buffer data_block_1 {
+layout(binding = 1, std430) buffer data_block_ssbo {
   int inner[];
 } data;
+
 int foo() {
   return data.inner[0];
 }
diff --git a/test/tint/bug/tint/1520.spvasm.expected.glsl b/test/tint/bug/tint/1520.spvasm.expected.glsl
index 468864c..0e08ab8 100644
--- a/test/tint/bug/tint/1520.spvasm.expected.glsl
+++ b/test/tint/bug/tint/1520.spvasm.expected.glsl
@@ -3,14 +3,7 @@
 
 layout(location = 0) in vec4 vcolor_S0_param_1;
 layout(location = 0) out vec4 sk_FragColor_1_1;
-struct UniformBuffer {
-  float unknownInput_S1_c0;
-  vec4 ucolorRed_S1_c0;
-  vec4 ucolorGreen_S1_c0;
-  mat3 umatrix_S1;
-};
-
-layout(binding = 0) uniform UniformBuffer_1 {
+layout(binding = 0) uniform UniformBuffer_ubo {
   float unknownInput_S1_c0;
   vec4 ucolorRed_S1_c0;
   vec4 ucolorGreen_S1_c0;
diff --git a/test/tint/bug/tint/1573.wgsl.expected.glsl b/test/tint/bug/tint/1573.wgsl.expected.glsl
index 013839e..55803e2 100644
--- a/test/tint/bug/tint/1573.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1573.wgsl.expected.glsl
@@ -6,13 +6,10 @@
 };
 
 
-struct a_block {
-  uint inner;
-};
-
-layout(binding = 0, std430) buffer a_block_1 {
+layout(binding = 0, std430) buffer a_block_ssbo {
   uint inner;
 } a;
+
 void tint_symbol() {
   uint value = 42u;
   atomic_compare_exchange_resultu32 atomic_compare_result;
diff --git a/test/tint/bug/tint/1574.wgsl.expected.glsl b/test/tint/bug/tint/1574.wgsl.expected.glsl
index bf711e7..3c839bf 100644
--- a/test/tint/bug/tint/1574.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1574.wgsl.expected.glsl
@@ -11,20 +11,14 @@
 };
 
 
-struct a_u32_block {
-  uint inner;
-};
-
-layout(binding = 0, std430) buffer a_u32_block_1 {
+layout(binding = 0, std430) buffer a_u32_block_ssbo {
   uint inner;
 } a_u32;
-struct a_i32_block {
-  int inner;
-};
 
-layout(binding = 1, std430) buffer a_i32_block_1 {
+layout(binding = 1, std430) buffer a_i32_block_ssbo {
   int inner;
 } a_i32;
+
 shared uint b_u32;
 shared int b_i32;
 void tint_symbol(uint local_invocation_index) {
diff --git a/test/tint/bug/tint/221.wgsl.expected.glsl b/test/tint/bug/tint/221.wgsl.expected.glsl
index eddc747..65779b7 100644
--- a/test/tint/bug/tint/221.wgsl.expected.glsl
+++ b/test/tint/bug/tint/221.wgsl.expected.glsl
@@ -1,14 +1,10 @@
 #version 310 es
 
-struct Buf {
-  uint count;
-  uint data[50];
-};
-
-layout(binding = 0, std430) buffer Buf_1 {
+layout(binding = 0, std430) buffer Buf_ssbo {
   uint count;
   uint data[50];
 } b;
+
 void tint_symbol() {
   uint i = 0u;
   while (true) {
diff --git a/test/tint/bug/tint/294.wgsl.expected.glsl b/test/tint/bug/tint/294.wgsl.expected.glsl
index 023a180..8bfaa2e 100644
--- a/test/tint/bug/tint/294.wgsl.expected.glsl
+++ b/test/tint/bug/tint/294.wgsl.expected.glsl
@@ -9,6 +9,7 @@
   vec3 colour;
 };
 
-layout(binding = 1, std430) buffer Lights_1 {
+layout(binding = 1, std430) buffer Lights_ssbo {
   Light light[];
 } lights;
+
diff --git a/test/tint/bug/tint/369.wgsl.expected.glsl b/test/tint/bug/tint/369.wgsl.expected.glsl
index aa195e8..0a45971 100644
--- a/test/tint/bug/tint/369.wgsl.expected.glsl
+++ b/test/tint/bug/tint/369.wgsl.expected.glsl
@@ -4,19 +4,11 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  mat2 m;
-};
-
-struct S_std140 {
-  vec2 m_0;
-  vec2 m_1;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   mat2 m;
 } SSBO;
-layout(binding = 0) uniform S_std140_1 {
+
+layout(binding = 0) uniform S_std140_ubo {
   vec2 m_0;
   vec2 m_1;
 } UBO;
diff --git a/test/tint/bug/tint/403.wgsl.expected.glsl b/test/tint/bug/tint/403.wgsl.expected.glsl
index e89b9ee..8369676 100644
--- a/test/tint/bug/tint/403.wgsl.expected.glsl
+++ b/test/tint/bug/tint/403.wgsl.expected.glsl
@@ -4,26 +4,16 @@
   mat2 transform1;
 };
 
-struct vertexUniformBuffer1_std140 {
-  vec2 transform1_0;
-  vec2 transform1_1;
-};
-
 struct vertexUniformBuffer2 {
   mat2 transform2;
 };
 
-struct vertexUniformBuffer2_std140 {
-  vec2 transform2_0;
-  vec2 transform2_1;
-};
-
-layout(binding = 0) uniform vertexUniformBuffer1_std140_1 {
+layout(binding = 0) uniform vertexUniformBuffer1_std140_ubo {
   vec2 transform1_0;
   vec2 transform1_1;
 } x_20;
 
-layout(binding = 0) uniform vertexUniformBuffer2_std140_1 {
+layout(binding = 0) uniform vertexUniformBuffer2_std140_ubo {
   vec2 transform2_0;
   vec2 transform2_1;
 } x_26;
diff --git a/test/tint/bug/tint/492.wgsl.expected.glsl b/test/tint/bug/tint/492.wgsl.expected.glsl
index 74c958e..1e8e23f 100644
--- a/test/tint/bug/tint/492.wgsl.expected.glsl
+++ b/test/tint/bug/tint/492.wgsl.expected.glsl
@@ -1,12 +1,9 @@
 #version 310 es
 
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } buf;
+
 void tint_symbol() {
   buf.a = 12;
 }
diff --git a/test/tint/bug/tint/534.wgsl.expected.glsl b/test/tint/bug/tint/534.wgsl.expected.glsl
index cf35895..7c556c5 100644
--- a/test/tint/bug/tint/534.wgsl.expected.glsl
+++ b/test/tint/bug/tint/534.wgsl.expected.glsl
@@ -1,16 +1,10 @@
 #version 310 es
 
-struct Uniforms {
-  uint dstTextureFlipY;
-  uint isFloat16;
-  uint isRGB10A2Unorm;
-  uint channelCount;
-};
-
-layout(binding = 2, std430) buffer OutputBuf_1 {
+layout(binding = 2, std430) buffer OutputBuf_ssbo {
   uint result[];
 } tint_symbol;
-layout(binding = 3) uniform Uniforms_1 {
+
+layout(binding = 3) uniform Uniforms_ubo {
   uint dstTextureFlipY;
   uint isFloat16;
   uint isRGB10A2Unorm;
diff --git a/test/tint/bug/tint/744.wgsl.expected.glsl b/test/tint/bug/tint/744.wgsl.expected.glsl
index b6c9722..eeeef67 100644
--- a/test/tint/bug/tint/744.wgsl.expected.glsl
+++ b/test/tint/bug/tint/744.wgsl.expected.glsl
@@ -1,21 +1,18 @@
 #version 310 es
 
-struct Uniforms {
-  uvec2 aShape;
-  uvec2 bShape;
-  uvec2 outShape;
-};
-
-layout(binding = 0, std430) buffer Matrix_1 {
+layout(binding = 0, std430) buffer Matrix_ssbo {
   uint numbers[];
 } firstMatrix;
-layout(binding = 1, std430) buffer Matrix_2 {
+
+layout(binding = 1, std430) buffer Matrix_ssbo_1 {
   uint numbers[];
 } secondMatrix;
-layout(binding = 2, std430) buffer Matrix_3 {
+
+layout(binding = 2, std430) buffer Matrix_ssbo_2 {
   uint numbers[];
 } resultMatrix;
-layout(binding = 3) uniform Uniforms_1 {
+
+layout(binding = 3) uniform Uniforms_ubo {
   uvec2 aShape;
   uvec2 bShape;
   uvec2 outShape;
diff --git a/test/tint/bug/tint/749.spvasm.expected.glsl b/test/tint/bug/tint/749.spvasm.expected.glsl
index ea9ce91..7f580c1 100644
--- a/test/tint/bug/tint/749.spvasm.expected.glsl
+++ b/test/tint/bug/tint/749.spvasm.expected.glsl
@@ -6,13 +6,9 @@
   int numbers[10];
 };
 
-struct buf0 {
-  vec2 resolution;
-};
-
 QuicksortObject obj = QuicksortObject(int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
 vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
+layout(binding = 0) uniform buf0_ubo {
   vec2 resolution;
 } x_188;
 
diff --git a/test/tint/bug/tint/757.wgsl.expected.glsl b/test/tint/bug/tint/757.wgsl.expected.glsl
index cd7ba22..f8fe064 100644
--- a/test/tint/bug/tint/757.wgsl.expected.glsl
+++ b/test/tint/bug/tint/757.wgsl.expected.glsl
@@ -4,9 +4,10 @@
   int level;
 };
 
-layout(binding = 3, std430) buffer Result_1 {
+layout(binding = 3, std430) buffer Result_ssbo {
   float values[];
 } result;
+
 uniform highp sampler2DArray myTexture_1;
 void tint_symbol(uvec3 GlobalInvocationID) {
   uint flatIndex = (((4u * GlobalInvocationID.z) + (2u * GlobalInvocationID.y)) + GlobalInvocationID.x);
diff --git a/test/tint/bug/tint/827.wgsl.expected.glsl b/test/tint/bug/tint/827.wgsl.expected.glsl
index 4098e55..43f26e2 100644
--- a/test/tint/bug/tint/827.wgsl.expected.glsl
+++ b/test/tint/bug/tint/827.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 1, std430) buffer Result_1 {
+layout(binding = 1, std430) buffer Result_ssbo {
   float values[];
 } result;
+
 uniform highp sampler2D tex_1;
 void tint_symbol(uvec3 GlobalInvocationId) {
   result.values[((GlobalInvocationId.y * 128u) + GlobalInvocationId.x)] = texelFetch(tex_1, ivec2(int(GlobalInvocationId.x), int(GlobalInvocationId.y)), 0).x;
diff --git a/test/tint/bug/tint/870.spvasm.expected.glsl b/test/tint/bug/tint/870.spvasm.expected.glsl
index ed30b13..fc79f0f 100644
--- a/test/tint/bug/tint/870.spvasm.expected.glsl
+++ b/test/tint/bug/tint/870.spvasm.expected.glsl
@@ -8,13 +8,10 @@
   int orientation[6];
 };
 
-struct x_B4_BuildInformation {
-  sspp962805860buildInformationS passthru;
-};
-
-layout(binding = 2, std430) buffer x_B4_BuildInformation_1 {
+layout(binding = 2, std430) buffer x_B4_BuildInformation_ssbo {
   sspp962805860buildInformationS passthru;
 } sspp962805860buildInformation;
+
 void main_1() {
   int orientation[6] = int[6](0, 0, 0, 0, 0, 0);
   int x_23[6] = sspp962805860buildInformation.passthru.orientation;
diff --git a/test/tint/bug/tint/913.wgsl.expected.glsl b/test/tint/bug/tint/913.wgsl.expected.glsl
index bd770ef..01a54d0 100644
--- a/test/tint/bug/tint/913.wgsl.expected.glsl
+++ b/test/tint/bug/tint/913.wgsl.expected.glsl
@@ -1,17 +1,10 @@
 #version 310 es
 
-struct Uniforms {
-  uint dstTextureFlipY;
-  uint channelCount;
-  uvec2 srcCopyOrigin;
-  uvec2 dstCopyOrigin;
-  uvec2 copySize;
-};
-
-layout(binding = 2, std430) buffer OutputBuf_1 {
+layout(binding = 2, std430) buffer OutputBuf_ssbo {
   uint result[];
 } tint_symbol;
-layout(binding = 3) uniform Uniforms_1 {
+
+layout(binding = 3) uniform Uniforms_ubo {
   uint dstTextureFlipY;
   uint channelCount;
   uvec2 srcCopyOrigin;
diff --git a/test/tint/bug/tint/914.wgsl.expected.glsl b/test/tint/bug/tint/914.wgsl.expected.glsl
index 25b3ff3..284ace8 100644
--- a/test/tint/bug/tint/914.wgsl.expected.glsl
+++ b/test/tint/bug/tint/914.wgsl.expected.glsl
@@ -1,21 +1,18 @@
 #version 310 es
 
-struct Uniforms {
-  uint dimAOuter;
-  uint dimInner;
-  uint dimBOuter;
-};
-
-layout(binding = 0, std430) buffer Matrix_1 {
+layout(binding = 0, std430) buffer Matrix_ssbo {
   float numbers[];
 } firstMatrix;
-layout(binding = 1, std430) buffer Matrix_2 {
+
+layout(binding = 1, std430) buffer Matrix_ssbo_1 {
   float numbers[];
 } secondMatrix;
-layout(binding = 2, std430) buffer Matrix_3 {
+
+layout(binding = 2, std430) buffer Matrix_ssbo_2 {
   float numbers[];
 } resultMatrix;
-layout(binding = 3) uniform Uniforms_1 {
+
+layout(binding = 3) uniform Uniforms_ubo {
   uint dimAOuter;
   uint dimInner;
   uint dimBOuter;
diff --git a/test/tint/bug/tint/922.wgsl.expected.glsl b/test/tint/bug/tint/922.wgsl.expected.glsl
index eaefb02..d88d887 100644
--- a/test/tint/bug/tint/922.wgsl.expected.glsl
+++ b/test/tint/bug/tint/922.wgsl.expected.glsl
@@ -25,35 +25,22 @@
   vec4 my;
 };
 
-struct ub_SceneParams {
-  Mat4x4_ u_Projection;
-};
-
-struct ub_MaterialParams {
-  Mat4x2_ u_TexMtx[1];
-  vec4 u_Misc0_;
-};
-
-struct ub_PacketParams {
-  Mat4x3_ u_PosMtx[32];
-};
-
 struct VertexOutput {
   vec4 v_Color;
   vec2 v_TexCoord;
   vec4 member;
 };
 
-layout(binding = 0) uniform ub_SceneParams_1 {
+layout(binding = 0) uniform ub_SceneParams_ubo {
   Mat4x4_ u_Projection;
 } global;
 
-layout(binding = 1) uniform ub_MaterialParams_1 {
+layout(binding = 1) uniform ub_MaterialParams_ubo {
   Mat4x2_ u_TexMtx[1];
   vec4 u_Misc0_;
 } global1;
 
-layout(binding = 2) uniform ub_PacketParams_1 {
+layout(binding = 2) uniform ub_PacketParams_ubo {
   Mat4x3_ u_PosMtx[32];
 } global2;
 
diff --git a/test/tint/bug/tint/926.wgsl.expected.glsl b/test/tint/bug/tint/926.wgsl.expected.glsl
index 7e80241..1171d66 100644
--- a/test/tint/bug/tint/926.wgsl.expected.glsl
+++ b/test/tint/bug/tint/926.wgsl.expected.glsl
@@ -1,12 +1,9 @@
 #version 310 es
 
-struct DrawIndirectArgs {
-  uint vertexCount;
-};
-
-layout(binding = 5, std430) buffer DrawIndirectArgs_1 {
+layout(binding = 5, std430) buffer DrawIndirectArgs_ssbo {
   uint vertexCount;
 } drawOut;
+
 uint cubeVerts = 0u;
 void computeMain(uvec3 global_id) {
   uint firstVertex = atomicAdd(drawOut.vertexCount, cubeVerts);
diff --git a/test/tint/bug/tint/942.wgsl.expected.glsl b/test/tint/bug/tint/942.wgsl.expected.glsl
index d194f13..f577d03 100644
--- a/test/tint/bug/tint/942.wgsl.expected.glsl
+++ b/test/tint/bug/tint/942.wgsl.expected.glsl
@@ -1,21 +1,12 @@
 #version 310 es
 
-struct Params {
-  uint filterDim;
-  uint blockDim;
-};
-
-layout(binding = 1) uniform Params_1 {
+layout(binding = 1) uniform Params_ubo {
   uint filterDim;
   uint blockDim;
 } params;
 
 layout(rgba8) uniform highp writeonly image2D outputTex;
-struct Flip {
-  uint value;
-};
-
-layout(binding = 3) uniform Flip_1 {
+layout(binding = 3) uniform Flip_ubo {
   uint value;
 } flip;
 
diff --git a/test/tint/bug/tint/943.spvasm.expected.glsl b/test/tint/bug/tint/943.spvasm.expected.glsl
index 2f05a68..59b4da0 100644
--- a/test/tint/bug/tint/943.spvasm.expected.glsl
+++ b/test/tint/bug/tint/943.spvasm.expected.glsl
@@ -3,16 +3,8 @@
 note: reading from module-scope private variable 'dimInner_1' may result in a non-uniform value
 #version 310 es
 
-struct Uniforms {
-  float NAN;
-  ivec3 aShape;
-  ivec3 bShape;
-  ivec3 outShape;
-  ivec2 outShapeStrides;
-};
-
 int dimAOuter_1 = 0;
-layout(binding = 3) uniform Uniforms_1 {
+layout(binding = 3) uniform Uniforms_ubo {
   float NAN;
   ivec3 aShape;
   ivec3 bShape;
@@ -22,20 +14,23 @@
 
 int dimInner_1 = 0;
 int dimBOuter_1 = 0;
-layout(binding = 0, std430) buffer ssbOut_1 {
+layout(binding = 0, std430) buffer ssbOut_ssbo {
   float result[];
 } x_54;
+
 uvec3 tint_symbol = uvec3(0u, 0u, 0u);
 uvec3 tint_symbol_1 = uvec3(0u, 0u, 0u);
 shared float mm_Asub[64][64];
 shared float mm_Bsub[64][1];
-layout(binding = 1, std430) buffer ssbA_1 {
+layout(binding = 1, std430) buffer ssbA_ssbo {
   float A[];
 } x_165;
+
 int batch = 0;
-layout(binding = 2, std430) buffer ssbB_1 {
+layout(binding = 2, std430) buffer ssbB_ssbo {
   float B[];
 } x_185;
+
 bool coordsInBounds_vi2_vi2_(inout ivec2 coord, inout ivec2 shape) {
   bool x_87 = false;
   bool x_88_phi = false;
diff --git a/test/tint/bug/tint/948.wgsl.expected.glsl b/test/tint/bug/tint/948.wgsl.expected.glsl
index bdeba4b..50e6863 100644
--- a/test/tint/bug/tint/948.wgsl.expected.glsl
+++ b/test/tint/bug/tint/948.wgsl.expected.glsl
@@ -25,19 +25,7 @@
 layout(location = 0) in vec3 vPosition_param_1;
 layout(location = 1) in vec2 vUV_param_1;
 layout(location = 0) out vec4 glFragColor_1_1;
-struct LeftOver {
-  float time;
-  uint padding;
-  mat4 worldViewProjection;
-  vec2 outputSize;
-  vec2 stageSize;
-  vec2 spriteMapSize;
-  float stageScale;
-  float spriteCount;
-  vec3 colorMul;
-};
-
-layout(binding = 9) uniform LeftOver_1 {
+layout(binding = 9) uniform LeftOver_ubo {
   float time;
   uint padding;
   mat4 worldViewProjection;
diff --git a/test/tint/bug/tint/949.wgsl.expected.glsl b/test/tint/bug/tint/949.wgsl.expected.glsl
index 8cac306..3372f67 100644
--- a/test/tint/bug/tint/949.wgsl.expected.glsl
+++ b/test/tint/bug/tint/949.wgsl.expected.glsl
@@ -23,32 +23,10 @@
   vec3 specular;
 };
 
-struct LeftOver {
-  mat4 u_World;
-  mat4 u_ViewProjection;
-  float u_bumpStrength;
-  uint padding;
-  vec3 u_cameraPosition;
-  float u_parallaxScale;
-  float textureInfoName;
-  uint padding_1;
-  vec2 tangentSpaceParameter0;
-};
-
-struct Light0 {
-  vec4 vLightData;
-  vec4 vLightDiffuse;
-  vec4 vLightSpecular;
-  vec3 vLightGround;
-  uint padding_2;
-  vec4 shadowsInfo;
-  vec2 depthValues;
-};
-
 float u_Float = 0.0f;
 vec3 u_Color = vec3(0.0f, 0.0f, 0.0f);
 vec2 vMainuv = vec2(0.0f, 0.0f);
-layout(binding = 6) uniform LeftOver_1 {
+layout(binding = 6) uniform LeftOver_ubo {
   mat4 u_World;
   mat4 u_ViewProjection;
   float u_bumpStrength;
@@ -64,7 +42,7 @@
 bool tint_symbol = false;
 vec2 v_uv = vec2(0.0f, 0.0f);
 vec4 v_output2 = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 5) uniform Light0_1 {
+layout(binding = 5) uniform Light0_ubo {
   vec4 vLightData;
   vec4 vLightDiffuse;
   vec4 vLightSpecular;
diff --git a/test/tint/bug/tint/951.spvasm.expected.glsl b/test/tint/bug/tint/951.spvasm.expected.glsl
index 865294e..4711f56 100644
--- a/test/tint/bug/tint/951.spvasm.expected.glsl
+++ b/test/tint/bug/tint/951.spvasm.expected.glsl
@@ -1,21 +1,15 @@
 #version 310 es
 
-struct Uniforms {
-  float NAN;
-  int aShape;
-  int outShape;
-  int outShapeStrides;
-  int size;
-};
-
-layout(binding = 0, std430) buffer ssbOut_1 {
+layout(binding = 0, std430) buffer ssbOut_ssbo {
   float result[];
 } x_16;
-layout(binding = 1, std430) buffer ssbA_1 {
+
+layout(binding = 1, std430) buffer ssbA_ssbo {
   float A[];
 } x_20;
+
 uvec3 tint_symbol = uvec3(0u, 0u, 0u);
-layout(binding = 2) uniform Uniforms_1 {
+layout(binding = 2) uniform Uniforms_ubo {
   float NAN;
   int aShape;
   int outShape;
diff --git a/test/tint/bug/tint/959.wgsl.expected.glsl b/test/tint/bug/tint/959.wgsl.expected.glsl
index 7538459..a461051 100644
--- a/test/tint/bug/tint/959.wgsl.expected.glsl
+++ b/test/tint/bug/tint/959.wgsl.expected.glsl
@@ -1,63 +1,67 @@
 #version 310 es
 precision mediump float;
 
-struct S {
-  float a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   float a;
 } b0;
-layout(binding = 0, std430) buffer S_2 {
+
+layout(binding = 0, std430) buffer S_ssbo_1 {
   float a;
 } b1;
-layout(binding = 0, std430) buffer S_3 {
+
+layout(binding = 0, std430) buffer S_ssbo_2 {
   float a;
 } b2;
-layout(binding = 0, std430) buffer S_4 {
+
+layout(binding = 0, std430) buffer S_ssbo_3 {
   float a;
 } b3;
-layout(binding = 0, std430) buffer S_5 {
+
+layout(binding = 0, std430) buffer S_ssbo_4 {
   float a;
 } b4;
-layout(binding = 0, std430) buffer S_6 {
+
+layout(binding = 0, std430) buffer S_ssbo_5 {
   float a;
 } b5;
-layout(binding = 0, std430) buffer S_7 {
+
+layout(binding = 0, std430) buffer S_ssbo_6 {
   float a;
 } b6;
-layout(binding = 0, std430) buffer S_8 {
+
+layout(binding = 0, std430) buffer S_ssbo_7 {
   float a;
 } b7;
-layout(binding = 1) uniform S_9 {
+
+layout(binding = 1) uniform S_ubo {
   float a;
 } b8;
 
-layout(binding = 1) uniform S_10 {
+layout(binding = 1) uniform S_ubo_1 {
   float a;
 } b9;
 
-layout(binding = 1) uniform S_11 {
+layout(binding = 1) uniform S_ubo_2 {
   float a;
 } b10;
 
-layout(binding = 1) uniform S_12 {
+layout(binding = 1) uniform S_ubo_3 {
   float a;
 } b11;
 
-layout(binding = 1) uniform S_13 {
+layout(binding = 1) uniform S_ubo_4 {
   float a;
 } b12;
 
-layout(binding = 1) uniform S_14 {
+layout(binding = 1) uniform S_ubo_5 {
   float a;
 } b13;
 
-layout(binding = 1) uniform S_15 {
+layout(binding = 1) uniform S_ubo_6 {
   float a;
 } b14;
 
-layout(binding = 1) uniform S_16 {
+layout(binding = 1) uniform S_ubo_7 {
   float a;
 } b15;
 
diff --git a/test/tint/bug/tint/977.spvasm.expected.glsl b/test/tint/bug/tint/977.spvasm.expected.glsl
index b784f3e..8715d9e 100644
--- a/test/tint/bug/tint/977.spvasm.expected.glsl
+++ b/test/tint/bug/tint/977.spvasm.expected.glsl
@@ -7,9 +7,10 @@
 };
 
 uvec3 tint_symbol = uvec3(0u, 0u, 0u);
-layout(binding = 2, std430) buffer ResultMatrix_1 {
+layout(binding = 2, std430) buffer ResultMatrix_ssbo {
   float numbers[];
 } resultMatrix;
+
 float binaryOperation_f1_f1_(inout float a, inout float b) {
   float x_26 = 0.0f;
   float x_13 = b;
diff --git a/test/tint/bug/tint/980.wgsl.expected.glsl b/test/tint/bug/tint/980.wgsl.expected.glsl
index 215481c..cfe795c 100644
--- a/test/tint/bug/tint/980.wgsl.expected.glsl
+++ b/test/tint/bug/tint/980.wgsl.expected.glsl
@@ -6,15 +6,11 @@
   return normalize(normal);
 }
 
-struct S {
-  vec3 v;
-  uint i;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   vec3 v;
   uint i;
 } io;
+
 void tint_symbol(uint idx) {
   vec3 tint_symbol_1 = Bad(io.i, io.v);
   io.v = tint_symbol_1;
diff --git a/test/tint/bug/tint/993.wgsl.expected.glsl b/test/tint/bug/tint/993.wgsl.expected.glsl
index 2e4ad53..bd15be7 100644
--- a/test/tint/bug/tint/993.wgsl.expected.glsl
+++ b/test/tint/bug/tint/993.wgsl.expected.glsl
@@ -1,27 +1,17 @@
 #version 310 es
 
-struct Constants {
-  uint zero;
-};
-
-layout(binding = 0) uniform Constants_1 {
+layout(binding = 0) uniform Constants_ubo {
   uint zero;
 } constants;
 
-struct Result {
-  uint value;
-};
-
-layout(binding = 1, std430) buffer Result_1 {
+layout(binding = 1, std430) buffer Result_ssbo {
   uint value;
 } result;
-struct TestData {
-  int data[3];
-};
 
-layout(binding = 0, std430) buffer TestData_1 {
+layout(binding = 0, std430) buffer TestData_ssbo {
   int data[3];
 } s;
+
 int runTest() {
   return atomicOr(s.data[(0u + uint(constants.zero))], 0);
 }
diff --git a/test/tint/bug/tint/998.wgsl.expected.glsl b/test/tint/bug/tint/998.wgsl.expected.glsl
index 226cf72..30dd9b8 100644
--- a/test/tint/bug/tint/998.wgsl.expected.glsl
+++ b/test/tint/bug/tint/998.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct Constants {
-  uint zero;
-};
-
-layout(binding = 0) uniform Constants_1 {
+layout(binding = 0) uniform Constants_ubo {
   uint zero;
 } constants;
 
diff --git a/test/tint/builtins/arrayLength/complex_via_let.wgsl.expected.glsl b/test/tint/builtins/arrayLength/complex_via_let.wgsl.expected.glsl
index 7d17e02..c67fc49 100644
--- a/test/tint/builtins/arrayLength/complex_via_let.wgsl.expected.glsl
+++ b/test/tint/builtins/arrayLength/complex_via_let.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a[];
 } G;
+
 void tint_symbol() {
   uint l1 = uint(G.a.length());
 }
diff --git a/test/tint/builtins/arrayLength/complex_via_let_no_struct.wgsl.expected.glsl b/test/tint/builtins/arrayLength/complex_via_let_no_struct.wgsl.expected.glsl
index c7ac2b7..b5587e7 100644
--- a/test/tint/builtins/arrayLength/complex_via_let_no_struct.wgsl.expected.glsl
+++ b/test/tint/builtins/arrayLength/complex_via_let_no_struct.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer G_block_1 {
+layout(binding = 0, std430) buffer G_block_ssbo {
   int inner[];
 } G;
+
 void tint_symbol() {
   uint l1 = uint(G.inner.length());
 }
diff --git a/test/tint/builtins/arrayLength/deprecated.wgsl.expected.glsl b/test/tint/builtins/arrayLength/deprecated.wgsl.expected.glsl
index b6e9fe6..3b29a21 100644
--- a/test/tint/builtins/arrayLength/deprecated.wgsl.expected.glsl
+++ b/test/tint/builtins/arrayLength/deprecated.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a[];
 } G;
+
 void tint_symbol() {
   uint l1 = uint(G.a.length());
   uint l2 = uint(G.a.length());
diff --git a/test/tint/builtins/arrayLength/simple.wgsl.expected.glsl b/test/tint/builtins/arrayLength/simple.wgsl.expected.glsl
index 7d17e02..c67fc49 100644
--- a/test/tint/builtins/arrayLength/simple.wgsl.expected.glsl
+++ b/test/tint/builtins/arrayLength/simple.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a[];
 } G;
+
 void tint_symbol() {
   uint l1 = uint(G.a.length());
 }
diff --git a/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.glsl b/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.glsl
index c7ac2b7..b5587e7 100644
--- a/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.glsl
+++ b/test/tint/builtins/arrayLength/simple_no_struct.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer G_block_1 {
+layout(binding = 0, std430) buffer G_block_ssbo {
   int inner[];
 } G;
+
 void tint_symbol() {
   uint l1 = uint(G.inner.length());
 }
diff --git a/test/tint/builtins/arrayLength/via_let.wgsl.expected.glsl b/test/tint/builtins/arrayLength/via_let.wgsl.expected.glsl
index 7d17e02..c67fc49 100644
--- a/test/tint/builtins/arrayLength/via_let.wgsl.expected.glsl
+++ b/test/tint/builtins/arrayLength/via_let.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a[];
 } G;
+
 void tint_symbol() {
   uint l1 = uint(G.a.length());
 }
diff --git a/test/tint/builtins/arrayLength/via_let_complex.wgsl.expected.glsl b/test/tint/builtins/arrayLength/via_let_complex.wgsl.expected.glsl
index 7d17e02..c67fc49 100644
--- a/test/tint/builtins/arrayLength/via_let_complex.wgsl.expected.glsl
+++ b/test/tint/builtins/arrayLength/via_let_complex.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a[];
 } G;
+
 void tint_symbol() {
   uint l1 = uint(G.a.length());
 }
diff --git a/test/tint/builtins/arrayLength/via_let_complex_no_struct.wgsl.expected.glsl b/test/tint/builtins/arrayLength/via_let_complex_no_struct.wgsl.expected.glsl
index c7ac2b7..b5587e7 100644
--- a/test/tint/builtins/arrayLength/via_let_complex_no_struct.wgsl.expected.glsl
+++ b/test/tint/builtins/arrayLength/via_let_complex_no_struct.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer G_block_1 {
+layout(binding = 0, std430) buffer G_block_ssbo {
   int inner[];
 } G;
+
 void tint_symbol() {
   uint l1 = uint(G.inner.length());
 }
diff --git a/test/tint/builtins/arrayLength/via_let_no_struct.wgsl.expected.glsl b/test/tint/builtins/arrayLength/via_let_no_struct.wgsl.expected.glsl
index c7ac2b7..b5587e7 100644
--- a/test/tint/builtins/arrayLength/via_let_no_struct.wgsl.expected.glsl
+++ b/test/tint/builtins/arrayLength/via_let_no_struct.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer G_block_1 {
+layout(binding = 0, std430) buffer G_block_ssbo {
   int inner[];
 } G;
+
 void tint_symbol() {
   uint l1 = uint(G.inner.length());
 }
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.glsl
index 875dc08..ca2a7f9 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int res = 0;
   int x_9 = atomicAdd(sb_rw.arg_0, 1);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int res = 0;
   int x_9 = atomicAdd(sb_rw.arg_0, 1);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.glsl
index 48a0735..7ffe848 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint res = 0u;
   uint x_9 = atomicAdd(sb_rw.arg_0, 1u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint res = 0u;
   uint x_9 = atomicAdd(sb_rw.arg_0, 1u);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.glsl
index 28adfe0..20ff9c8 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAnd_152966() {
   int res = 0;
   int x_9 = atomicAnd(sb_rw.arg_0, 1);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAnd_152966() {
   int res = 0;
   int x_9 = atomicAnd(sb_rw.arg_0, 1);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.glsl
index 6d879c1..362308c 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAnd_85a8d9() {
   uint res = 0u;
   uint x_9 = atomicAnd(sb_rw.arg_0, 1u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAnd_85a8d9() {
   uint res = 0u;
   uint x_9 = atomicAnd(sb_rw.arg_0, 1u);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl
index b46c227..f26f67a 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl
@@ -7,10 +7,6 @@
 };
 
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
@@ -20,9 +16,10 @@
   bool exchanged;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_1bd40a() {
   x__atomic_compare_exchange_resulti32 res = x__atomic_compare_exchange_resulti32(0, false);
   atomic_compare_exchange_resulti32 atomic_compare_result;
@@ -57,10 +54,6 @@
 };
 
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
@@ -70,9 +63,10 @@
   bool exchanged;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_1bd40a() {
   x__atomic_compare_exchange_resulti32 res = x__atomic_compare_exchange_resulti32(0, false);
   atomic_compare_exchange_resulti32 atomic_compare_result;
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl
index 385735d..79a81ac 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl
@@ -7,10 +7,6 @@
 };
 
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
@@ -20,9 +16,10 @@
   bool exchanged;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_63d8e6() {
   x__atomic_compare_exchange_resultu32 res = x__atomic_compare_exchange_resultu32(0u, false);
   atomic_compare_exchange_resultu32 atomic_compare_result;
@@ -57,10 +54,6 @@
 };
 
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
@@ -70,9 +63,10 @@
   bool exchanged;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_63d8e6() {
   x__atomic_compare_exchange_resultu32 res = x__atomic_compare_exchange_resultu32(0u, false);
   atomic_compare_exchange_resultu32 atomic_compare_result;
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.glsl
index 4fdae27..cb759e7 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicExchange_f2e22f() {
   int res = 0;
   int x_9 = atomicExchange(sb_rw.arg_0, 1);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicExchange_f2e22f() {
   int res = 0;
   int x_9 = atomicExchange(sb_rw.arg_0, 1);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.glsl
index 57f0291..ae7c7a4 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicExchange_d59712() {
   uint res = 0u;
   uint x_9 = atomicExchange(sb_rw.arg_0, 1u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicExchange_d59712() {
   uint res = 0u;
   uint x_9 = atomicExchange(sb_rw.arg_0, 1u);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.glsl
index d034197..c5f15b1 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicLoad_0806ad() {
   int res = 0;
   int x_9 = atomicOr(sb_rw.arg_0, 0);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicLoad_0806ad() {
   int res = 0;
   int x_9 = atomicOr(sb_rw.arg_0, 0);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.glsl
index cebe232..8bddcce 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicLoad_fe6cc3() {
   uint res = 0u;
   uint x_9 = atomicOr(sb_rw.arg_0, 0u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicLoad_fe6cc3() {
   uint res = 0u;
   uint x_9 = atomicOr(sb_rw.arg_0, 0u);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.glsl
index 6341848..388ccf7 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMax_92aa72() {
   int res = 0;
   int x_9 = atomicMax(sb_rw.arg_0, 1);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMax_92aa72() {
   int res = 0;
   int x_9 = atomicMax(sb_rw.arg_0, 1);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.glsl
index 08dd962..9cdec37 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMax_51b9be() {
   uint res = 0u;
   uint x_9 = atomicMax(sb_rw.arg_0, 1u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMax_51b9be() {
   uint res = 0u;
   uint x_9 = atomicMax(sb_rw.arg_0, 1u);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.glsl
index 021d201..5aad3be 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMin_8e38dc() {
   int res = 0;
   int x_9 = atomicMin(sb_rw.arg_0, 1);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMin_8e38dc() {
   int res = 0;
   int x_9 = atomicMin(sb_rw.arg_0, 1);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.glsl
index 66cb351..90d76b8 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMin_c67a74() {
   uint res = 0u;
   uint x_9 = atomicMin(sb_rw.arg_0, 1u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMin_c67a74() {
   uint res = 0u;
   uint x_9 = atomicMin(sb_rw.arg_0, 1u);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.glsl
index b9557e3..2874145 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicOr_8d96a0() {
   int res = 0;
   int x_9 = atomicOr(sb_rw.arg_0, 1);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicOr_8d96a0() {
   int res = 0;
   int x_9 = atomicOr(sb_rw.arg_0, 1);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.glsl
index 5ad5f61..dafd141 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicOr_5e95d4() {
   uint res = 0u;
   uint x_9 = atomicOr(sb_rw.arg_0, 1u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicOr_5e95d4() {
   uint res = 0u;
   uint x_9 = atomicOr(sb_rw.arg_0, 1u);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.glsl
index 24fc51e..f8778d9 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicStore_d1e9a6() {
   atomicExchange(sb_rw.arg_0, 1);
   return;
@@ -32,17 +29,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicStore_d1e9a6() {
   atomicExchange(sb_rw.arg_0, 1);
   return;
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.glsl
index e9c81a2..588fac6 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicStore_cdc29e() {
   atomicExchange(sb_rw.arg_0, 1u);
   return;
@@ -32,17 +29,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicStore_cdc29e() {
   atomicExchange(sb_rw.arg_0, 1u);
   return;
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.glsl
index 8f573df..c3538ae 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicSub_051100() {
   int res = 0;
   int x_9 = atomicAdd(sb_rw.arg_0, 1);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicSub_051100() {
   int res = 0;
   int x_9 = atomicAdd(sb_rw.arg_0, 1);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.glsl
index e462c21..b2eccbc 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicSub_15bfc9() {
   uint res = 0u;
   uint x_9 = atomicAdd(sb_rw.arg_0, 1u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicSub_15bfc9() {
   uint res = 0u;
   uint x_9 = atomicAdd(sb_rw.arg_0, 1u);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.glsl
index cc05c28..1c83583 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicXor_c1b78c() {
   int res = 0;
   int x_9 = atomicXor(sb_rw.arg_0, 1);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicXor_c1b78c() {
   int res = 0;
   int x_9 = atomicXor(sb_rw.arg_0, 1);
diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.glsl
index 2893791..09295d7 100644
--- a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicXor_54510e() {
   uint res = 0u;
   uint x_9 = atomicXor(sb_rw.arg_0, 1u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicXor_54510e() {
   uint res = 0u;
   uint x_9 = atomicXor(sb_rw.arg_0, 1u);
diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.glsl
index 875dc08..ca2a7f9 100644
--- a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int res = 0;
   int x_9 = atomicAdd(sb_rw.arg_0, 1);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int res = 0;
   int x_9 = atomicAdd(sb_rw.arg_0, 1);
diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.glsl
index 48a0735..7ffe848 100644
--- a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint res = 0u;
   uint x_9 = atomicAdd(sb_rw.arg_0, 1u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint res = 0u;
   uint x_9 = atomicAdd(sb_rw.arg_0, 1u);
diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.glsl
index 875dc08..ca2a7f9 100644
--- a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int res = 0;
   int x_9 = atomicAdd(sb_rw.arg_0, 1);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int res = 0;
   int x_9 = atomicAdd(sb_rw.arg_0, 1);
diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.glsl
index 48a0735..7ffe848 100644
--- a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint res = 0u;
   uint x_9 = atomicAdd(sb_rw.arg_0, 1u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint res = 0u;
   uint x_9 = atomicAdd(sb_rw.arg_0, 1u);
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.glsl
index bd9f7f8..d0daed9 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int arg_1 = 0;
   int res = 0;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int arg_1 = 0;
   int res = 0;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.glsl
index 5c1a1b0..7e082b7 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint arg_1 = 0u;
   uint res = 0u;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.glsl
index ea9ff84..f27eaef 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAnd_152966() {
   int arg_1 = 0;
   int res = 0;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAnd_152966() {
   int arg_1 = 0;
   int res = 0;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.glsl
index e3abb2a..1d3eb24 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAnd_85a8d9() {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAnd_85a8d9() {
   uint arg_1 = 0u;
   uint res = 0u;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl
index 286017b..b19348c 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl
@@ -7,10 +7,6 @@
 };
 
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
@@ -20,9 +16,10 @@
   bool exchanged;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_1bd40a() {
   int arg_1 = 0;
   int arg_2 = 0;
@@ -62,10 +59,6 @@
 };
 
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
@@ -75,9 +68,10 @@
   bool exchanged;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_1bd40a() {
   int arg_1 = 0;
   int arg_2 = 0;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl
index ec3e6e1..43fa00c 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl
@@ -7,10 +7,6 @@
 };
 
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
@@ -20,9 +16,10 @@
   bool exchanged;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_63d8e6() {
   uint arg_1 = 0u;
   uint arg_2 = 0u;
@@ -62,10 +59,6 @@
 };
 
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
@@ -75,9 +68,10 @@
   bool exchanged;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_63d8e6() {
   uint arg_1 = 0u;
   uint arg_2 = 0u;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.glsl
index 284be71..e70784d 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicExchange_f2e22f() {
   int arg_1 = 0;
   int res = 0;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicExchange_f2e22f() {
   int arg_1 = 0;
   int res = 0;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.glsl
index edc360d..e949e68 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicExchange_d59712() {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicExchange_d59712() {
   uint arg_1 = 0u;
   uint res = 0u;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.glsl
index d034197..c5f15b1 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicLoad_0806ad() {
   int res = 0;
   int x_9 = atomicOr(sb_rw.arg_0, 0);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicLoad_0806ad() {
   int res = 0;
   int x_9 = atomicOr(sb_rw.arg_0, 0);
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.glsl
index cebe232..8bddcce 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicLoad_fe6cc3() {
   uint res = 0u;
   uint x_9 = atomicOr(sb_rw.arg_0, 0u);
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicLoad_fe6cc3() {
   uint res = 0u;
   uint x_9 = atomicOr(sb_rw.arg_0, 0u);
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.glsl
index d458f05..32e30cd 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMax_92aa72() {
   int arg_1 = 0;
   int res = 0;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMax_92aa72() {
   int arg_1 = 0;
   int res = 0;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.glsl
index e5f7f89..680684b 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMax_51b9be() {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMax_51b9be() {
   uint arg_1 = 0u;
   uint res = 0u;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.glsl
index e233a68..e982a9b 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMin_8e38dc() {
   int arg_1 = 0;
   int res = 0;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMin_8e38dc() {
   int arg_1 = 0;
   int res = 0;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.glsl
index 06e8d89..f3397bb 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMin_c67a74() {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMin_c67a74() {
   uint arg_1 = 0u;
   uint res = 0u;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.glsl
index dd17274..0e9f155 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicOr_8d96a0() {
   int arg_1 = 0;
   int res = 0;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicOr_8d96a0() {
   int arg_1 = 0;
   int res = 0;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.glsl
index ba78059..b918b88 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicOr_5e95d4() {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicOr_5e95d4() {
   uint arg_1 = 0u;
   uint res = 0u;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.glsl
index cf63c29..3e9839e 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicStore_d1e9a6() {
   int arg_1 = 0;
   arg_1 = 1;
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicStore_d1e9a6() {
   int arg_1 = 0;
   arg_1 = 1;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.glsl
index 7a8d693..7628fb4 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicStore_cdc29e() {
   uint arg_1 = 0u;
   arg_1 = 1u;
@@ -34,17 +31,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicStore_cdc29e() {
   uint arg_1 = 0u;
   arg_1 = 1u;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.glsl
index fcc4155..c6aa9c3 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicSub_051100() {
   int arg_1 = 0;
   int res = 0;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicSub_051100() {
   int arg_1 = 0;
   int res = 0;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.glsl
index f91b7f8..c5f6b9e 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicSub_15bfc9() {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicSub_15bfc9() {
   uint arg_1 = 0u;
   uint res = 0u;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.glsl
index 4953346..71a8526 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicXor_c1b78c() {
   int arg_1 = 0;
   int res = 0;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicXor_c1b78c() {
   int arg_1 = 0;
   int res = 0;
diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.glsl
index c382bff..c03bbbb 100644
--- a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicXor_54510e() {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicXor_54510e() {
   uint arg_1 = 0u;
   uint res = 0u;
diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.glsl
index 167e99c..9d593d4 100644
--- a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int arg_1 = 0;
   int res = 0;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int arg_1 = 0;
   int res = 0;
diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.glsl
index d9e0515..baaa2cc 100644
--- a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint arg_1 = 0u;
   uint res = 0u;
diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.glsl
index 167e99c..9d593d4 100644
--- a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int arg_1 = 0;
   int res = 0;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  int arg_0;
-};
-
 struct SB_RW {
   int arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int arg_1 = 0;
   int res = 0;
diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.glsl
index d9e0515..baaa2cc 100644
--- a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.glsl
+++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.glsl
@@ -1,17 +1,14 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint arg_1 = 0u;
   uint res = 0u;
@@ -36,17 +33,14 @@
 }
 #version 310 es
 
-struct SB_RW_atomic {
-  uint arg_0;
-};
-
 struct SB_RW {
   uint arg_0;
 };
 
-layout(binding = 0, std430) buffer SB_RW_atomic_1 {
+layout(binding = 0, std430) buffer SB_RW_atomic_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint arg_1 = 0u;
   uint res = 0u;
diff --git a/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.glsl
index a143e18..4f59c4b 100644
--- a/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/1588cd.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   int arg_0[];
 } sb_ro;
+
 void arrayLength_1588cd() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   int arg_0[];
 } sb_ro;
+
 void arrayLength_1588cd() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   int arg_0[];
 } sb_ro;
+
 void arrayLength_1588cd() {
   uint res = uint(sb_ro.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.glsl
index 46667de..d22edc1 100644
--- a/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/61b1c7.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0[];
 } sb_rw;
+
 void arrayLength_61b1c7() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0[];
 } sb_rw;
+
 void arrayLength_61b1c7() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0[];
 } sb_rw;
+
 void arrayLength_61b1c7() {
   uint res = uint(sb_rw.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/literal/arrayLength/8421b9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/8421b9.wgsl.expected.glsl
index 233c92b..51547d9 100644
--- a/test/tint/builtins/gen/literal/arrayLength/8421b9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/8421b9.wgsl.expected.glsl
@@ -1,17 +1,17 @@
 SKIP: FAILED
 
-gen/literal/arrayLength/8421b9.wgsl:26:10 error: using f16 types in 'storage' storage class is not implemented yet
+builtins/gen/literal/arrayLength/8421b9.wgsl:26:10 error: using f16 types in 'storage' storage class is not implemented yet
   arg_0: array<f16>,
          ^^^^^^^^^^
 
-gen/literal/arrayLength/8421b9.wgsl:25:1 note: see layout of struct:
+builtins/gen/literal/arrayLength/8421b9.wgsl:25:1 note: see layout of struct:
 /*           align(2) size(2) */ struct SB_RO {
 /* offset(0) align(2) size(2) */   arg_0 : array<f16>;
 /*                            */ };
 struct SB_RO {
 ^^^^^^
 
-gen/literal/arrayLength/8421b9.wgsl:28:42 note: see declaration of variable
+builtins/gen/literal/arrayLength/8421b9.wgsl:28:42 note: see declaration of variable
 @group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
                                          ^^^^^
 
diff --git a/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.glsl
index 44aaf23..d7e4539 100644
--- a/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/a0f5ca.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   float arg_0[];
 } sb_ro;
+
 void arrayLength_a0f5ca() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   float arg_0[];
 } sb_ro;
+
 void arrayLength_a0f5ca() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   float arg_0[];
 } sb_ro;
+
 void arrayLength_a0f5ca() {
   uint res = uint(sb_ro.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/literal/arrayLength/cbd6b5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/cbd6b5.wgsl.expected.glsl
index e0a5253..ba9a68b 100644
--- a/test/tint/builtins/gen/literal/arrayLength/cbd6b5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/cbd6b5.wgsl.expected.glsl
@@ -1,17 +1,17 @@
 SKIP: FAILED
 
-gen/literal/arrayLength/cbd6b5.wgsl:26:10 error: using f16 types in 'storage' storage class is not implemented yet
+builtins/gen/literal/arrayLength/cbd6b5.wgsl:26:10 error: using f16 types in 'storage' storage class is not implemented yet
   arg_0: array<f16>,
          ^^^^^^^^^^
 
-gen/literal/arrayLength/cbd6b5.wgsl:25:1 note: see layout of struct:
+builtins/gen/literal/arrayLength/cbd6b5.wgsl:25:1 note: see layout of struct:
 /*           align(2) size(2) */ struct SB_RW {
 /* offset(0) align(2) size(2) */   arg_0 : array<f16>;
 /*                            */ };
 struct SB_RW {
 ^^^^^^
 
-gen/literal/arrayLength/cbd6b5.wgsl:28:48 note: see declaration of variable
+builtins/gen/literal/arrayLength/cbd6b5.wgsl:28:48 note: see declaration of variable
 @group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
                                                ^^^^^
 
diff --git a/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.glsl
index dac4336..5d417ac 100644
--- a/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/cdd123.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   float arg_0[];
 } sb_rw;
+
 void arrayLength_cdd123() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   float arg_0[];
 } sb_rw;
+
 void arrayLength_cdd123() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   float arg_0[];
 } sb_rw;
+
 void arrayLength_cdd123() {
   uint res = uint(sb_rw.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.glsl
index e159bef..a605e06 100644
--- a/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/cfca0a.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   uint arg_0[];
 } sb_ro;
+
 void arrayLength_cfca0a() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   uint arg_0[];
 } sb_ro;
+
 void arrayLength_cfca0a() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   uint arg_0[];
 } sb_ro;
+
 void arrayLength_cfca0a() {
   uint res = uint(sb_ro.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.glsl
index a11f1aa..51f60de 100644
--- a/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/arrayLength/eb510f.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0[];
 } sb_rw;
+
 void arrayLength_eb510f() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0[];
 } sb_rw;
+
 void arrayLength_eb510f() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0[];
 } sb_rw;
+
 void arrayLength_eb510f() {
   uint res = uint(sb_rw.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.glsl
index c2e7cdb..17d0040 100644
--- a/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicAdd/8a199a.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint res = atomicAdd(sb_rw.arg_0, 1u);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint res = atomicAdd(sb_rw.arg_0, 1u);
 }
diff --git a/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.glsl
index a9a2c73..494e26c 100644
--- a/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicAdd/d32fe4.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int res = atomicAdd(sb_rw.arg_0, 1);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int res = atomicAdd(sb_rw.arg_0, 1);
 }
diff --git a/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.glsl
index 0815478..d1d9eee 100644
--- a/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicAnd/152966.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAnd_152966() {
   int res = atomicAnd(sb_rw.arg_0, 1);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAnd_152966() {
   int res = atomicAnd(sb_rw.arg_0, 1);
 }
diff --git a/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.glsl
index 3363b8b..4a93dfb 100644
--- a/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicAnd/85a8d9.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAnd_85a8d9() {
   uint res = atomicAnd(sb_rw.arg_0, 1u);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAnd_85a8d9() {
   uint res = atomicAnd(sb_rw.arg_0, 1u);
 }
diff --git a/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl
index 001110f..6823d69 100644
--- a/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl
@@ -7,13 +7,10 @@
 };
 
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_1bd40a() {
   atomic_compare_exchange_resulti32 atomic_compare_result;
   atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, 1, 1);
@@ -37,13 +34,10 @@
 };
 
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_1bd40a() {
   atomic_compare_exchange_resulti32 atomic_compare_result;
   atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, 1, 1);
diff --git a/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl
index e5738b7..e27f02e 100644
--- a/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl
@@ -7,13 +7,10 @@
 };
 
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_63d8e6() {
   atomic_compare_exchange_resultu32 atomic_compare_result;
   atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, 1u, 1u);
@@ -37,13 +34,10 @@
 };
 
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_63d8e6() {
   atomic_compare_exchange_resultu32 atomic_compare_result;
   atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, 1u, 1u);
diff --git a/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.glsl
index 03b9891..12b23de 100644
--- a/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicExchange/d59712.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicExchange_d59712() {
   uint res = atomicExchange(sb_rw.arg_0, 1u);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicExchange_d59712() {
   uint res = atomicExchange(sb_rw.arg_0, 1u);
 }
diff --git a/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.glsl
index d1f33c7..c9131e2 100644
--- a/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicExchange/f2e22f.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicExchange_f2e22f() {
   int res = atomicExchange(sb_rw.arg_0, 1);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicExchange_f2e22f() {
   int res = atomicExchange(sb_rw.arg_0, 1);
 }
diff --git a/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.glsl
index 38a8c92..64291f3 100644
--- a/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicLoad/0806ad.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicLoad_0806ad() {
   int res = atomicOr(sb_rw.arg_0, 0);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicLoad_0806ad() {
   int res = atomicOr(sb_rw.arg_0, 0);
 }
diff --git a/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.glsl
index b4bd0d8..f17c518 100644
--- a/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicLoad/fe6cc3.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicLoad_fe6cc3() {
   uint res = atomicOr(sb_rw.arg_0, 0u);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicLoad_fe6cc3() {
   uint res = atomicOr(sb_rw.arg_0, 0u);
 }
diff --git a/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.glsl
index 98f34a9..3f16d51 100644
--- a/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicMax/51b9be.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMax_51b9be() {
   uint res = atomicMax(sb_rw.arg_0, 1u);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMax_51b9be() {
   uint res = atomicMax(sb_rw.arg_0, 1u);
 }
diff --git a/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.glsl
index 9f6d085..1b3e247 100644
--- a/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicMax/92aa72.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMax_92aa72() {
   int res = atomicMax(sb_rw.arg_0, 1);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMax_92aa72() {
   int res = atomicMax(sb_rw.arg_0, 1);
 }
diff --git a/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.glsl
index e2d3c72..ea043dd 100644
--- a/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicMin/8e38dc.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMin_8e38dc() {
   int res = atomicMin(sb_rw.arg_0, 1);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMin_8e38dc() {
   int res = atomicMin(sb_rw.arg_0, 1);
 }
diff --git a/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.glsl
index 6e3098e..588b83f 100644
--- a/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicMin/c67a74.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMin_c67a74() {
   uint res = atomicMin(sb_rw.arg_0, 1u);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMin_c67a74() {
   uint res = atomicMin(sb_rw.arg_0, 1u);
 }
diff --git a/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.glsl
index 4ee4dea..7bc55f0 100644
--- a/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicOr/5e95d4.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicOr_5e95d4() {
   uint res = atomicOr(sb_rw.arg_0, 1u);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicOr_5e95d4() {
   uint res = atomicOr(sb_rw.arg_0, 1u);
 }
diff --git a/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.glsl
index d5d42c4..baad60d 100644
--- a/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicOr/8d96a0.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicOr_8d96a0() {
   int res = atomicOr(sb_rw.arg_0, 1);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicOr_8d96a0() {
   int res = atomicOr(sb_rw.arg_0, 1);
 }
diff --git a/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.glsl
index 7d8d0f5..f1b5526 100644
--- a/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicStore/cdc29e.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicStore_cdc29e() {
   atomicExchange(sb_rw.arg_0, 1u);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicStore_cdc29e() {
   atomicExchange(sb_rw.arg_0, 1u);
 }
diff --git a/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.glsl
index 1281880..95dc6ea 100644
--- a/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicStore/d1e9a6.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicStore_d1e9a6() {
   atomicExchange(sb_rw.arg_0, 1);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicStore_d1e9a6() {
   atomicExchange(sb_rw.arg_0, 1);
 }
diff --git a/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.glsl
index 07573d2..1969c48 100644
--- a/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicSub/051100.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicSub_051100() {
   int res = atomicAdd(sb_rw.arg_0, 1);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicSub_051100() {
   int res = atomicAdd(sb_rw.arg_0, 1);
 }
diff --git a/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.glsl
index 24aa578..9881ff1 100644
--- a/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicSub/15bfc9.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicSub_15bfc9() {
   uint res = atomicAdd(sb_rw.arg_0, 1u);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicSub_15bfc9() {
   uint res = atomicAdd(sb_rw.arg_0, 1u);
 }
diff --git a/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.glsl
index e04552e..a69ee2d 100644
--- a/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicXor/54510e.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicXor_54510e() {
   uint res = atomicXor(sb_rw.arg_0, 1u);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicXor_54510e() {
   uint res = atomicXor(sb_rw.arg_0, 1u);
 }
diff --git a/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.glsl
index 0ebd9e7..4f11212 100644
--- a/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/atomicXor/c1b78c.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicXor_c1b78c() {
   int res = atomicXor(sb_rw.arg_0, 1);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicXor_c1b78c() {
   int res = atomicXor(sb_rw.arg_0, 1);
 }
diff --git a/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.glsl
index 47564ae..f610169 100644
--- a/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/textureDimensions/ba1481.wgsl.expected.glsl
@@ -11,16 +11,7 @@
   uint padding;
 };
 
-struct ExternalTextureParams {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
-};
-
-layout(binding = 2) uniform ExternalTextureParams_1 {
+layout(binding = 2) uniform ExternalTextureParams_ubo {
   uint numPlanes;
   uint doYuvToRgbConversionOnly;
   mat3x4 yuvToRgbConversionMatrix;
@@ -61,16 +52,7 @@
   uint padding;
 };
 
-struct ExternalTextureParams {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
-};
-
-layout(binding = 2) uniform ExternalTextureParams_1 {
+layout(binding = 2) uniform ExternalTextureParams_ubo {
   uint numPlanes;
   uint doYuvToRgbConversionOnly;
   mat3x4 yuvToRgbConversionMatrix;
@@ -105,16 +87,7 @@
   uint padding;
 };
 
-struct ExternalTextureParams {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
-};
-
-layout(binding = 2) uniform ExternalTextureParams_1 {
+layout(binding = 2) uniform ExternalTextureParams_ubo {
   uint numPlanes;
   uint doYuvToRgbConversionOnly;
   mat3x4 yuvToRgbConversionMatrix;
diff --git a/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.glsl
index 4305443..2d9af35 100644
--- a/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 struct GammaTransferParams {
@@ -22,13 +20,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 2) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -56,7 +49,7 @@
 uniform highp sampler2D arg_0_1;
 uniform highp sampler2D ext_tex_plane_1_1;
 void textureLoad_8acf41() {
-  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0), ext_tex_params);
+  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0), ext_tex_params.inner);
 }
 
 vec4 vertex_main() {
@@ -72,14 +65,6 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:57: 'textureLoadExternal' : no matching overloaded function found 
-ERROR: 0:57: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:57: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
@@ -103,13 +88,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 2) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -137,7 +117,7 @@
 uniform highp sampler2D arg_0_1;
 uniform highp sampler2D ext_tex_plane_1_1;
 void textureLoad_8acf41() {
-  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0), ext_tex_params);
+  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0), ext_tex_params.inner);
 }
 
 void fragment_main() {
@@ -148,14 +128,6 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:58: 'textureLoadExternal' : no matching overloaded function found 
-ERROR: 0:58: '=' :  cannot convert from ' const float' to ' temp mediump 4-component vector of float'
-ERROR: 0:58: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 struct GammaTransferParams {
@@ -178,13 +150,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 2) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -212,7 +179,7 @@
 uniform highp sampler2D arg_0_1;
 uniform highp sampler2D ext_tex_plane_1_1;
 void textureLoad_8acf41() {
-  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0), ext_tex_params);
+  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, ivec2(0), ext_tex_params.inner);
 }
 
 void compute_main() {
@@ -224,11 +191,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:57: 'textureLoadExternal' : no matching overloaded function found 
-ERROR: 0:57: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:57: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.spvasm
index 01d8762..6eba59e 100644
--- a/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 134
+; Bound: 138
 ; Schema: 0
                OpCapability Shader
-         %27 = OpExtInstImport "GLSL.std.450"
+         %28 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
@@ -14,6 +14,8 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %ext_tex_plane_1 "ext_tex_plane_1"
+               OpName %ext_tex_params_block "ext_tex_params_block"
+               OpMemberName %ext_tex_params_block 0 "inner"
                OpName %ExternalTextureParams "ExternalTextureParams"
                OpMemberName %ExternalTextureParams 0 "numPlanes"
                OpMemberName %ExternalTextureParams 1 "doYuvToRgbConversionOnly"
@@ -51,7 +53,8 @@
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %ext_tex_plane_1 DescriptorSet 1
                OpDecorate %ext_tex_plane_1 Binding 1
-               OpDecorate %ExternalTextureParams Block
+               OpDecorate %ext_tex_params_block Block
+               OpMemberDecorate %ext_tex_params_block 0 Offset 0
                OpMemberDecorate %ExternalTextureParams 0 Offset 0
                OpMemberDecorate %ExternalTextureParams 1 Offset 4
                OpMemberDecorate %ExternalTextureParams 2 Offset 16
@@ -92,147 +95,151 @@
     %v3float = OpTypeVector %float 3
 %mat3v3float = OpTypeMatrix %v3float 3
 %ExternalTextureParams = OpTypeStruct %uint %uint %mat3v4float %GammaTransferParams %GammaTransferParams %mat3v3float
-%_ptr_Uniform_ExternalTextureParams = OpTypePointer Uniform %ExternalTextureParams
-%ext_tex_params = OpVariable %_ptr_Uniform_ExternalTextureParams Uniform
+%ext_tex_params_block = OpTypeStruct %ExternalTextureParams
+%_ptr_Uniform_ext_tex_params_block = OpTypePointer Uniform %ext_tex_params_block
+%ext_tex_params = OpVariable %_ptr_Uniform_ext_tex_params_block Uniform
       %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
-         %21 = OpTypeFunction %v3float %v3float %GammaTransferParams
+         %22 = OpTypeFunction %v3float %v3float %GammaTransferParams
        %bool = OpTypeBool
      %v3bool = OpTypeVector %bool 3
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-         %41 = OpConstantNull %v3float
+         %42 = OpConstantNull %v3float
         %int = OpTypeInt 32 1
       %v2int = OpTypeVector %int 2
-         %61 = OpTypeFunction %v4float %11 %11 %v2int %ExternalTextureParams
+         %62 = OpTypeFunction %v4float %11 %11 %v2int %ExternalTextureParams
      %uint_1 = OpConstant %uint 1
-         %78 = OpConstantNull %int
+         %79 = OpConstantNull %int
     %v2float = OpTypeVector %float 2
     %float_1 = OpConstant %float 1
-         %92 = OpConstantNull %uint
+         %93 = OpConstantNull %uint
        %void = OpTypeVoid
-        %110 = OpTypeFunction %void
-        %117 = OpConstantNull %v2int
+        %111 = OpTypeFunction %void
+        %118 = OpConstantNull %v2int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_ExternalTextureParams = OpTypePointer Uniform %ExternalTextureParams
 %_ptr_Function_v4float = OpTypePointer Function %v4float
-        %121 = OpTypeFunction %v4float
-%gammaCorrection = OpFunction %v3float None %21
+        %125 = OpTypeFunction %v4float
+%gammaCorrection = OpFunction %v3float None %22
           %v = OpFunctionParameter %v3float
      %params = OpFunctionParameter %GammaTransferParams
-         %25 = OpLabel
-         %39 = OpVariable %_ptr_Function_v3float Function %41
-         %51 = OpVariable %_ptr_Function_v3float Function %41
-         %57 = OpVariable %_ptr_Function_v3float Function %41
-         %26 = OpExtInst %v3float %27 FAbs %v
-         %28 = OpCompositeExtract %float %params 4
-         %29 = OpCompositeConstruct %v3float %28 %28 %28
-         %30 = OpFOrdLessThan %v3bool %26 %29
-         %33 = OpExtInst %v3float %27 FSign %v
-         %34 = OpCompositeExtract %float %params 3
-         %35 = OpExtInst %v3float %27 FAbs %v
-         %36 = OpVectorTimesScalar %v3float %35 %34
-         %37 = OpCompositeExtract %float %params 6
-         %42 = OpCompositeConstruct %v3float %37 %37 %37
-         %38 = OpFAdd %v3float %36 %42
-         %43 = OpFMul %v3float %33 %38
-         %44 = OpExtInst %v3float %27 FSign %v
-         %46 = OpCompositeExtract %float %params 1
-         %47 = OpExtInst %v3float %27 FAbs %v
-         %48 = OpVectorTimesScalar %v3float %47 %46
-         %49 = OpCompositeExtract %float %params 2
-         %52 = OpCompositeConstruct %v3float %49 %49 %49
-         %50 = OpFAdd %v3float %48 %52
-         %53 = OpCompositeExtract %float %params 0
-         %54 = OpCompositeConstruct %v3float %53 %53 %53
-         %45 = OpExtInst %v3float %27 Pow %50 %54
-         %55 = OpCompositeExtract %float %params 5
-         %58 = OpCompositeConstruct %v3float %55 %55 %55
-         %56 = OpFAdd %v3float %45 %58
-         %59 = OpFMul %v3float %44 %56
-         %60 = OpSelect %v3float %30 %43 %59
-               OpReturnValue %60
+         %26 = OpLabel
+         %40 = OpVariable %_ptr_Function_v3float Function %42
+         %52 = OpVariable %_ptr_Function_v3float Function %42
+         %58 = OpVariable %_ptr_Function_v3float Function %42
+         %27 = OpExtInst %v3float %28 FAbs %v
+         %29 = OpCompositeExtract %float %params 4
+         %30 = OpCompositeConstruct %v3float %29 %29 %29
+         %31 = OpFOrdLessThan %v3bool %27 %30
+         %34 = OpExtInst %v3float %28 FSign %v
+         %35 = OpCompositeExtract %float %params 3
+         %36 = OpExtInst %v3float %28 FAbs %v
+         %37 = OpVectorTimesScalar %v3float %36 %35
+         %38 = OpCompositeExtract %float %params 6
+         %43 = OpCompositeConstruct %v3float %38 %38 %38
+         %39 = OpFAdd %v3float %37 %43
+         %44 = OpFMul %v3float %34 %39
+         %45 = OpExtInst %v3float %28 FSign %v
+         %47 = OpCompositeExtract %float %params 1
+         %48 = OpExtInst %v3float %28 FAbs %v
+         %49 = OpVectorTimesScalar %v3float %48 %47
+         %50 = OpCompositeExtract %float %params 2
+         %53 = OpCompositeConstruct %v3float %50 %50 %50
+         %51 = OpFAdd %v3float %49 %53
+         %54 = OpCompositeExtract %float %params 0
+         %55 = OpCompositeConstruct %v3float %54 %54 %54
+         %46 = OpExtInst %v3float %28 Pow %51 %55
+         %56 = OpCompositeExtract %float %params 5
+         %59 = OpCompositeConstruct %v3float %56 %56 %56
+         %57 = OpFAdd %v3float %46 %59
+         %60 = OpFMul %v3float %45 %57
+         %61 = OpSelect %v3float %31 %44 %60
+               OpReturnValue %61
                OpFunctionEnd
-%textureLoadExternal = OpFunction %v4float None %61
+%textureLoadExternal = OpFunction %v4float None %62
      %plane0 = OpFunctionParameter %11
      %plane1 = OpFunctionParameter %11
       %coord = OpFunctionParameter %v2int
    %params_0 = OpFunctionParameter %ExternalTextureParams
-         %69 = OpLabel
-      %color = OpVariable %_ptr_Function_v3float Function %41
-         %71 = OpCompositeExtract %uint %params_0 0
-         %73 = OpIEqual %bool %71 %uint_1
-               OpSelectionMerge %74 None
-               OpBranchConditional %73 %75 %76
-         %75 = OpLabel
-         %77 = OpImageFetch %v4float %plane0 %coord Lod %78
-         %79 = OpVectorShuffle %v3float %77 %77 0 1 2
-               OpStore %color %79
-               OpBranch %74
+         %70 = OpLabel
+      %color = OpVariable %_ptr_Function_v3float Function %42
+         %72 = OpCompositeExtract %uint %params_0 0
+         %74 = OpIEqual %bool %72 %uint_1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
          %76 = OpLabel
-         %80 = OpImageFetch %v4float %plane0 %coord Lod %78
-         %81 = OpCompositeExtract %float %80 0
-         %82 = OpImageFetch %v4float %plane1 %coord Lod %78
-         %84 = OpVectorShuffle %v2float %82 %82 0 1
-         %85 = OpCompositeExtract %float %84 0
-         %86 = OpCompositeExtract %float %84 1
-         %88 = OpCompositeConstruct %v4float %81 %85 %86 %float_1
-         %89 = OpCompositeExtract %mat3v4float %params_0 2
-         %90 = OpVectorTimesMatrix %v3float %88 %89
-               OpStore %color %90
-               OpBranch %74
-         %74 = OpLabel
-         %91 = OpCompositeExtract %uint %params_0 1
-         %93 = OpIEqual %bool %91 %92
-               OpSelectionMerge %94 None
-               OpBranchConditional %93 %95 %94
-         %95 = OpLabel
-         %97 = OpLoad %v3float %color
-         %98 = OpCompositeExtract %GammaTransferParams %params_0 3
-         %96 = OpFunctionCall %v3float %gammaCorrection %97 %98
-               OpStore %color %96
-         %99 = OpCompositeExtract %mat3v3float %params_0 5
-        %100 = OpLoad %v3float %color
-        %101 = OpMatrixTimesVector %v3float %99 %100
-               OpStore %color %101
-        %103 = OpLoad %v3float %color
-        %104 = OpCompositeExtract %GammaTransferParams %params_0 4
-        %102 = OpFunctionCall %v3float %gammaCorrection %103 %104
+         %78 = OpImageFetch %v4float %plane0 %coord Lod %79
+         %80 = OpVectorShuffle %v3float %78 %78 0 1 2
+               OpStore %color %80
+               OpBranch %75
+         %77 = OpLabel
+         %81 = OpImageFetch %v4float %plane0 %coord Lod %79
+         %82 = OpCompositeExtract %float %81 0
+         %83 = OpImageFetch %v4float %plane1 %coord Lod %79
+         %85 = OpVectorShuffle %v2float %83 %83 0 1
+         %86 = OpCompositeExtract %float %85 0
+         %87 = OpCompositeExtract %float %85 1
+         %89 = OpCompositeConstruct %v4float %82 %86 %87 %float_1
+         %90 = OpCompositeExtract %mat3v4float %params_0 2
+         %91 = OpVectorTimesMatrix %v3float %89 %90
+               OpStore %color %91
+               OpBranch %75
+         %75 = OpLabel
+         %92 = OpCompositeExtract %uint %params_0 1
+         %94 = OpIEqual %bool %92 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+         %98 = OpLoad %v3float %color
+         %99 = OpCompositeExtract %GammaTransferParams %params_0 3
+         %97 = OpFunctionCall %v3float %gammaCorrection %98 %99
+               OpStore %color %97
+        %100 = OpCompositeExtract %mat3v3float %params_0 5
+        %101 = OpLoad %v3float %color
+        %102 = OpMatrixTimesVector %v3float %100 %101
                OpStore %color %102
-               OpBranch %94
-         %94 = OpLabel
-        %105 = OpLoad %v3float %color
-        %106 = OpCompositeExtract %float %105 0
-        %107 = OpCompositeExtract %float %105 1
-        %108 = OpCompositeExtract %float %105 2
-        %109 = OpCompositeConstruct %v4float %106 %107 %108 %float_1
-               OpReturnValue %109
+        %104 = OpLoad %v3float %color
+        %105 = OpCompositeExtract %GammaTransferParams %params_0 4
+        %103 = OpFunctionCall %v3float %gammaCorrection %104 %105
+               OpStore %color %103
+               OpBranch %95
+         %95 = OpLabel
+        %106 = OpLoad %v3float %color
+        %107 = OpCompositeExtract %float %106 0
+        %108 = OpCompositeExtract %float %106 1
+        %109 = OpCompositeExtract %float %106 2
+        %110 = OpCompositeConstruct %v4float %107 %108 %109 %float_1
+               OpReturnValue %110
                OpFunctionEnd
-%textureLoad_8acf41 = OpFunction %void None %110
-        %113 = OpLabel
+%textureLoad_8acf41 = OpFunction %void None %111
+        %114 = OpLabel
         %res = OpVariable %_ptr_Function_v4float Function %5
-        %115 = OpLoad %11 %arg_0
-        %116 = OpLoad %11 %ext_tex_plane_1
-        %118 = OpLoad %ExternalTextureParams %ext_tex_params
-        %114 = OpFunctionCall %v4float %textureLoadExternal %115 %116 %117 %118
-               OpStore %res %114
+        %116 = OpLoad %11 %arg_0
+        %117 = OpLoad %11 %ext_tex_plane_1
+        %121 = OpAccessChain %_ptr_Uniform_ExternalTextureParams %ext_tex_params %uint_0
+        %122 = OpLoad %ExternalTextureParams %121
+        %115 = OpFunctionCall %v4float %textureLoadExternal %116 %117 %118 %122
+               OpStore %res %115
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %121
-        %123 = OpLabel
-        %124 = OpFunctionCall %void %textureLoad_8acf41
+%vertex_main_inner = OpFunction %v4float None %125
+        %127 = OpLabel
+        %128 = OpFunctionCall %void %textureLoad_8acf41
                OpReturnValue %5
                OpFunctionEnd
-%vertex_main = OpFunction %void None %110
-        %126 = OpLabel
-        %127 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %127
+%vertex_main = OpFunction %void None %111
+        %130 = OpLabel
+        %131 = OpFunctionCall %v4float %vertex_main_inner
+               OpStore %value %131
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %110
-        %129 = OpLabel
-        %130 = OpFunctionCall %void %textureLoad_8acf41
+%fragment_main = OpFunction %void None %111
+        %133 = OpLabel
+        %134 = OpFunctionCall %void %textureLoad_8acf41
                OpReturn
                OpFunctionEnd
-%compute_main = OpFunction %void None %110
-        %132 = OpLabel
-        %133 = OpFunctionCall %void %textureLoad_8acf41
+%compute_main = OpFunction %void None %111
+        %136 = OpLabel
+        %137 = OpFunctionCall %void %textureLoad_8acf41
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.glsl
index 68b71f1..63c387f 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 struct GammaTransferParams {
@@ -22,13 +20,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 3) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 3) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -57,7 +50,7 @@
 uniform highp sampler2D arg_0_arg_1;
 uniform highp sampler2D ext_tex_plane_1_arg_1;
 void textureSampleLevel_979816() {
-  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f), ext_tex_params);
+  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f), ext_tex_params.inner);
 }
 
 vec4 vertex_main() {
@@ -73,14 +66,6 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:58: 'textureSampleExternal' : no matching overloaded function found 
-ERROR: 0:58: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:58: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
@@ -104,13 +89,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 3) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 3) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -139,7 +119,7 @@
 uniform highp sampler2D arg_0_arg_1;
 uniform highp sampler2D ext_tex_plane_1_arg_1;
 void textureSampleLevel_979816() {
-  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f), ext_tex_params);
+  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f), ext_tex_params.inner);
 }
 
 void fragment_main() {
@@ -150,14 +130,6 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:59: 'textureSampleExternal' : no matching overloaded function found 
-ERROR: 0:59: '=' :  cannot convert from ' const float' to ' temp mediump 4-component vector of float'
-ERROR: 0:59: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 struct GammaTransferParams {
@@ -180,13 +152,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 3) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 3) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -215,7 +182,7 @@
 uniform highp sampler2D arg_0_arg_1;
 uniform highp sampler2D ext_tex_plane_1_arg_1;
 void textureSampleLevel_979816() {
-  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f), ext_tex_params);
+  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, vec2(0.0f), ext_tex_params.inner);
 }
 
 void compute_main() {
@@ -227,11 +194,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:58: 'textureSampleExternal' : no matching overloaded function found 
-ERROR: 0:58: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:58: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.spvasm
index 444e4c2..acb3f03 100644
--- a/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/textureSampleLevel/979816.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 140
+; Bound: 144
 ; Schema: 0
                OpCapability Shader
-         %30 = OpExtInstImport "GLSL.std.450"
+         %31 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
@@ -14,6 +14,8 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %ext_tex_plane_1 "ext_tex_plane_1"
+               OpName %ext_tex_params_block "ext_tex_params_block"
+               OpMemberName %ext_tex_params_block 0 "inner"
                OpName %ExternalTextureParams "ExternalTextureParams"
                OpMemberName %ExternalTextureParams 0 "numPlanes"
                OpMemberName %ExternalTextureParams 1 "doYuvToRgbConversionOnly"
@@ -53,7 +55,8 @@
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %ext_tex_plane_1 DescriptorSet 1
                OpDecorate %ext_tex_plane_1 Binding 2
-               OpDecorate %ExternalTextureParams Block
+               OpDecorate %ext_tex_params_block Block
+               OpMemberDecorate %ext_tex_params_block 0 Offset 0
                OpMemberDecorate %ExternalTextureParams 0 Offset 0
                OpMemberDecorate %ExternalTextureParams 1 Offset 4
                OpMemberDecorate %ExternalTextureParams 2 Offset 16
@@ -96,153 +99,157 @@
     %v3float = OpTypeVector %float 3
 %mat3v3float = OpTypeMatrix %v3float 3
 %ExternalTextureParams = OpTypeStruct %uint %uint %mat3v4float %GammaTransferParams %GammaTransferParams %mat3v3float
-%_ptr_Uniform_ExternalTextureParams = OpTypePointer Uniform %ExternalTextureParams
-%ext_tex_params = OpVariable %_ptr_Uniform_ExternalTextureParams Uniform
+%ext_tex_params_block = OpTypeStruct %ExternalTextureParams
+%_ptr_Uniform_ext_tex_params_block = OpTypePointer Uniform %ext_tex_params_block
+%ext_tex_params = OpVariable %_ptr_Uniform_ext_tex_params_block Uniform
       %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
-         %23 = OpTypeSampler
-%_ptr_UniformConstant_23 = OpTypePointer UniformConstant %23
-      %arg_1 = OpVariable %_ptr_UniformConstant_23 UniformConstant
-         %24 = OpTypeFunction %v3float %v3float %GammaTransferParams
+         %24 = OpTypeSampler
+%_ptr_UniformConstant_24 = OpTypePointer UniformConstant %24
+      %arg_1 = OpVariable %_ptr_UniformConstant_24 UniformConstant
+         %25 = OpTypeFunction %v3float %v3float %GammaTransferParams
        %bool = OpTypeBool
      %v3bool = OpTypeVector %bool 3
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-         %44 = OpConstantNull %v3float
+         %45 = OpConstantNull %v3float
     %v2float = OpTypeVector %float 2
-         %64 = OpTypeFunction %v4float %11 %11 %23 %v2float %ExternalTextureParams
+         %65 = OpTypeFunction %v4float %11 %11 %24 %v2float %ExternalTextureParams
      %uint_1 = OpConstant %uint 1
-         %81 = OpTypeSampledImage %11
+         %82 = OpTypeSampledImage %11
     %float_1 = OpConstant %float 1
-         %97 = OpConstantNull %uint
+         %98 = OpConstantNull %uint
        %void = OpTypeVoid
-        %115 = OpTypeFunction %void
-        %123 = OpConstantNull %v2float
+        %116 = OpTypeFunction %void
+        %124 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_ExternalTextureParams = OpTypePointer Uniform %ExternalTextureParams
 %_ptr_Function_v4float = OpTypePointer Function %v4float
-        %127 = OpTypeFunction %v4float
-%gammaCorrection = OpFunction %v3float None %24
+        %131 = OpTypeFunction %v4float
+%gammaCorrection = OpFunction %v3float None %25
           %v = OpFunctionParameter %v3float
      %params = OpFunctionParameter %GammaTransferParams
-         %28 = OpLabel
-         %42 = OpVariable %_ptr_Function_v3float Function %44
-         %54 = OpVariable %_ptr_Function_v3float Function %44
-         %60 = OpVariable %_ptr_Function_v3float Function %44
-         %29 = OpExtInst %v3float %30 FAbs %v
-         %31 = OpCompositeExtract %float %params 4
-         %32 = OpCompositeConstruct %v3float %31 %31 %31
-         %33 = OpFOrdLessThan %v3bool %29 %32
-         %36 = OpExtInst %v3float %30 FSign %v
-         %37 = OpCompositeExtract %float %params 3
-         %38 = OpExtInst %v3float %30 FAbs %v
-         %39 = OpVectorTimesScalar %v3float %38 %37
-         %40 = OpCompositeExtract %float %params 6
-         %45 = OpCompositeConstruct %v3float %40 %40 %40
-         %41 = OpFAdd %v3float %39 %45
-         %46 = OpFMul %v3float %36 %41
-         %47 = OpExtInst %v3float %30 FSign %v
-         %49 = OpCompositeExtract %float %params 1
-         %50 = OpExtInst %v3float %30 FAbs %v
-         %51 = OpVectorTimesScalar %v3float %50 %49
-         %52 = OpCompositeExtract %float %params 2
-         %55 = OpCompositeConstruct %v3float %52 %52 %52
-         %53 = OpFAdd %v3float %51 %55
-         %56 = OpCompositeExtract %float %params 0
-         %57 = OpCompositeConstruct %v3float %56 %56 %56
-         %48 = OpExtInst %v3float %30 Pow %53 %57
-         %58 = OpCompositeExtract %float %params 5
-         %61 = OpCompositeConstruct %v3float %58 %58 %58
-         %59 = OpFAdd %v3float %48 %61
-         %62 = OpFMul %v3float %47 %59
-         %63 = OpSelect %v3float %33 %46 %62
-               OpReturnValue %63
+         %29 = OpLabel
+         %43 = OpVariable %_ptr_Function_v3float Function %45
+         %55 = OpVariable %_ptr_Function_v3float Function %45
+         %61 = OpVariable %_ptr_Function_v3float Function %45
+         %30 = OpExtInst %v3float %31 FAbs %v
+         %32 = OpCompositeExtract %float %params 4
+         %33 = OpCompositeConstruct %v3float %32 %32 %32
+         %34 = OpFOrdLessThan %v3bool %30 %33
+         %37 = OpExtInst %v3float %31 FSign %v
+         %38 = OpCompositeExtract %float %params 3
+         %39 = OpExtInst %v3float %31 FAbs %v
+         %40 = OpVectorTimesScalar %v3float %39 %38
+         %41 = OpCompositeExtract %float %params 6
+         %46 = OpCompositeConstruct %v3float %41 %41 %41
+         %42 = OpFAdd %v3float %40 %46
+         %47 = OpFMul %v3float %37 %42
+         %48 = OpExtInst %v3float %31 FSign %v
+         %50 = OpCompositeExtract %float %params 1
+         %51 = OpExtInst %v3float %31 FAbs %v
+         %52 = OpVectorTimesScalar %v3float %51 %50
+         %53 = OpCompositeExtract %float %params 2
+         %56 = OpCompositeConstruct %v3float %53 %53 %53
+         %54 = OpFAdd %v3float %52 %56
+         %57 = OpCompositeExtract %float %params 0
+         %58 = OpCompositeConstruct %v3float %57 %57 %57
+         %49 = OpExtInst %v3float %31 Pow %54 %58
+         %59 = OpCompositeExtract %float %params 5
+         %62 = OpCompositeConstruct %v3float %59 %59 %59
+         %60 = OpFAdd %v3float %49 %62
+         %63 = OpFMul %v3float %48 %60
+         %64 = OpSelect %v3float %34 %47 %63
+               OpReturnValue %64
                OpFunctionEnd
-%textureSampleExternal = OpFunction %v4float None %64
+%textureSampleExternal = OpFunction %v4float None %65
      %plane0 = OpFunctionParameter %11
      %plane1 = OpFunctionParameter %11
-        %smp = OpFunctionParameter %23
+        %smp = OpFunctionParameter %24
       %coord = OpFunctionParameter %v2float
    %params_0 = OpFunctionParameter %ExternalTextureParams
-         %72 = OpLabel
-      %color = OpVariable %_ptr_Function_v3float Function %44
-         %74 = OpCompositeExtract %uint %params_0 0
-         %76 = OpIEqual %bool %74 %uint_1
-               OpSelectionMerge %77 None
-               OpBranchConditional %76 %78 %79
-         %78 = OpLabel
-         %82 = OpSampledImage %81 %plane0 %smp
-         %80 = OpImageSampleExplicitLod %v4float %82 %coord Lod %8
-         %83 = OpVectorShuffle %v3float %80 %80 0 1 2
-               OpStore %color %83
-               OpBranch %77
+         %73 = OpLabel
+      %color = OpVariable %_ptr_Function_v3float Function %45
+         %75 = OpCompositeExtract %uint %params_0 0
+         %77 = OpIEqual %bool %75 %uint_1
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
          %79 = OpLabel
-         %85 = OpSampledImage %81 %plane0 %smp
-         %84 = OpImageSampleExplicitLod %v4float %85 %coord Lod %8
-         %86 = OpCompositeExtract %float %84 0
-         %88 = OpSampledImage %81 %plane1 %smp
-         %87 = OpImageSampleExplicitLod %v4float %88 %coord Lod %8
-         %89 = OpVectorShuffle %v2float %87 %87 0 1
-         %90 = OpCompositeExtract %float %89 0
-         %91 = OpCompositeExtract %float %89 1
-         %93 = OpCompositeConstruct %v4float %86 %90 %91 %float_1
-         %94 = OpCompositeExtract %mat3v4float %params_0 2
-         %95 = OpVectorTimesMatrix %v3float %93 %94
-               OpStore %color %95
-               OpBranch %77
-         %77 = OpLabel
-         %96 = OpCompositeExtract %uint %params_0 1
-         %98 = OpIEqual %bool %96 %97
-               OpSelectionMerge %99 None
-               OpBranchConditional %98 %100 %99
-        %100 = OpLabel
-        %102 = OpLoad %v3float %color
-        %103 = OpCompositeExtract %GammaTransferParams %params_0 3
-        %101 = OpFunctionCall %v3float %gammaCorrection %102 %103
-               OpStore %color %101
-        %104 = OpCompositeExtract %mat3v3float %params_0 5
-        %105 = OpLoad %v3float %color
-        %106 = OpMatrixTimesVector %v3float %104 %105
-               OpStore %color %106
-        %108 = OpLoad %v3float %color
-        %109 = OpCompositeExtract %GammaTransferParams %params_0 4
-        %107 = OpFunctionCall %v3float %gammaCorrection %108 %109
+         %83 = OpSampledImage %82 %plane0 %smp
+         %81 = OpImageSampleExplicitLod %v4float %83 %coord Lod %8
+         %84 = OpVectorShuffle %v3float %81 %81 0 1 2
+               OpStore %color %84
+               OpBranch %78
+         %80 = OpLabel
+         %86 = OpSampledImage %82 %plane0 %smp
+         %85 = OpImageSampleExplicitLod %v4float %86 %coord Lod %8
+         %87 = OpCompositeExtract %float %85 0
+         %89 = OpSampledImage %82 %plane1 %smp
+         %88 = OpImageSampleExplicitLod %v4float %89 %coord Lod %8
+         %90 = OpVectorShuffle %v2float %88 %88 0 1
+         %91 = OpCompositeExtract %float %90 0
+         %92 = OpCompositeExtract %float %90 1
+         %94 = OpCompositeConstruct %v4float %87 %91 %92 %float_1
+         %95 = OpCompositeExtract %mat3v4float %params_0 2
+         %96 = OpVectorTimesMatrix %v3float %94 %95
+               OpStore %color %96
+               OpBranch %78
+         %78 = OpLabel
+         %97 = OpCompositeExtract %uint %params_0 1
+         %99 = OpIEqual %bool %97 %98
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %100
+        %101 = OpLabel
+        %103 = OpLoad %v3float %color
+        %104 = OpCompositeExtract %GammaTransferParams %params_0 3
+        %102 = OpFunctionCall %v3float %gammaCorrection %103 %104
+               OpStore %color %102
+        %105 = OpCompositeExtract %mat3v3float %params_0 5
+        %106 = OpLoad %v3float %color
+        %107 = OpMatrixTimesVector %v3float %105 %106
                OpStore %color %107
-               OpBranch %99
-         %99 = OpLabel
-        %110 = OpLoad %v3float %color
-        %111 = OpCompositeExtract %float %110 0
-        %112 = OpCompositeExtract %float %110 1
-        %113 = OpCompositeExtract %float %110 2
-        %114 = OpCompositeConstruct %v4float %111 %112 %113 %float_1
-               OpReturnValue %114
+        %109 = OpLoad %v3float %color
+        %110 = OpCompositeExtract %GammaTransferParams %params_0 4
+        %108 = OpFunctionCall %v3float %gammaCorrection %109 %110
+               OpStore %color %108
+               OpBranch %100
+        %100 = OpLabel
+        %111 = OpLoad %v3float %color
+        %112 = OpCompositeExtract %float %111 0
+        %113 = OpCompositeExtract %float %111 1
+        %114 = OpCompositeExtract %float %111 2
+        %115 = OpCompositeConstruct %v4float %112 %113 %114 %float_1
+               OpReturnValue %115
                OpFunctionEnd
-%textureSampleLevel_979816 = OpFunction %void None %115
-        %118 = OpLabel
+%textureSampleLevel_979816 = OpFunction %void None %116
+        %119 = OpLabel
         %res = OpVariable %_ptr_Function_v4float Function %5
-        %120 = OpLoad %11 %arg_0
-        %121 = OpLoad %11 %ext_tex_plane_1
-        %122 = OpLoad %23 %arg_1
-        %124 = OpLoad %ExternalTextureParams %ext_tex_params
-        %119 = OpFunctionCall %v4float %textureSampleExternal %120 %121 %122 %123 %124
-               OpStore %res %119
+        %121 = OpLoad %11 %arg_0
+        %122 = OpLoad %11 %ext_tex_plane_1
+        %123 = OpLoad %24 %arg_1
+        %127 = OpAccessChain %_ptr_Uniform_ExternalTextureParams %ext_tex_params %uint_0
+        %128 = OpLoad %ExternalTextureParams %127
+        %120 = OpFunctionCall %v4float %textureSampleExternal %121 %122 %123 %124 %128
+               OpStore %res %120
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %127
-        %129 = OpLabel
-        %130 = OpFunctionCall %void %textureSampleLevel_979816
+%vertex_main_inner = OpFunction %v4float None %131
+        %133 = OpLabel
+        %134 = OpFunctionCall %void %textureSampleLevel_979816
                OpReturnValue %5
                OpFunctionEnd
-%vertex_main = OpFunction %void None %115
-        %132 = OpLabel
-        %133 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %133
+%vertex_main = OpFunction %void None %116
+        %136 = OpLabel
+        %137 = OpFunctionCall %v4float %vertex_main_inner
+               OpStore %value %137
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %115
-        %135 = OpLabel
-        %136 = OpFunctionCall %void %textureSampleLevel_979816
+%fragment_main = OpFunction %void None %116
+        %139 = OpLabel
+        %140 = OpFunctionCall %void %textureSampleLevel_979816
                OpReturn
                OpFunctionEnd
-%compute_main = OpFunction %void None %115
-        %138 = OpLabel
-        %139 = OpFunctionCall %void %textureSampleLevel_979816
+%compute_main = OpFunction %void None %116
+        %142 = OpLabel
+        %143 = OpFunctionCall %void %textureSampleLevel_979816
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.glsl b/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.glsl
index a143e18..4f59c4b 100644
--- a/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/1588cd.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   int arg_0[];
 } sb_ro;
+
 void arrayLength_1588cd() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   int arg_0[];
 } sb_ro;
+
 void arrayLength_1588cd() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   int arg_0[];
 } sb_ro;
+
 void arrayLength_1588cd() {
   uint res = uint(sb_ro.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.glsl b/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.glsl
index 46667de..d22edc1 100644
--- a/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/61b1c7.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0[];
 } sb_rw;
+
 void arrayLength_61b1c7() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0[];
 } sb_rw;
+
 void arrayLength_61b1c7() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0[];
 } sb_rw;
+
 void arrayLength_61b1c7() {
   uint res = uint(sb_rw.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/var/arrayLength/8421b9.wgsl.expected.glsl b/test/tint/builtins/gen/var/arrayLength/8421b9.wgsl.expected.glsl
index 58ecc49..c34cb64 100644
--- a/test/tint/builtins/gen/var/arrayLength/8421b9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/8421b9.wgsl.expected.glsl
@@ -1,17 +1,17 @@
 SKIP: FAILED
 
-gen/var/arrayLength/8421b9.wgsl:26:10 error: using f16 types in 'storage' storage class is not implemented yet
+builtins/gen/var/arrayLength/8421b9.wgsl:26:10 error: using f16 types in 'storage' storage class is not implemented yet
   arg_0: array<f16>,
          ^^^^^^^^^^
 
-gen/var/arrayLength/8421b9.wgsl:25:1 note: see layout of struct:
+builtins/gen/var/arrayLength/8421b9.wgsl:25:1 note: see layout of struct:
 /*           align(2) size(2) */ struct SB_RO {
 /* offset(0) align(2) size(2) */   arg_0 : array<f16>;
 /*                            */ };
 struct SB_RO {
 ^^^^^^
 
-gen/var/arrayLength/8421b9.wgsl:28:42 note: see declaration of variable
+builtins/gen/var/arrayLength/8421b9.wgsl:28:42 note: see declaration of variable
 @group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
                                          ^^^^^
 
diff --git a/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.glsl b/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.glsl
index 44aaf23..d7e4539 100644
--- a/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/a0f5ca.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   float arg_0[];
 } sb_ro;
+
 void arrayLength_a0f5ca() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   float arg_0[];
 } sb_ro;
+
 void arrayLength_a0f5ca() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   float arg_0[];
 } sb_ro;
+
 void arrayLength_a0f5ca() {
   uint res = uint(sb_ro.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/var/arrayLength/cbd6b5.wgsl.expected.glsl b/test/tint/builtins/gen/var/arrayLength/cbd6b5.wgsl.expected.glsl
index 07baca0..2819fce 100644
--- a/test/tint/builtins/gen/var/arrayLength/cbd6b5.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/cbd6b5.wgsl.expected.glsl
@@ -1,17 +1,17 @@
 SKIP: FAILED
 
-gen/var/arrayLength/cbd6b5.wgsl:26:10 error: using f16 types in 'storage' storage class is not implemented yet
+builtins/gen/var/arrayLength/cbd6b5.wgsl:26:10 error: using f16 types in 'storage' storage class is not implemented yet
   arg_0: array<f16>,
          ^^^^^^^^^^
 
-gen/var/arrayLength/cbd6b5.wgsl:25:1 note: see layout of struct:
+builtins/gen/var/arrayLength/cbd6b5.wgsl:25:1 note: see layout of struct:
 /*           align(2) size(2) */ struct SB_RW {
 /* offset(0) align(2) size(2) */   arg_0 : array<f16>;
 /*                            */ };
 struct SB_RW {
 ^^^^^^
 
-gen/var/arrayLength/cbd6b5.wgsl:28:48 note: see declaration of variable
+builtins/gen/var/arrayLength/cbd6b5.wgsl:28:48 note: see declaration of variable
 @group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
                                                ^^^^^
 
diff --git a/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.glsl b/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.glsl
index dac4336..5d417ac 100644
--- a/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/cdd123.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   float arg_0[];
 } sb_rw;
+
 void arrayLength_cdd123() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   float arg_0[];
 } sb_rw;
+
 void arrayLength_cdd123() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   float arg_0[];
 } sb_rw;
+
 void arrayLength_cdd123() {
   uint res = uint(sb_rw.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.glsl b/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.glsl
index e159bef..a605e06 100644
--- a/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/cfca0a.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   uint arg_0[];
 } sb_ro;
+
 void arrayLength_cfca0a() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   uint arg_0[];
 } sb_ro;
+
 void arrayLength_cfca0a() {
   uint res = uint(sb_ro.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 1, std430) buffer SB_RO_1 {
+layout(binding = 1, std430) buffer SB_RO_ssbo {
   uint arg_0[];
 } sb_ro;
+
 void arrayLength_cfca0a() {
   uint res = uint(sb_ro.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.glsl b/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.glsl
index a11f1aa..51f60de 100644
--- a/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/arrayLength/eb510f.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0[];
 } sb_rw;
+
 void arrayLength_eb510f() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -23,9 +24,10 @@
 #version 310 es
 precision mediump float;
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0[];
 } sb_rw;
+
 void arrayLength_eb510f() {
   uint res = uint(sb_rw.arg_0.length());
 }
@@ -40,9 +42,10 @@
 }
 #version 310 es
 
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0[];
 } sb_rw;
+
 void arrayLength_eb510f() {
   uint res = uint(sb_rw.arg_0.length());
 }
diff --git a/test/tint/builtins/gen/var/atomicAdd/8a199a.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicAdd/8a199a.wgsl.expected.glsl
index b4e7e25..1d00210 100644
--- a/test/tint/builtins/gen/var/atomicAdd/8a199a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicAdd/8a199a.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint arg_1 = 1u;
   uint res = atomicAdd(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAdd_8a199a() {
   uint arg_1 = 1u;
   uint res = atomicAdd(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicAdd/d32fe4.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicAdd/d32fe4.wgsl.expected.glsl
index c589612..35d22b2 100644
--- a/test/tint/builtins/gen/var/atomicAdd/d32fe4.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicAdd/d32fe4.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int arg_1 = 1;
   int res = atomicAdd(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAdd_d32fe4() {
   int arg_1 = 1;
   int res = atomicAdd(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicAnd/152966.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicAnd/152966.wgsl.expected.glsl
index 3e8c40f..79b77f1 100644
--- a/test/tint/builtins/gen/var/atomicAnd/152966.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicAnd/152966.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAnd_152966() {
   int arg_1 = 1;
   int res = atomicAnd(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicAnd_152966() {
   int arg_1 = 1;
   int res = atomicAnd(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicAnd/85a8d9.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicAnd/85a8d9.wgsl.expected.glsl
index 6d6dd70..66ed609 100644
--- a/test/tint/builtins/gen/var/atomicAnd/85a8d9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicAnd/85a8d9.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAnd_85a8d9() {
   uint arg_1 = 1u;
   uint res = atomicAnd(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicAnd_85a8d9() {
   uint arg_1 = 1u;
   uint res = atomicAnd(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl
index cae561b..ff8a3b2 100644
--- a/test/tint/builtins/gen/var/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicCompareExchangeWeak/1bd40a.wgsl.expected.glsl
@@ -7,13 +7,10 @@
 };
 
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_1bd40a() {
   int arg_1 = 1;
   int arg_2 = 1;
@@ -39,13 +36,10 @@
 };
 
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_1bd40a() {
   int arg_1 = 1;
   int arg_2 = 1;
diff --git a/test/tint/builtins/gen/var/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl
index a30b533..d976990 100644
--- a/test/tint/builtins/gen/var/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicCompareExchangeWeak/63d8e6.wgsl.expected.glsl
@@ -7,13 +7,10 @@
 };
 
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_63d8e6() {
   uint arg_1 = 1u;
   uint arg_2 = 1u;
@@ -39,13 +36,10 @@
 };
 
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicCompareExchangeWeak_63d8e6() {
   uint arg_1 = 1u;
   uint arg_2 = 1u;
diff --git a/test/tint/builtins/gen/var/atomicExchange/d59712.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicExchange/d59712.wgsl.expected.glsl
index 36903e2..96a02b8 100644
--- a/test/tint/builtins/gen/var/atomicExchange/d59712.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicExchange/d59712.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicExchange_d59712() {
   uint arg_1 = 1u;
   uint res = atomicExchange(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicExchange_d59712() {
   uint arg_1 = 1u;
   uint res = atomicExchange(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicExchange/f2e22f.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicExchange/f2e22f.wgsl.expected.glsl
index c74e310..b4dcaad 100644
--- a/test/tint/builtins/gen/var/atomicExchange/f2e22f.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicExchange/f2e22f.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicExchange_f2e22f() {
   int arg_1 = 1;
   int res = atomicExchange(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicExchange_f2e22f() {
   int arg_1 = 1;
   int res = atomicExchange(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicLoad/0806ad.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicLoad/0806ad.wgsl.expected.glsl
index 38a8c92..64291f3 100644
--- a/test/tint/builtins/gen/var/atomicLoad/0806ad.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicLoad/0806ad.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicLoad_0806ad() {
   int res = atomicOr(sb_rw.arg_0, 0);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicLoad_0806ad() {
   int res = atomicOr(sb_rw.arg_0, 0);
 }
diff --git a/test/tint/builtins/gen/var/atomicLoad/fe6cc3.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicLoad/fe6cc3.wgsl.expected.glsl
index b4bd0d8..f17c518 100644
--- a/test/tint/builtins/gen/var/atomicLoad/fe6cc3.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicLoad/fe6cc3.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicLoad_fe6cc3() {
   uint res = atomicOr(sb_rw.arg_0, 0u);
 }
@@ -22,13 +19,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicLoad_fe6cc3() {
   uint res = atomicOr(sb_rw.arg_0, 0u);
 }
diff --git a/test/tint/builtins/gen/var/atomicMax/51b9be.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicMax/51b9be.wgsl.expected.glsl
index 947c35c..6a0431f 100644
--- a/test/tint/builtins/gen/var/atomicMax/51b9be.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicMax/51b9be.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMax_51b9be() {
   uint arg_1 = 1u;
   uint res = atomicMax(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMax_51b9be() {
   uint arg_1 = 1u;
   uint res = atomicMax(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicMax/92aa72.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicMax/92aa72.wgsl.expected.glsl
index 326e6ed..43570a4 100644
--- a/test/tint/builtins/gen/var/atomicMax/92aa72.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicMax/92aa72.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMax_92aa72() {
   int arg_1 = 1;
   int res = atomicMax(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMax_92aa72() {
   int arg_1 = 1;
   int res = atomicMax(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicMin/8e38dc.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicMin/8e38dc.wgsl.expected.glsl
index 215a335..2ed6f59 100644
--- a/test/tint/builtins/gen/var/atomicMin/8e38dc.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicMin/8e38dc.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMin_8e38dc() {
   int arg_1 = 1;
   int res = atomicMin(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicMin_8e38dc() {
   int arg_1 = 1;
   int res = atomicMin(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicMin/c67a74.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicMin/c67a74.wgsl.expected.glsl
index 4d5b79b..8324f15 100644
--- a/test/tint/builtins/gen/var/atomicMin/c67a74.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicMin/c67a74.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMin_c67a74() {
   uint arg_1 = 1u;
   uint res = atomicMin(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicMin_c67a74() {
   uint arg_1 = 1u;
   uint res = atomicMin(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicOr/5e95d4.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicOr/5e95d4.wgsl.expected.glsl
index ddd41fe..65ecce1 100644
--- a/test/tint/builtins/gen/var/atomicOr/5e95d4.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicOr/5e95d4.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicOr_5e95d4() {
   uint arg_1 = 1u;
   uint res = atomicOr(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicOr_5e95d4() {
   uint arg_1 = 1u;
   uint res = atomicOr(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicOr/8d96a0.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicOr/8d96a0.wgsl.expected.glsl
index 237e6b0..dcb6985 100644
--- a/test/tint/builtins/gen/var/atomicOr/8d96a0.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicOr/8d96a0.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicOr_8d96a0() {
   int arg_1 = 1;
   int res = atomicOr(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicOr_8d96a0() {
   int arg_1 = 1;
   int res = atomicOr(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicStore/cdc29e.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicStore/cdc29e.wgsl.expected.glsl
index 22fd7a1..d9e75bf 100644
--- a/test/tint/builtins/gen/var/atomicStore/cdc29e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicStore/cdc29e.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicStore_cdc29e() {
   uint arg_1 = 1u;
   atomicExchange(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicStore_cdc29e() {
   uint arg_1 = 1u;
   atomicExchange(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicStore/d1e9a6.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicStore/d1e9a6.wgsl.expected.glsl
index f5e52e4..e4c98e0 100644
--- a/test/tint/builtins/gen/var/atomicStore/d1e9a6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicStore/d1e9a6.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicStore_d1e9a6() {
   int arg_1 = 1;
   atomicExchange(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicStore_d1e9a6() {
   int arg_1 = 1;
   atomicExchange(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicSub/051100.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicSub/051100.wgsl.expected.glsl
index 25f8eba..6ea56f6 100644
--- a/test/tint/builtins/gen/var/atomicSub/051100.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicSub/051100.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicSub_051100() {
   int arg_1 = 1;
   int res = atomicAdd(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicSub_051100() {
   int arg_1 = 1;
   int res = atomicAdd(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicSub/15bfc9.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicSub/15bfc9.wgsl.expected.glsl
index c21f8f7..e5d348c 100644
--- a/test/tint/builtins/gen/var/atomicSub/15bfc9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicSub/15bfc9.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicSub_15bfc9() {
   uint arg_1 = 1u;
   uint res = atomicAdd(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicSub_15bfc9() {
   uint arg_1 = 1u;
   uint res = atomicAdd(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicXor/54510e.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicXor/54510e.wgsl.expected.glsl
index 7ac4420..9ac7f7a 100644
--- a/test/tint/builtins/gen/var/atomicXor/54510e.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicXor/54510e.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicXor_54510e() {
   uint arg_1 = 1u;
   uint res = atomicXor(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  uint arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   uint arg_0;
 } sb_rw;
+
 void atomicXor_54510e() {
   uint arg_1 = 1u;
   uint res = atomicXor(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/atomicXor/c1b78c.wgsl.expected.glsl b/test/tint/builtins/gen/var/atomicXor/c1b78c.wgsl.expected.glsl
index 3f8236c..113781d 100644
--- a/test/tint/builtins/gen/var/atomicXor/c1b78c.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/atomicXor/c1b78c.wgsl.expected.glsl
@@ -1,13 +1,10 @@
 #version 310 es
 precision mediump float;
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicXor_c1b78c() {
   int arg_1 = 1;
   int res = atomicXor(sb_rw.arg_0, arg_1);
@@ -23,13 +20,10 @@
 }
 #version 310 es
 
-struct SB_RW {
-  int arg_0;
-};
-
-layout(binding = 0, std430) buffer SB_RW_1 {
+layout(binding = 0, std430) buffer SB_RW_ssbo {
   int arg_0;
 } sb_rw;
+
 void atomicXor_c1b78c() {
   int arg_1 = 1;
   int res = atomicXor(sb_rw.arg_0, arg_1);
diff --git a/test/tint/builtins/gen/var/textureDimensions/ba1481.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureDimensions/ba1481.wgsl.expected.glsl
index 47564ae..f610169 100644
--- a/test/tint/builtins/gen/var/textureDimensions/ba1481.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureDimensions/ba1481.wgsl.expected.glsl
@@ -11,16 +11,7 @@
   uint padding;
 };
 
-struct ExternalTextureParams {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
-};
-
-layout(binding = 2) uniform ExternalTextureParams_1 {
+layout(binding = 2) uniform ExternalTextureParams_ubo {
   uint numPlanes;
   uint doYuvToRgbConversionOnly;
   mat3x4 yuvToRgbConversionMatrix;
@@ -61,16 +52,7 @@
   uint padding;
 };
 
-struct ExternalTextureParams {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
-};
-
-layout(binding = 2) uniform ExternalTextureParams_1 {
+layout(binding = 2) uniform ExternalTextureParams_ubo {
   uint numPlanes;
   uint doYuvToRgbConversionOnly;
   mat3x4 yuvToRgbConversionMatrix;
@@ -105,16 +87,7 @@
   uint padding;
 };
 
-struct ExternalTextureParams {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
-};
-
-layout(binding = 2) uniform ExternalTextureParams_1 {
+layout(binding = 2) uniform ExternalTextureParams_ubo {
   uint numPlanes;
   uint doYuvToRgbConversionOnly;
   mat3x4 yuvToRgbConversionMatrix;
diff --git a/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.glsl
index 2a7cc09..0debae1 100644
--- a/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 struct GammaTransferParams {
@@ -22,13 +20,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 2) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -57,7 +50,7 @@
 uniform highp sampler2D ext_tex_plane_1_1;
 void textureLoad_8acf41() {
   ivec2 arg_1 = ivec2(0);
-  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, arg_1, ext_tex_params);
+  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, arg_1, ext_tex_params.inner);
 }
 
 vec4 vertex_main() {
@@ -73,14 +66,6 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:58: 'textureLoadExternal' : no matching overloaded function found 
-ERROR: 0:58: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:58: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
@@ -104,13 +89,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 2) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -139,7 +119,7 @@
 uniform highp sampler2D ext_tex_plane_1_1;
 void textureLoad_8acf41() {
   ivec2 arg_1 = ivec2(0);
-  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, arg_1, ext_tex_params);
+  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, arg_1, ext_tex_params.inner);
 }
 
 void fragment_main() {
@@ -150,14 +130,6 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:59: 'textureLoadExternal' : no matching overloaded function found 
-ERROR: 0:59: '=' :  cannot convert from ' const float' to ' temp mediump 4-component vector of float'
-ERROR: 0:59: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 struct GammaTransferParams {
@@ -180,13 +152,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 2) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -215,7 +182,7 @@
 uniform highp sampler2D ext_tex_plane_1_1;
 void textureLoad_8acf41() {
   ivec2 arg_1 = ivec2(0);
-  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, arg_1, ext_tex_params);
+  vec4 res = textureLoadExternal(arg_0_1, ext_tex_plane_1_1, arg_1, ext_tex_params.inner);
 }
 
 void compute_main() {
@@ -227,11 +194,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:58: 'textureLoadExternal' : no matching overloaded function found 
-ERROR: 0:58: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:58: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.spvasm
index c70c6b1..350a201 100644
--- a/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 137
+; Bound: 141
 ; Schema: 0
                OpCapability Shader
-         %27 = OpExtInstImport "GLSL.std.450"
+         %28 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
@@ -14,6 +14,8 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %ext_tex_plane_1 "ext_tex_plane_1"
+               OpName %ext_tex_params_block "ext_tex_params_block"
+               OpMemberName %ext_tex_params_block 0 "inner"
                OpName %ExternalTextureParams "ExternalTextureParams"
                OpMemberName %ExternalTextureParams 0 "numPlanes"
                OpMemberName %ExternalTextureParams 1 "doYuvToRgbConversionOnly"
@@ -52,7 +54,8 @@
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %ext_tex_plane_1 DescriptorSet 1
                OpDecorate %ext_tex_plane_1 Binding 1
-               OpDecorate %ExternalTextureParams Block
+               OpDecorate %ext_tex_params_block Block
+               OpMemberDecorate %ext_tex_params_block 0 Offset 0
                OpMemberDecorate %ExternalTextureParams 0 Offset 0
                OpMemberDecorate %ExternalTextureParams 1 Offset 4
                OpMemberDecorate %ExternalTextureParams 2 Offset 16
@@ -93,151 +96,155 @@
     %v3float = OpTypeVector %float 3
 %mat3v3float = OpTypeMatrix %v3float 3
 %ExternalTextureParams = OpTypeStruct %uint %uint %mat3v4float %GammaTransferParams %GammaTransferParams %mat3v3float
-%_ptr_Uniform_ExternalTextureParams = OpTypePointer Uniform %ExternalTextureParams
-%ext_tex_params = OpVariable %_ptr_Uniform_ExternalTextureParams Uniform
+%ext_tex_params_block = OpTypeStruct %ExternalTextureParams
+%_ptr_Uniform_ext_tex_params_block = OpTypePointer Uniform %ext_tex_params_block
+%ext_tex_params = OpVariable %_ptr_Uniform_ext_tex_params_block Uniform
       %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
-         %21 = OpTypeFunction %v3float %v3float %GammaTransferParams
+         %22 = OpTypeFunction %v3float %v3float %GammaTransferParams
        %bool = OpTypeBool
      %v3bool = OpTypeVector %bool 3
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-         %41 = OpConstantNull %v3float
+         %42 = OpConstantNull %v3float
         %int = OpTypeInt 32 1
       %v2int = OpTypeVector %int 2
-         %61 = OpTypeFunction %v4float %11 %11 %v2int %ExternalTextureParams
+         %62 = OpTypeFunction %v4float %11 %11 %v2int %ExternalTextureParams
      %uint_1 = OpConstant %uint 1
-         %78 = OpConstantNull %int
+         %79 = OpConstantNull %int
     %v2float = OpTypeVector %float 2
     %float_1 = OpConstant %float 1
-         %92 = OpConstantNull %uint
+         %93 = OpConstantNull %uint
        %void = OpTypeVoid
-        %110 = OpTypeFunction %void
-        %114 = OpConstantNull %v2int
+        %111 = OpTypeFunction %void
+        %115 = OpConstantNull %v2int
 %_ptr_Function_v2int = OpTypePointer Function %v2int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_ExternalTextureParams = OpTypePointer Uniform %ExternalTextureParams
 %_ptr_Function_v4float = OpTypePointer Function %v4float
-        %124 = OpTypeFunction %v4float
-%gammaCorrection = OpFunction %v3float None %21
+        %128 = OpTypeFunction %v4float
+%gammaCorrection = OpFunction %v3float None %22
           %v = OpFunctionParameter %v3float
      %params = OpFunctionParameter %GammaTransferParams
-         %25 = OpLabel
-         %39 = OpVariable %_ptr_Function_v3float Function %41
-         %51 = OpVariable %_ptr_Function_v3float Function %41
-         %57 = OpVariable %_ptr_Function_v3float Function %41
-         %26 = OpExtInst %v3float %27 FAbs %v
-         %28 = OpCompositeExtract %float %params 4
-         %29 = OpCompositeConstruct %v3float %28 %28 %28
-         %30 = OpFOrdLessThan %v3bool %26 %29
-         %33 = OpExtInst %v3float %27 FSign %v
-         %34 = OpCompositeExtract %float %params 3
-         %35 = OpExtInst %v3float %27 FAbs %v
-         %36 = OpVectorTimesScalar %v3float %35 %34
-         %37 = OpCompositeExtract %float %params 6
-         %42 = OpCompositeConstruct %v3float %37 %37 %37
-         %38 = OpFAdd %v3float %36 %42
-         %43 = OpFMul %v3float %33 %38
-         %44 = OpExtInst %v3float %27 FSign %v
-         %46 = OpCompositeExtract %float %params 1
-         %47 = OpExtInst %v3float %27 FAbs %v
-         %48 = OpVectorTimesScalar %v3float %47 %46
-         %49 = OpCompositeExtract %float %params 2
-         %52 = OpCompositeConstruct %v3float %49 %49 %49
-         %50 = OpFAdd %v3float %48 %52
-         %53 = OpCompositeExtract %float %params 0
-         %54 = OpCompositeConstruct %v3float %53 %53 %53
-         %45 = OpExtInst %v3float %27 Pow %50 %54
-         %55 = OpCompositeExtract %float %params 5
-         %58 = OpCompositeConstruct %v3float %55 %55 %55
-         %56 = OpFAdd %v3float %45 %58
-         %59 = OpFMul %v3float %44 %56
-         %60 = OpSelect %v3float %30 %43 %59
-               OpReturnValue %60
+         %26 = OpLabel
+         %40 = OpVariable %_ptr_Function_v3float Function %42
+         %52 = OpVariable %_ptr_Function_v3float Function %42
+         %58 = OpVariable %_ptr_Function_v3float Function %42
+         %27 = OpExtInst %v3float %28 FAbs %v
+         %29 = OpCompositeExtract %float %params 4
+         %30 = OpCompositeConstruct %v3float %29 %29 %29
+         %31 = OpFOrdLessThan %v3bool %27 %30
+         %34 = OpExtInst %v3float %28 FSign %v
+         %35 = OpCompositeExtract %float %params 3
+         %36 = OpExtInst %v3float %28 FAbs %v
+         %37 = OpVectorTimesScalar %v3float %36 %35
+         %38 = OpCompositeExtract %float %params 6
+         %43 = OpCompositeConstruct %v3float %38 %38 %38
+         %39 = OpFAdd %v3float %37 %43
+         %44 = OpFMul %v3float %34 %39
+         %45 = OpExtInst %v3float %28 FSign %v
+         %47 = OpCompositeExtract %float %params 1
+         %48 = OpExtInst %v3float %28 FAbs %v
+         %49 = OpVectorTimesScalar %v3float %48 %47
+         %50 = OpCompositeExtract %float %params 2
+         %53 = OpCompositeConstruct %v3float %50 %50 %50
+         %51 = OpFAdd %v3float %49 %53
+         %54 = OpCompositeExtract %float %params 0
+         %55 = OpCompositeConstruct %v3float %54 %54 %54
+         %46 = OpExtInst %v3float %28 Pow %51 %55
+         %56 = OpCompositeExtract %float %params 5
+         %59 = OpCompositeConstruct %v3float %56 %56 %56
+         %57 = OpFAdd %v3float %46 %59
+         %60 = OpFMul %v3float %45 %57
+         %61 = OpSelect %v3float %31 %44 %60
+               OpReturnValue %61
                OpFunctionEnd
-%textureLoadExternal = OpFunction %v4float None %61
+%textureLoadExternal = OpFunction %v4float None %62
      %plane0 = OpFunctionParameter %11
      %plane1 = OpFunctionParameter %11
       %coord = OpFunctionParameter %v2int
    %params_0 = OpFunctionParameter %ExternalTextureParams
-         %69 = OpLabel
-      %color = OpVariable %_ptr_Function_v3float Function %41
-         %71 = OpCompositeExtract %uint %params_0 0
-         %73 = OpIEqual %bool %71 %uint_1
-               OpSelectionMerge %74 None
-               OpBranchConditional %73 %75 %76
-         %75 = OpLabel
-         %77 = OpImageFetch %v4float %plane0 %coord Lod %78
-         %79 = OpVectorShuffle %v3float %77 %77 0 1 2
-               OpStore %color %79
-               OpBranch %74
+         %70 = OpLabel
+      %color = OpVariable %_ptr_Function_v3float Function %42
+         %72 = OpCompositeExtract %uint %params_0 0
+         %74 = OpIEqual %bool %72 %uint_1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
          %76 = OpLabel
-         %80 = OpImageFetch %v4float %plane0 %coord Lod %78
-         %81 = OpCompositeExtract %float %80 0
-         %82 = OpImageFetch %v4float %plane1 %coord Lod %78
-         %84 = OpVectorShuffle %v2float %82 %82 0 1
-         %85 = OpCompositeExtract %float %84 0
-         %86 = OpCompositeExtract %float %84 1
-         %88 = OpCompositeConstruct %v4float %81 %85 %86 %float_1
-         %89 = OpCompositeExtract %mat3v4float %params_0 2
-         %90 = OpVectorTimesMatrix %v3float %88 %89
-               OpStore %color %90
-               OpBranch %74
-         %74 = OpLabel
-         %91 = OpCompositeExtract %uint %params_0 1
-         %93 = OpIEqual %bool %91 %92
-               OpSelectionMerge %94 None
-               OpBranchConditional %93 %95 %94
-         %95 = OpLabel
-         %97 = OpLoad %v3float %color
-         %98 = OpCompositeExtract %GammaTransferParams %params_0 3
-         %96 = OpFunctionCall %v3float %gammaCorrection %97 %98
-               OpStore %color %96
-         %99 = OpCompositeExtract %mat3v3float %params_0 5
-        %100 = OpLoad %v3float %color
-        %101 = OpMatrixTimesVector %v3float %99 %100
-               OpStore %color %101
-        %103 = OpLoad %v3float %color
-        %104 = OpCompositeExtract %GammaTransferParams %params_0 4
-        %102 = OpFunctionCall %v3float %gammaCorrection %103 %104
+         %78 = OpImageFetch %v4float %plane0 %coord Lod %79
+         %80 = OpVectorShuffle %v3float %78 %78 0 1 2
+               OpStore %color %80
+               OpBranch %75
+         %77 = OpLabel
+         %81 = OpImageFetch %v4float %plane0 %coord Lod %79
+         %82 = OpCompositeExtract %float %81 0
+         %83 = OpImageFetch %v4float %plane1 %coord Lod %79
+         %85 = OpVectorShuffle %v2float %83 %83 0 1
+         %86 = OpCompositeExtract %float %85 0
+         %87 = OpCompositeExtract %float %85 1
+         %89 = OpCompositeConstruct %v4float %82 %86 %87 %float_1
+         %90 = OpCompositeExtract %mat3v4float %params_0 2
+         %91 = OpVectorTimesMatrix %v3float %89 %90
+               OpStore %color %91
+               OpBranch %75
+         %75 = OpLabel
+         %92 = OpCompositeExtract %uint %params_0 1
+         %94 = OpIEqual %bool %92 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+         %98 = OpLoad %v3float %color
+         %99 = OpCompositeExtract %GammaTransferParams %params_0 3
+         %97 = OpFunctionCall %v3float %gammaCorrection %98 %99
+               OpStore %color %97
+        %100 = OpCompositeExtract %mat3v3float %params_0 5
+        %101 = OpLoad %v3float %color
+        %102 = OpMatrixTimesVector %v3float %100 %101
                OpStore %color %102
-               OpBranch %94
-         %94 = OpLabel
-        %105 = OpLoad %v3float %color
-        %106 = OpCompositeExtract %float %105 0
-        %107 = OpCompositeExtract %float %105 1
-        %108 = OpCompositeExtract %float %105 2
-        %109 = OpCompositeConstruct %v4float %106 %107 %108 %float_1
-               OpReturnValue %109
+        %104 = OpLoad %v3float %color
+        %105 = OpCompositeExtract %GammaTransferParams %params_0 4
+        %103 = OpFunctionCall %v3float %gammaCorrection %104 %105
+               OpStore %color %103
+               OpBranch %95
+         %95 = OpLabel
+        %106 = OpLoad %v3float %color
+        %107 = OpCompositeExtract %float %106 0
+        %108 = OpCompositeExtract %float %106 1
+        %109 = OpCompositeExtract %float %106 2
+        %110 = OpCompositeConstruct %v4float %107 %108 %109 %float_1
+               OpReturnValue %110
                OpFunctionEnd
-%textureLoad_8acf41 = OpFunction %void None %110
-        %113 = OpLabel
-      %arg_1 = OpVariable %_ptr_Function_v2int Function %114
+%textureLoad_8acf41 = OpFunction %void None %111
+        %114 = OpLabel
+      %arg_1 = OpVariable %_ptr_Function_v2int Function %115
         %res = OpVariable %_ptr_Function_v4float Function %5
-               OpStore %arg_1 %114
-        %118 = OpLoad %11 %arg_0
-        %119 = OpLoad %11 %ext_tex_plane_1
-        %120 = OpLoad %v2int %arg_1
-        %121 = OpLoad %ExternalTextureParams %ext_tex_params
-        %117 = OpFunctionCall %v4float %textureLoadExternal %118 %119 %120 %121
-               OpStore %res %117
+               OpStore %arg_1 %115
+        %119 = OpLoad %11 %arg_0
+        %120 = OpLoad %11 %ext_tex_plane_1
+        %121 = OpLoad %v2int %arg_1
+        %124 = OpAccessChain %_ptr_Uniform_ExternalTextureParams %ext_tex_params %uint_0
+        %125 = OpLoad %ExternalTextureParams %124
+        %118 = OpFunctionCall %v4float %textureLoadExternal %119 %120 %121 %125
+               OpStore %res %118
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %124
-        %126 = OpLabel
-        %127 = OpFunctionCall %void %textureLoad_8acf41
+%vertex_main_inner = OpFunction %v4float None %128
+        %130 = OpLabel
+        %131 = OpFunctionCall %void %textureLoad_8acf41
                OpReturnValue %5
                OpFunctionEnd
-%vertex_main = OpFunction %void None %110
-        %129 = OpLabel
-        %130 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %130
+%vertex_main = OpFunction %void None %111
+        %133 = OpLabel
+        %134 = OpFunctionCall %v4float %vertex_main_inner
+               OpStore %value %134
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %110
-        %132 = OpLabel
-        %133 = OpFunctionCall %void %textureLoad_8acf41
+%fragment_main = OpFunction %void None %111
+        %136 = OpLabel
+        %137 = OpFunctionCall %void %textureLoad_8acf41
                OpReturn
                OpFunctionEnd
-%compute_main = OpFunction %void None %110
-        %135 = OpLabel
-        %136 = OpFunctionCall %void %textureLoad_8acf41
+%compute_main = OpFunction %void None %111
+        %139 = OpLabel
+        %140 = OpFunctionCall %void %textureLoad_8acf41
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.glsl b/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.glsl
index 11782ba..1a5bb9a 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 struct GammaTransferParams {
@@ -22,13 +20,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 3) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 3) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -58,7 +51,7 @@
 uniform highp sampler2D ext_tex_plane_1_arg_1;
 void textureSampleLevel_979816() {
   vec2 arg_2 = vec2(0.0f);
-  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, arg_2, ext_tex_params);
+  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, arg_2, ext_tex_params.inner);
 }
 
 vec4 vertex_main() {
@@ -74,14 +67,6 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:59: 'textureSampleExternal' : no matching overloaded function found 
-ERROR: 0:59: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:59: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
@@ -105,13 +90,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 3) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 3) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -141,7 +121,7 @@
 uniform highp sampler2D ext_tex_plane_1_arg_1;
 void textureSampleLevel_979816() {
   vec2 arg_2 = vec2(0.0f);
-  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, arg_2, ext_tex_params);
+  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, arg_2, ext_tex_params.inner);
 }
 
 void fragment_main() {
@@ -152,14 +132,6 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:60: 'textureSampleExternal' : no matching overloaded function found 
-ERROR: 0:60: '=' :  cannot convert from ' const float' to ' temp mediump 4-component vector of float'
-ERROR: 0:60: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 struct GammaTransferParams {
@@ -182,13 +154,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 3) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 3) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -218,7 +185,7 @@
 uniform highp sampler2D ext_tex_plane_1_arg_1;
 void textureSampleLevel_979816() {
   vec2 arg_2 = vec2(0.0f);
-  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, arg_2, ext_tex_params);
+  vec4 res = textureSampleExternal(arg_0_arg_1, ext_tex_plane_1_arg_1, arg_2, ext_tex_params.inner);
 }
 
 void compute_main() {
@@ -230,11 +197,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:59: 'textureSampleExternal' : no matching overloaded function found 
-ERROR: 0:59: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:59: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.spvasm b/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.spvasm
index ad6d2a9..accaf68 100644
--- a/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/textureSampleLevel/979816.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 143
+; Bound: 147
 ; Schema: 0
                OpCapability Shader
-         %30 = OpExtInstImport "GLSL.std.450"
+         %31 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
@@ -14,6 +14,8 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %ext_tex_plane_1 "ext_tex_plane_1"
+               OpName %ext_tex_params_block "ext_tex_params_block"
+               OpMemberName %ext_tex_params_block 0 "inner"
                OpName %ExternalTextureParams "ExternalTextureParams"
                OpMemberName %ExternalTextureParams 0 "numPlanes"
                OpMemberName %ExternalTextureParams 1 "doYuvToRgbConversionOnly"
@@ -54,7 +56,8 @@
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %ext_tex_plane_1 DescriptorSet 1
                OpDecorate %ext_tex_plane_1 Binding 2
-               OpDecorate %ExternalTextureParams Block
+               OpDecorate %ext_tex_params_block Block
+               OpMemberDecorate %ext_tex_params_block 0 Offset 0
                OpMemberDecorate %ExternalTextureParams 0 Offset 0
                OpMemberDecorate %ExternalTextureParams 1 Offset 4
                OpMemberDecorate %ExternalTextureParams 2 Offset 16
@@ -97,157 +100,161 @@
     %v3float = OpTypeVector %float 3
 %mat3v3float = OpTypeMatrix %v3float 3
 %ExternalTextureParams = OpTypeStruct %uint %uint %mat3v4float %GammaTransferParams %GammaTransferParams %mat3v3float
-%_ptr_Uniform_ExternalTextureParams = OpTypePointer Uniform %ExternalTextureParams
-%ext_tex_params = OpVariable %_ptr_Uniform_ExternalTextureParams Uniform
+%ext_tex_params_block = OpTypeStruct %ExternalTextureParams
+%_ptr_Uniform_ext_tex_params_block = OpTypePointer Uniform %ext_tex_params_block
+%ext_tex_params = OpVariable %_ptr_Uniform_ext_tex_params_block Uniform
       %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
-         %23 = OpTypeSampler
-%_ptr_UniformConstant_23 = OpTypePointer UniformConstant %23
-      %arg_1 = OpVariable %_ptr_UniformConstant_23 UniformConstant
-         %24 = OpTypeFunction %v3float %v3float %GammaTransferParams
+         %24 = OpTypeSampler
+%_ptr_UniformConstant_24 = OpTypePointer UniformConstant %24
+      %arg_1 = OpVariable %_ptr_UniformConstant_24 UniformConstant
+         %25 = OpTypeFunction %v3float %v3float %GammaTransferParams
        %bool = OpTypeBool
      %v3bool = OpTypeVector %bool 3
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-         %44 = OpConstantNull %v3float
+         %45 = OpConstantNull %v3float
     %v2float = OpTypeVector %float 2
-         %64 = OpTypeFunction %v4float %11 %11 %23 %v2float %ExternalTextureParams
+         %65 = OpTypeFunction %v4float %11 %11 %24 %v2float %ExternalTextureParams
      %uint_1 = OpConstant %uint 1
-         %81 = OpTypeSampledImage %11
+         %82 = OpTypeSampledImage %11
     %float_1 = OpConstant %float 1
-         %97 = OpConstantNull %uint
+         %98 = OpConstantNull %uint
        %void = OpTypeVoid
-        %115 = OpTypeFunction %void
-        %119 = OpConstantNull %v2float
+        %116 = OpTypeFunction %void
+        %120 = OpConstantNull %v2float
 %_ptr_Function_v2float = OpTypePointer Function %v2float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_ExternalTextureParams = OpTypePointer Uniform %ExternalTextureParams
 %_ptr_Function_v4float = OpTypePointer Function %v4float
-        %130 = OpTypeFunction %v4float
-%gammaCorrection = OpFunction %v3float None %24
+        %134 = OpTypeFunction %v4float
+%gammaCorrection = OpFunction %v3float None %25
           %v = OpFunctionParameter %v3float
      %params = OpFunctionParameter %GammaTransferParams
-         %28 = OpLabel
-         %42 = OpVariable %_ptr_Function_v3float Function %44
-         %54 = OpVariable %_ptr_Function_v3float Function %44
-         %60 = OpVariable %_ptr_Function_v3float Function %44
-         %29 = OpExtInst %v3float %30 FAbs %v
-         %31 = OpCompositeExtract %float %params 4
-         %32 = OpCompositeConstruct %v3float %31 %31 %31
-         %33 = OpFOrdLessThan %v3bool %29 %32
-         %36 = OpExtInst %v3float %30 FSign %v
-         %37 = OpCompositeExtract %float %params 3
-         %38 = OpExtInst %v3float %30 FAbs %v
-         %39 = OpVectorTimesScalar %v3float %38 %37
-         %40 = OpCompositeExtract %float %params 6
-         %45 = OpCompositeConstruct %v3float %40 %40 %40
-         %41 = OpFAdd %v3float %39 %45
-         %46 = OpFMul %v3float %36 %41
-         %47 = OpExtInst %v3float %30 FSign %v
-         %49 = OpCompositeExtract %float %params 1
-         %50 = OpExtInst %v3float %30 FAbs %v
-         %51 = OpVectorTimesScalar %v3float %50 %49
-         %52 = OpCompositeExtract %float %params 2
-         %55 = OpCompositeConstruct %v3float %52 %52 %52
-         %53 = OpFAdd %v3float %51 %55
-         %56 = OpCompositeExtract %float %params 0
-         %57 = OpCompositeConstruct %v3float %56 %56 %56
-         %48 = OpExtInst %v3float %30 Pow %53 %57
-         %58 = OpCompositeExtract %float %params 5
-         %61 = OpCompositeConstruct %v3float %58 %58 %58
-         %59 = OpFAdd %v3float %48 %61
-         %62 = OpFMul %v3float %47 %59
-         %63 = OpSelect %v3float %33 %46 %62
-               OpReturnValue %63
+         %29 = OpLabel
+         %43 = OpVariable %_ptr_Function_v3float Function %45
+         %55 = OpVariable %_ptr_Function_v3float Function %45
+         %61 = OpVariable %_ptr_Function_v3float Function %45
+         %30 = OpExtInst %v3float %31 FAbs %v
+         %32 = OpCompositeExtract %float %params 4
+         %33 = OpCompositeConstruct %v3float %32 %32 %32
+         %34 = OpFOrdLessThan %v3bool %30 %33
+         %37 = OpExtInst %v3float %31 FSign %v
+         %38 = OpCompositeExtract %float %params 3
+         %39 = OpExtInst %v3float %31 FAbs %v
+         %40 = OpVectorTimesScalar %v3float %39 %38
+         %41 = OpCompositeExtract %float %params 6
+         %46 = OpCompositeConstruct %v3float %41 %41 %41
+         %42 = OpFAdd %v3float %40 %46
+         %47 = OpFMul %v3float %37 %42
+         %48 = OpExtInst %v3float %31 FSign %v
+         %50 = OpCompositeExtract %float %params 1
+         %51 = OpExtInst %v3float %31 FAbs %v
+         %52 = OpVectorTimesScalar %v3float %51 %50
+         %53 = OpCompositeExtract %float %params 2
+         %56 = OpCompositeConstruct %v3float %53 %53 %53
+         %54 = OpFAdd %v3float %52 %56
+         %57 = OpCompositeExtract %float %params 0
+         %58 = OpCompositeConstruct %v3float %57 %57 %57
+         %49 = OpExtInst %v3float %31 Pow %54 %58
+         %59 = OpCompositeExtract %float %params 5
+         %62 = OpCompositeConstruct %v3float %59 %59 %59
+         %60 = OpFAdd %v3float %49 %62
+         %63 = OpFMul %v3float %48 %60
+         %64 = OpSelect %v3float %34 %47 %63
+               OpReturnValue %64
                OpFunctionEnd
-%textureSampleExternal = OpFunction %v4float None %64
+%textureSampleExternal = OpFunction %v4float None %65
      %plane0 = OpFunctionParameter %11
      %plane1 = OpFunctionParameter %11
-        %smp = OpFunctionParameter %23
+        %smp = OpFunctionParameter %24
       %coord = OpFunctionParameter %v2float
    %params_0 = OpFunctionParameter %ExternalTextureParams
-         %72 = OpLabel
-      %color = OpVariable %_ptr_Function_v3float Function %44
-         %74 = OpCompositeExtract %uint %params_0 0
-         %76 = OpIEqual %bool %74 %uint_1
-               OpSelectionMerge %77 None
-               OpBranchConditional %76 %78 %79
-         %78 = OpLabel
-         %82 = OpSampledImage %81 %plane0 %smp
-         %80 = OpImageSampleExplicitLod %v4float %82 %coord Lod %8
-         %83 = OpVectorShuffle %v3float %80 %80 0 1 2
-               OpStore %color %83
-               OpBranch %77
+         %73 = OpLabel
+      %color = OpVariable %_ptr_Function_v3float Function %45
+         %75 = OpCompositeExtract %uint %params_0 0
+         %77 = OpIEqual %bool %75 %uint_1
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
          %79 = OpLabel
-         %85 = OpSampledImage %81 %plane0 %smp
-         %84 = OpImageSampleExplicitLod %v4float %85 %coord Lod %8
-         %86 = OpCompositeExtract %float %84 0
-         %88 = OpSampledImage %81 %plane1 %smp
-         %87 = OpImageSampleExplicitLod %v4float %88 %coord Lod %8
-         %89 = OpVectorShuffle %v2float %87 %87 0 1
-         %90 = OpCompositeExtract %float %89 0
-         %91 = OpCompositeExtract %float %89 1
-         %93 = OpCompositeConstruct %v4float %86 %90 %91 %float_1
-         %94 = OpCompositeExtract %mat3v4float %params_0 2
-         %95 = OpVectorTimesMatrix %v3float %93 %94
-               OpStore %color %95
-               OpBranch %77
-         %77 = OpLabel
-         %96 = OpCompositeExtract %uint %params_0 1
-         %98 = OpIEqual %bool %96 %97
-               OpSelectionMerge %99 None
-               OpBranchConditional %98 %100 %99
-        %100 = OpLabel
-        %102 = OpLoad %v3float %color
-        %103 = OpCompositeExtract %GammaTransferParams %params_0 3
-        %101 = OpFunctionCall %v3float %gammaCorrection %102 %103
-               OpStore %color %101
-        %104 = OpCompositeExtract %mat3v3float %params_0 5
-        %105 = OpLoad %v3float %color
-        %106 = OpMatrixTimesVector %v3float %104 %105
-               OpStore %color %106
-        %108 = OpLoad %v3float %color
-        %109 = OpCompositeExtract %GammaTransferParams %params_0 4
-        %107 = OpFunctionCall %v3float %gammaCorrection %108 %109
+         %83 = OpSampledImage %82 %plane0 %smp
+         %81 = OpImageSampleExplicitLod %v4float %83 %coord Lod %8
+         %84 = OpVectorShuffle %v3float %81 %81 0 1 2
+               OpStore %color %84
+               OpBranch %78
+         %80 = OpLabel
+         %86 = OpSampledImage %82 %plane0 %smp
+         %85 = OpImageSampleExplicitLod %v4float %86 %coord Lod %8
+         %87 = OpCompositeExtract %float %85 0
+         %89 = OpSampledImage %82 %plane1 %smp
+         %88 = OpImageSampleExplicitLod %v4float %89 %coord Lod %8
+         %90 = OpVectorShuffle %v2float %88 %88 0 1
+         %91 = OpCompositeExtract %float %90 0
+         %92 = OpCompositeExtract %float %90 1
+         %94 = OpCompositeConstruct %v4float %87 %91 %92 %float_1
+         %95 = OpCompositeExtract %mat3v4float %params_0 2
+         %96 = OpVectorTimesMatrix %v3float %94 %95
+               OpStore %color %96
+               OpBranch %78
+         %78 = OpLabel
+         %97 = OpCompositeExtract %uint %params_0 1
+         %99 = OpIEqual %bool %97 %98
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %100
+        %101 = OpLabel
+        %103 = OpLoad %v3float %color
+        %104 = OpCompositeExtract %GammaTransferParams %params_0 3
+        %102 = OpFunctionCall %v3float %gammaCorrection %103 %104
+               OpStore %color %102
+        %105 = OpCompositeExtract %mat3v3float %params_0 5
+        %106 = OpLoad %v3float %color
+        %107 = OpMatrixTimesVector %v3float %105 %106
                OpStore %color %107
-               OpBranch %99
-         %99 = OpLabel
-        %110 = OpLoad %v3float %color
-        %111 = OpCompositeExtract %float %110 0
-        %112 = OpCompositeExtract %float %110 1
-        %113 = OpCompositeExtract %float %110 2
-        %114 = OpCompositeConstruct %v4float %111 %112 %113 %float_1
-               OpReturnValue %114
+        %109 = OpLoad %v3float %color
+        %110 = OpCompositeExtract %GammaTransferParams %params_0 4
+        %108 = OpFunctionCall %v3float %gammaCorrection %109 %110
+               OpStore %color %108
+               OpBranch %100
+        %100 = OpLabel
+        %111 = OpLoad %v3float %color
+        %112 = OpCompositeExtract %float %111 0
+        %113 = OpCompositeExtract %float %111 1
+        %114 = OpCompositeExtract %float %111 2
+        %115 = OpCompositeConstruct %v4float %112 %113 %114 %float_1
+               OpReturnValue %115
                OpFunctionEnd
-%textureSampleLevel_979816 = OpFunction %void None %115
-        %118 = OpLabel
-      %arg_2 = OpVariable %_ptr_Function_v2float Function %119
+%textureSampleLevel_979816 = OpFunction %void None %116
+        %119 = OpLabel
+      %arg_2 = OpVariable %_ptr_Function_v2float Function %120
         %res = OpVariable %_ptr_Function_v4float Function %5
-               OpStore %arg_2 %119
-        %123 = OpLoad %11 %arg_0
-        %124 = OpLoad %11 %ext_tex_plane_1
-        %125 = OpLoad %23 %arg_1
-        %126 = OpLoad %v2float %arg_2
-        %127 = OpLoad %ExternalTextureParams %ext_tex_params
-        %122 = OpFunctionCall %v4float %textureSampleExternal %123 %124 %125 %126 %127
-               OpStore %res %122
+               OpStore %arg_2 %120
+        %124 = OpLoad %11 %arg_0
+        %125 = OpLoad %11 %ext_tex_plane_1
+        %126 = OpLoad %24 %arg_1
+        %127 = OpLoad %v2float %arg_2
+        %130 = OpAccessChain %_ptr_Uniform_ExternalTextureParams %ext_tex_params %uint_0
+        %131 = OpLoad %ExternalTextureParams %130
+        %123 = OpFunctionCall %v4float %textureSampleExternal %124 %125 %126 %127 %131
+               OpStore %res %123
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %130
-        %132 = OpLabel
-        %133 = OpFunctionCall %void %textureSampleLevel_979816
+%vertex_main_inner = OpFunction %v4float None %134
+        %136 = OpLabel
+        %137 = OpFunctionCall %void %textureSampleLevel_979816
                OpReturnValue %5
                OpFunctionEnd
-%vertex_main = OpFunction %void None %115
-        %135 = OpLabel
-        %136 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %136
+%vertex_main = OpFunction %void None %116
+        %139 = OpLabel
+        %140 = OpFunctionCall %v4float %vertex_main_inner
+               OpStore %value %140
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %115
-        %138 = OpLabel
-        %139 = OpFunctionCall %void %textureSampleLevel_979816
+%fragment_main = OpFunction %void None %116
+        %142 = OpLabel
+        %143 = OpFunctionCall %void %textureSampleLevel_979816
                OpReturn
                OpFunctionEnd
-%compute_main = OpFunction %void None %115
-        %141 = OpLabel
-        %142 = OpFunctionCall %void %textureSampleLevel_979816
+%compute_main = OpFunction %void None %116
+        %145 = OpLabel
+        %146 = OpFunctionCall %void %textureSampleLevel_979816
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.glsl b/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.glsl
index 0d233de..47f9c0a 100644
--- a/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.glsl
+++ b/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 struct GammaTransferParams {
@@ -22,13 +20,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 2) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -60,7 +53,7 @@
 uniform highp sampler2D arg_0_1;
 uniform highp sampler2D ext_tex_plane_1_2;
 void doTextureLoad() {
-  vec4 res = textureLoad2d(arg_0_1, ext_tex_plane_1_2, ext_tex_params, ivec2(0));
+  vec4 res = textureLoad2d(arg_0_1, ext_tex_plane_1_2, ext_tex_params.inner, ivec2(0));
 }
 
 vec4 vertex_main() {
@@ -76,14 +69,6 @@
   gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:61: 'textureLoad2d' : no matching overloaded function found 
-ERROR: 0:61: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:61: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 precision mediump float;
 
@@ -107,13 +92,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 2) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -145,7 +125,7 @@
 uniform highp sampler2D arg_0_1;
 uniform highp sampler2D ext_tex_plane_1_2;
 void doTextureLoad() {
-  vec4 res = textureLoad2d(arg_0_1, ext_tex_plane_1_2, ext_tex_params, ivec2(0));
+  vec4 res = textureLoad2d(arg_0_1, ext_tex_plane_1_2, ext_tex_params.inner, ivec2(0));
 }
 
 void fragment_main() {
@@ -156,14 +136,6 @@
   fragment_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:62: 'textureLoad2d' : no matching overloaded function found 
-ERROR: 0:62: '=' :  cannot convert from ' const float' to ' temp mediump 4-component vector of float'
-ERROR: 0:62: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 struct GammaTransferParams {
@@ -186,13 +158,8 @@
   mat3 gamutConversionMatrix;
 };
 
-layout(binding = 2) uniform ExternalTextureParams_1 {
-  uint numPlanes;
-  uint doYuvToRgbConversionOnly;
-  mat3x4 yuvToRgbConversionMatrix;
-  GammaTransferParams gammaDecodeParams;
-  GammaTransferParams gammaEncodeParams;
-  mat3 gamutConversionMatrix;
+layout(binding = 2) uniform ext_tex_params_block_ubo {
+  ExternalTextureParams inner;
 } ext_tex_params;
 
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
@@ -224,7 +191,7 @@
 uniform highp sampler2D arg_0_1;
 uniform highp sampler2D ext_tex_plane_1_2;
 void doTextureLoad() {
-  vec4 res = textureLoad2d(arg_0_1, ext_tex_plane_1_2, ext_tex_params, ivec2(0));
+  vec4 res = textureLoad2d(arg_0_1, ext_tex_plane_1_2, ext_tex_params.inner, ivec2(0));
 }
 
 void compute_main() {
@@ -236,11 +203,3 @@
   compute_main();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:61: 'textureLoad2d' : no matching overloaded function found 
-ERROR: 0:61: '=' :  cannot convert from ' const float' to ' temp highp 4-component vector of float'
-ERROR: 0:61: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.spvasm b/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.spvasm
index a894d4c..e0ff7dd 100644
--- a/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.spvasm
+++ b/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.spvasm
@@ -1,10 +1,10 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 142
+; Bound: 146
 ; Schema: 0
                OpCapability Shader
-         %27 = OpExtInstImport "GLSL.std.450"
+         %28 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Vertex %vertex_main "vertex_main" %value %vertex_point_size
                OpEntryPoint Fragment %fragment_main "fragment_main"
@@ -14,6 +14,8 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %ext_tex_plane_1 "ext_tex_plane_1"
+               OpName %ext_tex_params_block "ext_tex_params_block"
+               OpMemberName %ext_tex_params_block 0 "inner"
                OpName %ExternalTextureParams "ExternalTextureParams"
                OpMemberName %ExternalTextureParams 0 "numPlanes"
                OpMemberName %ExternalTextureParams 1 "doYuvToRgbConversionOnly"
@@ -56,7 +58,8 @@
                OpDecorate %vertex_point_size BuiltIn PointSize
                OpDecorate %ext_tex_plane_1 DescriptorSet 1
                OpDecorate %ext_tex_plane_1 Binding 1
-               OpDecorate %ExternalTextureParams Block
+               OpDecorate %ext_tex_params_block Block
+               OpMemberDecorate %ext_tex_params_block 0 Offset 0
                OpMemberDecorate %ExternalTextureParams 0 Offset 0
                OpMemberDecorate %ExternalTextureParams 1 Offset 4
                OpMemberDecorate %ExternalTextureParams 2 Offset 16
@@ -97,157 +100,161 @@
     %v3float = OpTypeVector %float 3
 %mat3v3float = OpTypeMatrix %v3float 3
 %ExternalTextureParams = OpTypeStruct %uint %uint %mat3v4float %GammaTransferParams %GammaTransferParams %mat3v3float
-%_ptr_Uniform_ExternalTextureParams = OpTypePointer Uniform %ExternalTextureParams
-%ext_tex_params = OpVariable %_ptr_Uniform_ExternalTextureParams Uniform
+%ext_tex_params_block = OpTypeStruct %ExternalTextureParams
+%_ptr_Uniform_ext_tex_params_block = OpTypePointer Uniform %ext_tex_params_block
+%ext_tex_params = OpVariable %_ptr_Uniform_ext_tex_params_block Uniform
       %arg_0 = OpVariable %_ptr_UniformConstant_11 UniformConstant
-         %21 = OpTypeFunction %v3float %v3float %GammaTransferParams
+         %22 = OpTypeFunction %v3float %v3float %GammaTransferParams
        %bool = OpTypeBool
      %v3bool = OpTypeVector %bool 3
 %_ptr_Function_v3float = OpTypePointer Function %v3float
-         %41 = OpConstantNull %v3float
+         %42 = OpConstantNull %v3float
         %int = OpTypeInt 32 1
       %v2int = OpTypeVector %int 2
-         %61 = OpTypeFunction %v4float %11 %11 %v2int %ExternalTextureParams
+         %62 = OpTypeFunction %v4float %11 %11 %v2int %ExternalTextureParams
      %uint_1 = OpConstant %uint 1
-         %78 = OpConstantNull %int
+         %79 = OpConstantNull %int
     %v2float = OpTypeVector %float 2
     %float_1 = OpConstant %float 1
-         %92 = OpConstantNull %uint
-        %110 = OpTypeFunction %v4float %11 %11 %ExternalTextureParams %v2int
+         %93 = OpConstantNull %uint
+        %111 = OpTypeFunction %v4float %11 %11 %ExternalTextureParams %v2int
        %void = OpTypeVoid
-        %118 = OpTypeFunction %void
-        %126 = OpConstantNull %v2int
+        %119 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_ExternalTextureParams = OpTypePointer Uniform %ExternalTextureParams
+        %130 = OpConstantNull %v2int
 %_ptr_Function_v4float = OpTypePointer Function %v4float
-        %129 = OpTypeFunction %v4float
-%gammaCorrection = OpFunction %v3float None %21
+        %133 = OpTypeFunction %v4float
+%gammaCorrection = OpFunction %v3float None %22
           %v = OpFunctionParameter %v3float
      %params = OpFunctionParameter %GammaTransferParams
-         %25 = OpLabel
-         %39 = OpVariable %_ptr_Function_v3float Function %41
-         %51 = OpVariable %_ptr_Function_v3float Function %41
-         %57 = OpVariable %_ptr_Function_v3float Function %41
-         %26 = OpExtInst %v3float %27 FAbs %v
-         %28 = OpCompositeExtract %float %params 4
-         %29 = OpCompositeConstruct %v3float %28 %28 %28
-         %30 = OpFOrdLessThan %v3bool %26 %29
-         %33 = OpExtInst %v3float %27 FSign %v
-         %34 = OpCompositeExtract %float %params 3
-         %35 = OpExtInst %v3float %27 FAbs %v
-         %36 = OpVectorTimesScalar %v3float %35 %34
-         %37 = OpCompositeExtract %float %params 6
-         %42 = OpCompositeConstruct %v3float %37 %37 %37
-         %38 = OpFAdd %v3float %36 %42
-         %43 = OpFMul %v3float %33 %38
-         %44 = OpExtInst %v3float %27 FSign %v
-         %46 = OpCompositeExtract %float %params 1
-         %47 = OpExtInst %v3float %27 FAbs %v
-         %48 = OpVectorTimesScalar %v3float %47 %46
-         %49 = OpCompositeExtract %float %params 2
-         %52 = OpCompositeConstruct %v3float %49 %49 %49
-         %50 = OpFAdd %v3float %48 %52
-         %53 = OpCompositeExtract %float %params 0
-         %54 = OpCompositeConstruct %v3float %53 %53 %53
-         %45 = OpExtInst %v3float %27 Pow %50 %54
-         %55 = OpCompositeExtract %float %params 5
-         %58 = OpCompositeConstruct %v3float %55 %55 %55
-         %56 = OpFAdd %v3float %45 %58
-         %59 = OpFMul %v3float %44 %56
-         %60 = OpSelect %v3float %30 %43 %59
-               OpReturnValue %60
+         %26 = OpLabel
+         %40 = OpVariable %_ptr_Function_v3float Function %42
+         %52 = OpVariable %_ptr_Function_v3float Function %42
+         %58 = OpVariable %_ptr_Function_v3float Function %42
+         %27 = OpExtInst %v3float %28 FAbs %v
+         %29 = OpCompositeExtract %float %params 4
+         %30 = OpCompositeConstruct %v3float %29 %29 %29
+         %31 = OpFOrdLessThan %v3bool %27 %30
+         %34 = OpExtInst %v3float %28 FSign %v
+         %35 = OpCompositeExtract %float %params 3
+         %36 = OpExtInst %v3float %28 FAbs %v
+         %37 = OpVectorTimesScalar %v3float %36 %35
+         %38 = OpCompositeExtract %float %params 6
+         %43 = OpCompositeConstruct %v3float %38 %38 %38
+         %39 = OpFAdd %v3float %37 %43
+         %44 = OpFMul %v3float %34 %39
+         %45 = OpExtInst %v3float %28 FSign %v
+         %47 = OpCompositeExtract %float %params 1
+         %48 = OpExtInst %v3float %28 FAbs %v
+         %49 = OpVectorTimesScalar %v3float %48 %47
+         %50 = OpCompositeExtract %float %params 2
+         %53 = OpCompositeConstruct %v3float %50 %50 %50
+         %51 = OpFAdd %v3float %49 %53
+         %54 = OpCompositeExtract %float %params 0
+         %55 = OpCompositeConstruct %v3float %54 %54 %54
+         %46 = OpExtInst %v3float %28 Pow %51 %55
+         %56 = OpCompositeExtract %float %params 5
+         %59 = OpCompositeConstruct %v3float %56 %56 %56
+         %57 = OpFAdd %v3float %46 %59
+         %60 = OpFMul %v3float %45 %57
+         %61 = OpSelect %v3float %31 %44 %60
+               OpReturnValue %61
                OpFunctionEnd
-%textureLoadExternal = OpFunction %v4float None %61
+%textureLoadExternal = OpFunction %v4float None %62
      %plane0 = OpFunctionParameter %11
      %plane1 = OpFunctionParameter %11
       %coord = OpFunctionParameter %v2int
    %params_0 = OpFunctionParameter %ExternalTextureParams
-         %69 = OpLabel
-      %color = OpVariable %_ptr_Function_v3float Function %41
-         %71 = OpCompositeExtract %uint %params_0 0
-         %73 = OpIEqual %bool %71 %uint_1
-               OpSelectionMerge %74 None
-               OpBranchConditional %73 %75 %76
-         %75 = OpLabel
-         %77 = OpImageFetch %v4float %plane0 %coord Lod %78
-         %79 = OpVectorShuffle %v3float %77 %77 0 1 2
-               OpStore %color %79
-               OpBranch %74
+         %70 = OpLabel
+      %color = OpVariable %_ptr_Function_v3float Function %42
+         %72 = OpCompositeExtract %uint %params_0 0
+         %74 = OpIEqual %bool %72 %uint_1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
          %76 = OpLabel
-         %80 = OpImageFetch %v4float %plane0 %coord Lod %78
-         %81 = OpCompositeExtract %float %80 0
-         %82 = OpImageFetch %v4float %plane1 %coord Lod %78
-         %84 = OpVectorShuffle %v2float %82 %82 0 1
-         %85 = OpCompositeExtract %float %84 0
-         %86 = OpCompositeExtract %float %84 1
-         %88 = OpCompositeConstruct %v4float %81 %85 %86 %float_1
-         %89 = OpCompositeExtract %mat3v4float %params_0 2
-         %90 = OpVectorTimesMatrix %v3float %88 %89
-               OpStore %color %90
-               OpBranch %74
-         %74 = OpLabel
-         %91 = OpCompositeExtract %uint %params_0 1
-         %93 = OpIEqual %bool %91 %92
-               OpSelectionMerge %94 None
-               OpBranchConditional %93 %95 %94
-         %95 = OpLabel
-         %97 = OpLoad %v3float %color
-         %98 = OpCompositeExtract %GammaTransferParams %params_0 3
-         %96 = OpFunctionCall %v3float %gammaCorrection %97 %98
-               OpStore %color %96
-         %99 = OpCompositeExtract %mat3v3float %params_0 5
-        %100 = OpLoad %v3float %color
-        %101 = OpMatrixTimesVector %v3float %99 %100
-               OpStore %color %101
-        %103 = OpLoad %v3float %color
-        %104 = OpCompositeExtract %GammaTransferParams %params_0 4
-        %102 = OpFunctionCall %v3float %gammaCorrection %103 %104
+         %78 = OpImageFetch %v4float %plane0 %coord Lod %79
+         %80 = OpVectorShuffle %v3float %78 %78 0 1 2
+               OpStore %color %80
+               OpBranch %75
+         %77 = OpLabel
+         %81 = OpImageFetch %v4float %plane0 %coord Lod %79
+         %82 = OpCompositeExtract %float %81 0
+         %83 = OpImageFetch %v4float %plane1 %coord Lod %79
+         %85 = OpVectorShuffle %v2float %83 %83 0 1
+         %86 = OpCompositeExtract %float %85 0
+         %87 = OpCompositeExtract %float %85 1
+         %89 = OpCompositeConstruct %v4float %82 %86 %87 %float_1
+         %90 = OpCompositeExtract %mat3v4float %params_0 2
+         %91 = OpVectorTimesMatrix %v3float %89 %90
+               OpStore %color %91
+               OpBranch %75
+         %75 = OpLabel
+         %92 = OpCompositeExtract %uint %params_0 1
+         %94 = OpIEqual %bool %92 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+         %98 = OpLoad %v3float %color
+         %99 = OpCompositeExtract %GammaTransferParams %params_0 3
+         %97 = OpFunctionCall %v3float %gammaCorrection %98 %99
+               OpStore %color %97
+        %100 = OpCompositeExtract %mat3v3float %params_0 5
+        %101 = OpLoad %v3float %color
+        %102 = OpMatrixTimesVector %v3float %100 %101
                OpStore %color %102
-               OpBranch %94
-         %94 = OpLabel
-        %105 = OpLoad %v3float %color
-        %106 = OpCompositeExtract %float %105 0
-        %107 = OpCompositeExtract %float %105 1
-        %108 = OpCompositeExtract %float %105 2
-        %109 = OpCompositeConstruct %v4float %106 %107 %108 %float_1
-               OpReturnValue %109
+        %104 = OpLoad %v3float %color
+        %105 = OpCompositeExtract %GammaTransferParams %params_0 4
+        %103 = OpFunctionCall %v3float %gammaCorrection %104 %105
+               OpStore %color %103
+               OpBranch %95
+         %95 = OpLabel
+        %106 = OpLoad %v3float %color
+        %107 = OpCompositeExtract %float %106 0
+        %108 = OpCompositeExtract %float %106 1
+        %109 = OpCompositeExtract %float %106 2
+        %110 = OpCompositeConstruct %v4float %107 %108 %109 %float_1
+               OpReturnValue %110
                OpFunctionEnd
-%textureLoad2d = OpFunction %v4float None %110
+%textureLoad2d = OpFunction %v4float None %111
     %texture = OpFunctionParameter %11
 %ext_tex_plane_1_1 = OpFunctionParameter %11
 %ext_tex_params_1 = OpFunctionParameter %ExternalTextureParams
      %coords = OpFunctionParameter %v2int
-        %116 = OpLabel
-        %117 = OpFunctionCall %v4float %textureLoadExternal %texture %ext_tex_plane_1_1 %coords %ext_tex_params_1
-               OpReturnValue %117
+        %117 = OpLabel
+        %118 = OpFunctionCall %v4float %textureLoadExternal %texture %ext_tex_plane_1_1 %coords %ext_tex_params_1
+               OpReturnValue %118
                OpFunctionEnd
-%doTextureLoad = OpFunction %void None %118
-        %121 = OpLabel
+%doTextureLoad = OpFunction %void None %119
+        %122 = OpLabel
         %res = OpVariable %_ptr_Function_v4float Function %5
-        %123 = OpLoad %11 %arg_0
-        %124 = OpLoad %11 %ext_tex_plane_1
-        %125 = OpLoad %ExternalTextureParams %ext_tex_params
-        %122 = OpFunctionCall %v4float %textureLoad2d %123 %124 %125 %126
-               OpStore %res %122
+        %124 = OpLoad %11 %arg_0
+        %125 = OpLoad %11 %ext_tex_plane_1
+        %128 = OpAccessChain %_ptr_Uniform_ExternalTextureParams %ext_tex_params %uint_0
+        %129 = OpLoad %ExternalTextureParams %128
+        %123 = OpFunctionCall %v4float %textureLoad2d %124 %125 %129 %130
+               OpStore %res %123
                OpReturn
                OpFunctionEnd
-%vertex_main_inner = OpFunction %v4float None %129
-        %131 = OpLabel
-        %132 = OpFunctionCall %void %doTextureLoad
+%vertex_main_inner = OpFunction %v4float None %133
+        %135 = OpLabel
+        %136 = OpFunctionCall %void %doTextureLoad
                OpReturnValue %5
                OpFunctionEnd
-%vertex_main = OpFunction %void None %118
-        %134 = OpLabel
-        %135 = OpFunctionCall %v4float %vertex_main_inner
-               OpStore %value %135
+%vertex_main = OpFunction %void None %119
+        %138 = OpLabel
+        %139 = OpFunctionCall %v4float %vertex_main_inner
+               OpStore %value %139
                OpStore %vertex_point_size %float_1
                OpReturn
                OpFunctionEnd
-%fragment_main = OpFunction %void None %118
-        %137 = OpLabel
-        %138 = OpFunctionCall %void %doTextureLoad
+%fragment_main = OpFunction %void None %119
+        %141 = OpLabel
+        %142 = OpFunctionCall %void %doTextureLoad
                OpReturn
                OpFunctionEnd
-%compute_main = OpFunction %void None %118
-        %140 = OpLabel
-        %141 = OpFunctionCall %void %doTextureLoad
+%compute_main = OpFunction %void None %119
+        %144 = OpLabel
+        %145 = OpFunctionCall %void %doTextureLoad
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.glsl b/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.glsl
index 729d8e0..51aef61 100644
--- a/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.glsl
@@ -1,10 +1,10 @@
 SKIP: FAILED
 
-binary/mul/mat3x2-vec3/f16.wgsl:3:14 error: using f16 types in 'uniform' storage class is not implemented yet
+expressions/binary/mul/mat3x2-vec3/f16.wgsl:3:14 error: using f16 types in 'uniform' storage class is not implemented yet
     matrix : mat3x2<f16>,
              ^^^^^^^^^^^
 
-binary/mul/mat3x2-vec3/f16.wgsl:2:1 note: see layout of struct:
+expressions/binary/mul/mat3x2-vec3/f16.wgsl:2:1 note: see layout of struct:
 /*            align(8) size(24) */ struct S {
 /* offset( 0) align(4) size(12) */   matrix : mat3x2<f16>;
 /* offset(12) align(1) size( 4) */   // -- implicit field alignment padding --;
@@ -14,7 +14,7 @@
 struct S {
 ^^^^^^
 
-binary/mul/mat3x2-vec3/f16.wgsl:6:36 note: see declaration of variable
+expressions/binary/mul/mat3x2-vec3/f16.wgsl:6:36 note: see declaration of variable
 @group(0) @binding(0) var<uniform> data: S;
                                    ^^^^
 
diff --git a/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.glsl b/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.glsl
index 086769e..c2ceb0a 100644
--- a/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.glsl
@@ -6,14 +6,7 @@
   vec3 vector;
 };
 
-struct S_std140 {
-  vec2 matrix_0;
-  vec2 matrix_1;
-  vec2 matrix_2;
-  vec3 vector;
-};
-
-layout(binding = 0) uniform S_std140_1 {
+layout(binding = 0) uniform S_std140_ubo {
   vec2 matrix_0;
   vec2 matrix_1;
   vec2 matrix_2;
diff --git a/test/tint/expressions/binary/mul/mat3x3-vec3/f16.wgsl.expected.glsl b/test/tint/expressions/binary/mul/mat3x3-vec3/f16.wgsl.expected.glsl
index fe18486..0b83b52 100644
--- a/test/tint/expressions/binary/mul/mat3x3-vec3/f16.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/mat3x3-vec3/f16.wgsl.expected.glsl
@@ -1,10 +1,10 @@
 SKIP: FAILED
 
-binary/mul/mat3x3-vec3/f16.wgsl:3:14 error: using f16 types in 'uniform' storage class is not implemented yet
+expressions/binary/mul/mat3x3-vec3/f16.wgsl:3:14 error: using f16 types in 'uniform' storage class is not implemented yet
     matrix : mat3x3<f16>,
              ^^^^^^^^^^^
 
-binary/mul/mat3x3-vec3/f16.wgsl:2:1 note: see layout of struct:
+expressions/binary/mul/mat3x3-vec3/f16.wgsl:2:1 note: see layout of struct:
 /*            align(8) size(32) */ struct S {
 /* offset( 0) align(8) size(24) */   matrix : mat3x3<f16>;
 /* offset(24) align(8) size( 6) */   vector : vec3<f16>;
@@ -13,7 +13,7 @@
 struct S {
 ^^^^^^
 
-binary/mul/mat3x3-vec3/f16.wgsl:6:36 note: see declaration of variable
+expressions/binary/mul/mat3x3-vec3/f16.wgsl:6:36 note: see declaration of variable
 @group(0) @binding(0) var<uniform> data: S;
                                    ^^^^
 
diff --git a/test/tint/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.glsl b/test/tint/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.glsl
index 42cee27..b5481e4 100644
--- a/test/tint/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.glsl
@@ -1,12 +1,7 @@
 #version 310 es
 precision mediump float;
 
-struct S {
-  mat3 matrix;
-  vec3 vector;
-};
-
-layout(binding = 0) uniform S_1 {
+layout(binding = 0) uniform S_ubo {
   mat3 matrix;
   vec3 vector;
 } data;
diff --git a/test/tint/expressions/binary/mul/vec3-mat3x3/f16.wgsl.expected.glsl b/test/tint/expressions/binary/mul/vec3-mat3x3/f16.wgsl.expected.glsl
index da8a0b2..e34358b 100644
--- a/test/tint/expressions/binary/mul/vec3-mat3x3/f16.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/vec3-mat3x3/f16.wgsl.expected.glsl
@@ -1,10 +1,10 @@
 SKIP: FAILED
 
-binary/mul/vec3-mat3x3/f16.wgsl:3:14 error: using f16 types in 'uniform' storage class is not implemented yet
+expressions/binary/mul/vec3-mat3x3/f16.wgsl:3:14 error: using f16 types in 'uniform' storage class is not implemented yet
     matrix : mat3x3<f16>,
              ^^^^^^^^^^^
 
-binary/mul/vec3-mat3x3/f16.wgsl:2:1 note: see layout of struct:
+expressions/binary/mul/vec3-mat3x3/f16.wgsl:2:1 note: see layout of struct:
 /*            align(8) size(32) */ struct S {
 /* offset( 0) align(8) size(24) */   matrix : mat3x3<f16>;
 /* offset(24) align(8) size( 6) */   vector : vec3<f16>;
@@ -13,7 +13,7 @@
 struct S {
 ^^^^^^
 
-binary/mul/vec3-mat3x3/f16.wgsl:6:36 note: see declaration of variable
+expressions/binary/mul/vec3-mat3x3/f16.wgsl:6:36 note: see declaration of variable
 @group(0) @binding(0) var<uniform> data: S;
                                    ^^^^
 
diff --git a/test/tint/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.glsl b/test/tint/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.glsl
index 200be2b..8059407 100644
--- a/test/tint/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.glsl
@@ -1,12 +1,7 @@
 #version 310 es
 precision mediump float;
 
-struct S {
-  mat3 matrix;
-  vec3 vector;
-};
-
-layout(binding = 0) uniform S_1 {
+layout(binding = 0) uniform S_ubo {
   mat3 matrix;
   vec3 vector;
 } data;
diff --git a/test/tint/expressions/binary/mul/vec3-mat4x3/f16.wgsl.expected.glsl b/test/tint/expressions/binary/mul/vec3-mat4x3/f16.wgsl.expected.glsl
index 4b075b5..367b08c 100644
--- a/test/tint/expressions/binary/mul/vec3-mat4x3/f16.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/vec3-mat4x3/f16.wgsl.expected.glsl
@@ -1,10 +1,10 @@
 SKIP: FAILED
 
-binary/mul/vec3-mat4x3/f16.wgsl:3:14 error: using f16 types in 'uniform' storage class is not implemented yet
+expressions/binary/mul/vec3-mat4x3/f16.wgsl:3:14 error: using f16 types in 'uniform' storage class is not implemented yet
     matrix : mat4x3<f16>,
              ^^^^^^^^^^^
 
-binary/mul/vec3-mat4x3/f16.wgsl:2:1 note: see layout of struct:
+expressions/binary/mul/vec3-mat4x3/f16.wgsl:2:1 note: see layout of struct:
 /*            align(8) size(40) */ struct S {
 /* offset( 0) align(8) size(32) */   matrix : mat4x3<f16>;
 /* offset(32) align(8) size( 6) */   vector : vec3<f16>;
@@ -13,7 +13,7 @@
 struct S {
 ^^^^^^
 
-binary/mul/vec3-mat4x3/f16.wgsl:6:36 note: see declaration of variable
+expressions/binary/mul/vec3-mat4x3/f16.wgsl:6:36 note: see declaration of variable
 @group(0) @binding(0) var<uniform> data: S;
                                    ^^^^
 
diff --git a/test/tint/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.glsl b/test/tint/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.glsl
index 0cd32b8..26960f6 100644
--- a/test/tint/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.glsl
+++ b/test/tint/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.glsl
@@ -1,12 +1,7 @@
 #version 310 es
 precision mediump float;
 
-struct S {
-  mat4x3 matrix;
-  vec3 vector;
-};
-
-layout(binding = 0) uniform S_1 {
+layout(binding = 0) uniform S_ubo {
   mat4x3 matrix;
   vec3 vector;
 } data;
diff --git a/test/tint/expressions/swizzle/read/packed_vec3/f16.wgsl.expected.glsl b/test/tint/expressions/swizzle/read/packed_vec3/f16.wgsl.expected.glsl
index 77452b8..713d1a6 100644
--- a/test/tint/expressions/swizzle/read/packed_vec3/f16.wgsl.expected.glsl
+++ b/test/tint/expressions/swizzle/read/packed_vec3/f16.wgsl.expected.glsl
@@ -1,10 +1,10 @@
 SKIP: FAILED
 
-swizzle/read/packed_vec3/f16.wgsl:3:8 error: using f16 types in 'uniform' storage class is not implemented yet
+expressions/swizzle/read/packed_vec3/f16.wgsl:3:8 error: using f16 types in 'uniform' storage class is not implemented yet
     v: vec3<f16>,
        ^^^^^^^^^
 
-swizzle/read/packed_vec3/f16.wgsl:2:1 note: see layout of struct:
+expressions/swizzle/read/packed_vec3/f16.wgsl:2:1 note: see layout of struct:
 /*           align(8) size(8) */ struct S {
 /* offset(0) align(8) size(6) */   v : vec3<f16>;
 /* offset(6) align(1) size(2) */   // -- implicit struct size padding --;
@@ -12,7 +12,7 @@
 struct S {
 ^^^^^^
 
-swizzle/read/packed_vec3/f16.wgsl:6:36 note: see declaration of variable
+expressions/swizzle/read/packed_vec3/f16.wgsl:6:36 note: see declaration of variable
 @group(0) @binding(0) var<uniform> U : S;
                                    ^
 
diff --git a/test/tint/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.glsl b/test/tint/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.glsl
index f71e8a0..9f4cd7d 100644
--- a/test/tint/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.glsl
+++ b/test/tint/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.glsl
@@ -4,11 +4,7 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  vec3 v;
-};
-
-layout(binding = 0) uniform S_1 {
+layout(binding = 0) uniform S_ubo {
   vec3 v;
 } U;
 
diff --git a/test/tint/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.glsl b/test/tint/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.glsl
index fe7dd72..ce0631d 100644
--- a/test/tint/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.glsl
@@ -4,11 +4,7 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec3 v;
-};
-
-layout(binding = 0) uniform S_1 {
+layout(binding = 0) uniform S_ubo {
   ivec3 v;
 } U;
 
diff --git a/test/tint/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.glsl b/test/tint/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.glsl
index 7725962..435e001 100644
--- a/test/tint/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.glsl
+++ b/test/tint/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.glsl
@@ -4,11 +4,7 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  uvec3 v;
-};
-
-layout(binding = 0) uniform S_1 {
+layout(binding = 0) uniform S_ubo {
   uvec3 v;
 } U;
 
diff --git a/test/tint/expressions/swizzle/write/packed_vec3/f16.wgsl.expected.glsl b/test/tint/expressions/swizzle/write/packed_vec3/f16.wgsl.expected.glsl
index f7fb998..03372ef 100644
--- a/test/tint/expressions/swizzle/write/packed_vec3/f16.wgsl.expected.glsl
+++ b/test/tint/expressions/swizzle/write/packed_vec3/f16.wgsl.expected.glsl
@@ -1,10 +1,10 @@
 SKIP: FAILED
 
-swizzle/write/packed_vec3/f16.wgsl:3:8 error: using f16 types in 'storage' storage class is not implemented yet
+expressions/swizzle/write/packed_vec3/f16.wgsl:3:8 error: using f16 types in 'storage' storage class is not implemented yet
     v: vec3<f16>,
        ^^^^^^^^^
 
-swizzle/write/packed_vec3/f16.wgsl:2:1 note: see layout of struct:
+expressions/swizzle/write/packed_vec3/f16.wgsl:2:1 note: see layout of struct:
 /*           align(8) size(8) */ struct S {
 /* offset(0) align(8) size(6) */   v : vec3<f16>;
 /* offset(6) align(1) size(2) */   // -- implicit struct size padding --;
@@ -12,7 +12,7 @@
 struct S {
 ^^^^^^
 
-swizzle/write/packed_vec3/f16.wgsl:6:48 note: see declaration of variable
+expressions/swizzle/write/packed_vec3/f16.wgsl:6:48 note: see declaration of variable
 @group(0) @binding(0) var<storage, read_write> U : S;
                                                ^
 
diff --git a/test/tint/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.glsl b/test/tint/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.glsl
index b4cdda6..5bec520b 100644
--- a/test/tint/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.glsl
+++ b/test/tint/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  vec3 v;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   vec3 v;
 } U;
+
 void f() {
   U.v = vec3(1.0f, 2.0f, 3.0f);
   U.v.x = 1.0f;
diff --git a/test/tint/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.glsl b/test/tint/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.glsl
index bde8b4c..ab987b2 100644
--- a/test/tint/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.glsl
+++ b/test/tint/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec3 v;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec3 v;
 } U;
+
 void f() {
   U.v = ivec3(1, 2, 3);
   U.v.x = 1;
diff --git a/test/tint/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.glsl b/test/tint/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.glsl
index a5e6745..6481d65 100644
--- a/test/tint/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.glsl
+++ b/test/tint/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  uvec3 v;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   uvec3 v;
 } U;
+
 void f() {
   U.v = uvec3(1u, 2u, 3u);
   U.v.x = 1u;
diff --git a/test/tint/layout/storage/mat2x2/f32.wgsl.expected.glsl b/test/tint/layout/storage/mat2x2/f32.wgsl.expected.glsl
index 8f6ff79..0a32bed 100644
--- a/test/tint/layout/storage/mat2x2/f32.wgsl.expected.glsl
+++ b/test/tint/layout/storage/mat2x2/f32.wgsl.expected.glsl
@@ -1,12 +1,9 @@
 #version 310 es
 
-struct SSBO {
-  mat2 m;
-};
-
-layout(binding = 0, std430) buffer SSBO_1 {
+layout(binding = 0, std430) buffer SSBO_ssbo {
   mat2 m;
 } ssbo;
+
 void f() {
   mat2 v = ssbo.m;
   ssbo.m = v;
diff --git a/test/tint/layout/storage/mat2x2/stride/16.spvasm.expected.glsl b/test/tint/layout/storage/mat2x2/stride/16.spvasm.expected.glsl
index f6b03dc..b439134 100644
--- a/test/tint/layout/storage/mat2x2/stride/16.spvasm.expected.glsl
+++ b/test/tint/layout/storage/mat2x2/stride/16.spvasm.expected.glsl
@@ -4,13 +4,10 @@
   vec2 el;
 };
 
-struct SSBO {
-  strided_arr m[2];
-};
-
-layout(binding = 0, std430) buffer SSBO_1 {
+layout(binding = 0, std430) buffer SSBO_ssbo {
   strided_arr m[2];
 } ssbo;
+
 mat2 arr_to_mat2x2_stride_16(strided_arr arr[2]) {
   return mat2(arr[0u].el, arr[1u].el);
 }
diff --git a/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.glsl b/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.glsl
index bd0575d..2a20e0f 100644
--- a/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.glsl
+++ b/test/tint/ptr_ref/load/local/ptr_storage.wgsl.expected.glsl
@@ -1,12 +1,9 @@
 #version 310 es
 
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } v;
+
 void tint_symbol() {
   int u = (v.a + 1);
 }
diff --git a/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.glsl b/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.glsl
index 89067aa..b259bfb 100644
--- a/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.glsl
+++ b/test/tint/ptr_ref/load/local/ptr_uniform.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct S {
-  int a;
-};
-
-layout(binding = 0) uniform S_1 {
+layout(binding = 0) uniform S_ubo {
   int a;
 } v;
 
diff --git a/test/tint/samples/compute_boids.wgsl.expected.glsl b/test/tint/samples/compute_boids.wgsl.expected.glsl
index 6a110ff..408cf55 100644
--- a/test/tint/samples/compute_boids.wgsl.expected.glsl
+++ b/test/tint/samples/compute_boids.wgsl.expected.glsl
@@ -75,21 +75,7 @@
   vec2 vel;
 };
 
-struct SimParams {
-  float deltaT;
-  float rule1Distance;
-  float rule2Distance;
-  float rule3Distance;
-  float rule1Scale;
-  float rule2Scale;
-  float rule3Scale;
-};
-
-struct Particles {
-  Particle particles[5];
-};
-
-layout(binding = 0) uniform SimParams_1 {
+layout(binding = 0) uniform SimParams_ubo {
   float deltaT;
   float rule1Distance;
   float rule2Distance;
@@ -99,12 +85,14 @@
   float rule3Scale;
 } params;
 
-layout(binding = 1, std430) buffer Particles_1 {
+layout(binding = 1, std430) buffer Particles_ssbo {
   Particle particles[5];
 } particlesA;
-layout(binding = 2, std430) buffer Particles_2 {
+
+layout(binding = 2, std430) buffer Particles_ssbo_1 {
   Particle particles[5];
 } particlesB;
+
 void comp_main(uvec3 tint_symbol) {
   uint index = tint_symbol.x;
   if ((index >= 5u)) {
diff --git a/test/tint/samples/cube.wgsl.expected.glsl b/test/tint/samples/cube.wgsl.expected.glsl
index ff3748b..442e404 100644
--- a/test/tint/samples/cube.wgsl.expected.glsl
+++ b/test/tint/samples/cube.wgsl.expected.glsl
@@ -3,11 +3,7 @@
 layout(location = 0) in vec4 cur_position_1;
 layout(location = 1) in vec4 color_1;
 layout(location = 0) out vec4 vtxFragColor_1;
-struct Uniforms {
-  mat4 modelViewProjectionMatrix;
-};
-
-layout(binding = 0) uniform Uniforms_1 {
+layout(binding = 0) uniform Uniforms_ubo {
   mat4 modelViewProjectionMatrix;
 } uniforms;
 
diff --git a/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.glsl b/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.glsl
index 321e231..325570b 100644
--- a/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.glsl
+++ b/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 precision mediump float;
 
@@ -11,16 +9,15 @@
   vec4 v;
 };
 
-layout(binding = 0, std430) buffer S_1 {
-  float f;
-  uint u;
-  vec4 v;
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
+  S inner;
 } tint_symbol;
+
 void frag_main(S tint_symbol_1) {
   float f = tint_symbol_1.f;
   uint u = tint_symbol_1.u;
   vec4 v = tint_symbol_1.v;
-  tint_symbol = tint_symbol_1;
+  tint_symbol.inner = tint_symbol_1;
 }
 
 void main() {
@@ -28,10 +25,3 @@
   frag_main(tint_symbol_2);
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:21: 'assign' :  cannot convert from ' in structure{ global mediump float f,  global mediump uint u,  global mediump 4-component vector of float v}' to 'layout( binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer mediump float f, layout( column_major std430 offset=4) buffer mediump uint u, layout( column_major std430 offset=16) buffer mediump 4-component vector of float v}'
-ERROR: 0:21: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.spvasm b/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.spvasm
index e2748bd..ebec6c8 100644
--- a/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.spvasm
+++ b/test/tint/shader_io/shared_struct_storage_buffer.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 29
+; Bound: 33
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -10,6 +10,8 @@
                OpName %f_1 "f_1"
                OpName %u_1 "u_1"
                OpName %v_1 "v_1"
+               OpName %output_block "output_block"
+               OpMemberName %output_block 0 "inner"
                OpName %S "S"
                OpMemberName %S 0 "f"
                OpMemberName %S 1 "u"
@@ -22,7 +24,8 @@
                OpDecorate %u_1 Location 1
                OpDecorate %u_1 Flat
                OpDecorate %v_1 BuiltIn FragCoord
-               OpDecorate %S Block
+               OpDecorate %output_block Block
+               OpMemberDecorate %output_block 0 Offset 0
                OpMemberDecorate %S 0 Offset 0
                OpMemberDecorate %S 1 Offset 4
                OpMemberDecorate %S 2 Offset 128
@@ -38,26 +41,30 @@
 %_ptr_Input_v4float = OpTypePointer Input %v4float
         %v_1 = OpVariable %_ptr_Input_v4float Input
           %S = OpTypeStruct %float %uint %v4float
-%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
-     %output = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%output_block = OpTypeStruct %S
+%_ptr_StorageBuffer_output_block = OpTypePointer StorageBuffer %output_block
+     %output = OpVariable %_ptr_StorageBuffer_output_block StorageBuffer
        %void = OpTypeVoid
-         %13 = OpTypeFunction %void %S
-         %21 = OpTypeFunction %void
-%frag_main_inner = OpFunction %void None %13
+         %14 = OpTypeFunction %void %S
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+         %25 = OpTypeFunction %void
+%frag_main_inner = OpFunction %void None %14
       %input = OpFunctionParameter %S
-         %17 = OpLabel
-         %18 = OpCompositeExtract %float %input 0
-         %19 = OpCompositeExtract %uint %input 1
-         %20 = OpCompositeExtract %v4float %input 2
-               OpStore %output %input
+         %18 = OpLabel
+         %19 = OpCompositeExtract %float %input 0
+         %20 = OpCompositeExtract %uint %input 1
+         %21 = OpCompositeExtract %v4float %input 2
+         %24 = OpAccessChain %_ptr_StorageBuffer_S %output %uint_0
+               OpStore %24 %input
                OpReturn
                OpFunctionEnd
-  %frag_main = OpFunction %void None %21
-         %23 = OpLabel
-         %25 = OpLoad %float %f_1
-         %26 = OpLoad %uint %u_1
-         %27 = OpLoad %v4float %v_1
-         %28 = OpCompositeConstruct %S %25 %26 %27
-         %24 = OpFunctionCall %void %frag_main_inner %28
+  %frag_main = OpFunction %void None %25
+         %27 = OpLabel
+         %29 = OpLoad %float %f_1
+         %30 = OpLoad %uint %u_1
+         %31 = OpLoad %v4float %v_1
+         %32 = OpCompositeConstruct %S %29 %30 %31
+         %28 = OpFunctionCall %void %frag_main_inner %32
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.glsl
index eb95861..359938c 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.glsl
@@ -1,9 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct InnerS {
   int v;
 };
@@ -12,7 +8,7 @@
   InnerS a1[8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.glsl
index 9f5f5e6..9ef360b 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.glsl
@@ -1,9 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct InnerS {
   int v;
 };
@@ -12,7 +8,7 @@
   InnerS a1[8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.glsl
index c8afc86..49aff5d 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.glsl
@@ -1,9 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct InnerS {
   int v;
 };
@@ -12,7 +8,7 @@
   InnerS a1[8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.glsl
index 80072a8..4505b85 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.glsl
@@ -1,10 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
 struct InnerS {
   int v;
 };
@@ -23,7 +18,7 @@
   return nextIndex;
 }
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.glsl
index 404b14e..1b59df8 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.glsl
@@ -1,9 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct InnerS {
   int v;
 };
@@ -12,7 +8,7 @@
   InnerS a1[8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.glsl
index 9bb2f42..01c4ad2 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.glsl
@@ -1,10 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
 struct InnerS {
   int v;
 };
@@ -13,7 +8,7 @@
   InnerS a1[8][8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.glsl
index 5ce3d5d..af08fd8 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.glsl
@@ -1,9 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct InnerS {
   int v;
 };
@@ -16,7 +12,7 @@
   S1 a1[8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.glsl
index 5e12367..2951c8f 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.glsl
@@ -1,10 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
 struct InnerS {
   int v;
 };
@@ -17,7 +12,7 @@
   S1 a1[8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.glsl
index 6f4afcd..23b760d 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.glsl
@@ -1,20 +1,17 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct InnerS {
   int v;
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
-layout(binding = 0, std430) buffer OuterS_1 {
+layout(binding = 0, std430) buffer OuterS_ssbo {
   InnerS a1[];
 } s1;
+
 void tint_symbol() {
   InnerS v = InnerS(0);
   s1.a1[uniforms.i] = v;
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.glsl
index 10bd162..2416194 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.glsl
@@ -1,10 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-  uint j;
-};
-
 struct InnerS {
   int v;
 };
@@ -13,14 +8,15 @@
   InnerS a2[8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
   uint j;
 } uniforms;
 
-layout(binding = 0, std430) buffer OuterS_1 {
+layout(binding = 0, std430) buffer OuterS_ssbo {
   S1 a1[];
 } s;
+
 void tint_symbol() {
   InnerS v = InnerS(0);
   s.a1[uniforms.i].a2[uniforms.j] = v;
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.glsl
index 2cad6f6..9211926 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.glsl
@@ -1,14 +1,10 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct OuterS {
   mat2x4 m1;
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.glsl
index afb7d80..6334c1f 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.glsl
@@ -1,9 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct InnerS {
   int v;
 };
@@ -13,7 +9,7 @@
   InnerS a2[8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.glsl
index 00bb1bb..c33dcc4 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.glsl
@@ -1,9 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct InnerS {
   int v;
 };
@@ -16,7 +12,7 @@
   S1 s2;
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.glsl
index 87dad14..fb6df14 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.glsl
@@ -1,14 +1,10 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct OuterS {
   vec3 v1;
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.glsl
index c7f713e..35c1d85 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.glsl
@@ -1,14 +1,10 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct OuterS {
   uint a1[8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.glsl
index 8f46ee8..08a5f16 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.glsl
@@ -1,9 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct InnerS {
   int v;
 };
@@ -12,7 +8,7 @@
   InnerS a1[8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.glsl b/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.glsl
index addb30c..dd49ae7 100644
--- a/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.glsl
+++ b/test/tint/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.glsl
@@ -1,9 +1,5 @@
 #version 310 es
 
-struct Uniforms {
-  uint i;
-};
-
 struct InnerS {
   int v;
 };
@@ -12,7 +8,7 @@
   InnerS a1[8];
 };
 
-layout(binding = 4) uniform Uniforms_1 {
+layout(binding = 4) uniform Uniforms_ubo {
   uint i;
 } uniforms;
 
diff --git a/test/tint/statements/assign/phony/addr_of_non_constructable.wgsl.expected.glsl b/test/tint/statements/assign/phony/addr_of_non_constructable.wgsl.expected.glsl
index 4017ce7..765da01 100644
--- a/test/tint/statements/assign/phony/addr_of_non_constructable.wgsl.expected.glsl
+++ b/test/tint/statements/assign/phony/addr_of_non_constructable.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int arr[];
 } s;
+
 void tint_symbol() {
 }
 
diff --git a/test/tint/statements/assign/phony/addr_of_runtime_array.wgsl.expected.glsl b/test/tint/statements/assign/phony/addr_of_runtime_array.wgsl.expected.glsl
index 4017ce7..765da01 100644
--- a/test/tint/statements/assign/phony/addr_of_runtime_array.wgsl.expected.glsl
+++ b/test/tint/statements/assign/phony/addr_of_runtime_array.wgsl.expected.glsl
@@ -1,8 +1,9 @@
 #version 310 es
 
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int arr[];
 } s;
+
 void tint_symbol() {
 }
 
diff --git a/test/tint/statements/assign/phony/storage_buffer.wgsl.expected.glsl b/test/tint/statements/assign/phony/storage_buffer.wgsl.expected.glsl
index 521f510..be246a1 100644
--- a/test/tint/statements/assign/phony/storage_buffer.wgsl.expected.glsl
+++ b/test/tint/statements/assign/phony/storage_buffer.wgsl.expected.glsl
@@ -1,12 +1,9 @@
 #version 310 es
 
-struct S {
-  int i;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int i;
 } s;
+
 void tint_symbol() {
 }
 
diff --git a/test/tint/statements/assign/phony/uniform_buffer.wgsl.expected.glsl b/test/tint/statements/assign/phony/uniform_buffer.wgsl.expected.glsl
index 44dd6cd..15769ce 100644
--- a/test/tint/statements/assign/phony/uniform_buffer.wgsl.expected.glsl
+++ b/test/tint/statements/assign/phony/uniform_buffer.wgsl.expected.glsl
@@ -1,10 +1,6 @@
 #version 310 es
 
-struct S {
-  int i;
-};
-
-layout(binding = 0) uniform S_1 {
+layout(binding = 0) uniform S_ubo {
   int i;
 } u;
 
diff --git a/test/tint/statements/compound_assign/for_loop.wgsl.expected.glsl b/test/tint/statements/compound_assign/for_loop.wgsl.expected.glsl
index 6a42cd8..daad909 100644
--- a/test/tint/statements/compound_assign/for_loop.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/for_loop.wgsl.expected.glsl
@@ -4,17 +4,12 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  int a;
-  vec4 b;
-  mat2 c;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
   vec4 b;
   mat2 c;
 } v;
+
 uint i = 0u;
 int idx1() {
   i = (i + 1u);
diff --git a/test/tint/statements/compound_assign/matrix/minus.wgsl.expected.glsl b/test/tint/statements/compound_assign/matrix/minus.wgsl.expected.glsl
index bee2488..4bc4484 100644
--- a/test/tint/statements/compound_assign/matrix/minus.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/matrix/minus.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  mat4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   mat4 a;
 } v;
+
 void foo() {
   v.a = (v.a - mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)));
 }
diff --git a/test/tint/statements/compound_assign/matrix/plus.wgsl.expected.glsl b/test/tint/statements/compound_assign/matrix/plus.wgsl.expected.glsl
index 86dbf9b..2731dc5 100644
--- a/test/tint/statements/compound_assign/matrix/plus.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/matrix/plus.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  mat4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   mat4 a;
 } v;
+
 void foo() {
   v.a = (v.a + mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)));
 }
diff --git a/test/tint/statements/compound_assign/matrix/times-scalar.wgsl.expected.glsl b/test/tint/statements/compound_assign/matrix/times-scalar.wgsl.expected.glsl
index ee61689..6454531 100644
--- a/test/tint/statements/compound_assign/matrix/times-scalar.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/matrix/times-scalar.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  mat4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   mat4 a;
 } v;
+
 void foo() {
   v.a = (v.a * 2.0f);
 }
diff --git a/test/tint/statements/compound_assign/matrix/times.wgsl.expected.glsl b/test/tint/statements/compound_assign/matrix/times.wgsl.expected.glsl
index 4d224ea..d0cf2da 100644
--- a/test/tint/statements/compound_assign/matrix/times.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/matrix/times.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  mat4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   mat4 a;
 } v;
+
 void foo() {
   v.a = (v.a * mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)));
 }
diff --git a/test/tint/statements/compound_assign/scalar/and.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/and.wgsl.expected.glsl
index 1d7d94d..cf037cf 100644
--- a/test/tint/statements/compound_assign/scalar/and.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/and.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } v;
+
 void foo() {
   v.a = (v.a & 2);
 }
diff --git a/test/tint/statements/compound_assign/scalar/divide.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/divide.wgsl.expected.glsl
index 44ec9a9..da4bd07 100644
--- a/test/tint/statements/compound_assign/scalar/divide.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/divide.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } v;
+
 void foo() {
   v.a = (v.a / 2);
 }
diff --git a/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.glsl
index 4f4b5c9..78334e5 100644
--- a/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/minus.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } v;
+
 void foo() {
   v.a = (v.a - 2);
 }
diff --git a/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.glsl
index 03bed63..bee2c0d 100644
--- a/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/modulo.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } v;
+
 void foo() {
   v.a = (v.a % 2);
 }
diff --git a/test/tint/statements/compound_assign/scalar/or.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/or.wgsl.expected.glsl
index aa760e6..474cb2a 100644
--- a/test/tint/statements/compound_assign/scalar/or.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/or.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } v;
+
 void foo() {
   v.a = (v.a | 2);
 }
diff --git a/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.glsl
index ef8e7e9..fb89b16 100644
--- a/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/plus.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } v;
+
 void foo() {
   v.a = (v.a + 2);
 }
diff --git a/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.glsl
index 0d42f56..632e2d8 100644
--- a/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/shift_left.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } v;
+
 void foo() {
   v.a = (v.a << 2u);
 }
diff --git a/test/tint/statements/compound_assign/scalar/shift_right.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/shift_right.wgsl.expected.glsl
index c443ba0..3734f7b 100644
--- a/test/tint/statements/compound_assign/scalar/shift_right.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/shift_right.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } v;
+
 void foo() {
   v.a = (v.a >> 2u);
 }
diff --git a/test/tint/statements/compound_assign/scalar/times.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/times.wgsl.expected.glsl
index c588bcc..87692a2 100644
--- a/test/tint/statements/compound_assign/scalar/times.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/times.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } v;
+
 void foo() {
   v.a = (v.a * 2);
 }
diff --git a/test/tint/statements/compound_assign/scalar/xor.wgsl.expected.glsl b/test/tint/statements/compound_assign/scalar/xor.wgsl.expected.glsl
index d4f926b..4e25c10 100644
--- a/test/tint/statements/compound_assign/scalar/xor.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/scalar/xor.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  int a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   int a;
 } v;
+
 void foo() {
   v.a = (v.a ^ 2);
 }
diff --git a/test/tint/statements/compound_assign/vector/and.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/and.wgsl.expected.glsl
index b600392..35e6116 100644
--- a/test/tint/statements/compound_assign/vector/and.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/and.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec4 a;
 } v;
+
 void foo() {
   v.a = (v.a & ivec4(2));
 }
diff --git a/test/tint/statements/compound_assign/vector/divide-scalar.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/divide-scalar.wgsl.expected.glsl
index be28e43..418c57b 100644
--- a/test/tint/statements/compound_assign/vector/divide-scalar.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/divide-scalar.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  vec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   vec4 a;
 } v;
+
 void foo() {
   v.a = (v.a / 2.0f);
 }
diff --git a/test/tint/statements/compound_assign/vector/divide.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/divide.wgsl.expected.glsl
index 35bbadd..ffb013a 100644
--- a/test/tint/statements/compound_assign/vector/divide.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/divide.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec4 a;
 } v;
+
 void foo() {
   v.a = (v.a / ivec4(2));
 }
diff --git a/test/tint/statements/compound_assign/vector/minus-scalar.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/minus-scalar.wgsl.expected.glsl
index 7ed578a..90fae2d 100644
--- a/test/tint/statements/compound_assign/vector/minus-scalar.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/minus-scalar.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  vec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   vec4 a;
 } v;
+
 void foo() {
   v.a = (v.a - 2.0f);
 }
diff --git a/test/tint/statements/compound_assign/vector/minus.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/minus.wgsl.expected.glsl
index e260139..4a40bac 100644
--- a/test/tint/statements/compound_assign/vector/minus.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/minus.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec4 a;
 } v;
+
 void foo() {
   v.a = (v.a - ivec4(2));
 }
diff --git a/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.glsl
index 6e7ee01..ded8188 100644
--- a/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/modulo-scalar.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec4 a;
 } v;
+
 void foo() {
   v.a = (v.a % 2);
 }
diff --git a/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.glsl
index 85ab141..5e9d6ac 100644
--- a/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/modulo.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec4 a;
 } v;
+
 void foo() {
   v.a = (v.a % ivec4(2));
 }
diff --git a/test/tint/statements/compound_assign/vector/or.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/or.wgsl.expected.glsl
index ae695a1..83eda7c 100644
--- a/test/tint/statements/compound_assign/vector/or.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/or.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec4 a;
 } v;
+
 void foo() {
   v.a = (v.a | ivec4(2));
 }
diff --git a/test/tint/statements/compound_assign/vector/plus-scalar.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/plus-scalar.wgsl.expected.glsl
index 43c8ae5..ce64d6f 100644
--- a/test/tint/statements/compound_assign/vector/plus-scalar.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/plus-scalar.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  vec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   vec4 a;
 } v;
+
 void foo() {
   v.a = (v.a + 2.0f);
 }
diff --git a/test/tint/statements/compound_assign/vector/plus.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/plus.wgsl.expected.glsl
index 05b68e4..7860e8d 100644
--- a/test/tint/statements/compound_assign/vector/plus.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/plus.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec4 a;
 } v;
+
 void foo() {
   v.a = (v.a + ivec4(2));
 }
diff --git a/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.glsl
index 4a53ae3..003db48 100644
--- a/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/shift_left.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec4 a;
 } v;
+
 void foo() {
   v.a = (v.a << uvec4(2u));
 }
diff --git a/test/tint/statements/compound_assign/vector/shift_right.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/shift_right.wgsl.expected.glsl
index 51bb554..ce65ca7 100644
--- a/test/tint/statements/compound_assign/vector/shift_right.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/shift_right.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec4 a;
 } v;
+
 void foo() {
   v.a = (v.a >> uvec4(2u));
 }
diff --git a/test/tint/statements/compound_assign/vector/times-matrix.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/times-matrix.wgsl.expected.glsl
index ee226d2..5063090 100644
--- a/test/tint/statements/compound_assign/vector/times-matrix.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/times-matrix.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  vec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   vec4 a;
 } v;
+
 void foo() {
   v.a = (v.a * mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)));
 }
diff --git a/test/tint/statements/compound_assign/vector/times-scalar.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/times-scalar.wgsl.expected.glsl
index e40bb86..7e46389 100644
--- a/test/tint/statements/compound_assign/vector/times-scalar.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/times-scalar.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  vec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   vec4 a;
 } v;
+
 void foo() {
   v.a = (v.a * 2.0f);
 }
diff --git a/test/tint/statements/compound_assign/vector/times.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/times.wgsl.expected.glsl
index b22e63b..6961897 100644
--- a/test/tint/statements/compound_assign/vector/times.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/times.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec4 a;
 } v;
+
 void foo() {
   v.a = (v.a * ivec4(2));
 }
diff --git a/test/tint/statements/compound_assign/vector/xor.wgsl.expected.glsl b/test/tint/statements/compound_assign/vector/xor.wgsl.expected.glsl
index d06e06c..7a74217 100644
--- a/test/tint/statements/compound_assign/vector/xor.wgsl.expected.glsl
+++ b/test/tint/statements/compound_assign/vector/xor.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct S {
-  ivec4 a;
-};
-
-layout(binding = 0, std430) buffer S_1 {
+layout(binding = 0, std430) buffer S_ssbo {
   ivec4 a;
 } v;
+
 void foo() {
   v.a = (v.a ^ ivec4(2));
 }
diff --git a/test/tint/statements/decrement/array_element.wgsl.expected.glsl b/test/tint/statements/decrement/array_element.wgsl.expected.glsl
index 74f7390..4c9aa9c 100644
--- a/test/tint/statements/decrement/array_element.wgsl.expected.glsl
+++ b/test/tint/statements/decrement/array_element.wgsl.expected.glsl
@@ -4,9 +4,10 @@
 void unused_entry_point() {
   return;
 }
-layout(binding = 0, std430) buffer a_block_1 {
+layout(binding = 0, std430) buffer a_block_ssbo {
   uint inner[];
 } a;
+
 void tint_symbol() {
   a.inner[1] = (a.inner[1] - 1u);
 }
diff --git a/test/tint/statements/decrement/complex.wgsl.expected.glsl b/test/tint/statements/decrement/complex.wgsl.expected.glsl
index a04fd4e..e98dc1e 100644
--- a/test/tint/statements/decrement/complex.wgsl.expected.glsl
+++ b/test/tint/statements/decrement/complex.wgsl.expected.glsl
@@ -8,9 +8,10 @@
   ivec4 a[4];
 };
 
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   S inner[];
 } tint_symbol;
+
 uint v = 0u;
 int idx1() {
   v = (v - 1u);
diff --git a/test/tint/statements/decrement/for_loop_continuing.wgsl.expected.glsl b/test/tint/statements/decrement/for_loop_continuing.wgsl.expected.glsl
index 21a7950..5c48d8f 100644
--- a/test/tint/statements/decrement/for_loop_continuing.wgsl.expected.glsl
+++ b/test/tint/statements/decrement/for_loop_continuing.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct i_block {
-  uint inner;
-};
-
-layout(binding = 0, std430) buffer i_block_1 {
+layout(binding = 0, std430) buffer i_block_ssbo {
   uint inner;
 } i;
+
 void tint_symbol() {
   {
     for(; (i.inner < 10u); i.inner = (i.inner - 1u)) {
diff --git a/test/tint/statements/decrement/for_loop_initializer.wgsl.expected.glsl b/test/tint/statements/decrement/for_loop_initializer.wgsl.expected.glsl
index 12ce515..c0f6fbf 100644
--- a/test/tint/statements/decrement/for_loop_initializer.wgsl.expected.glsl
+++ b/test/tint/statements/decrement/for_loop_initializer.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct i_block {
-  uint inner;
-};
-
-layout(binding = 0, std430) buffer i_block_1 {
+layout(binding = 0, std430) buffer i_block_ssbo {
   uint inner;
 } i;
+
 void tint_symbol() {
   {
     for(i.inner = (i.inner - 1u); (i.inner < 10u); ) {
diff --git a/test/tint/statements/decrement/storage.wgsl.expected.glsl b/test/tint/statements/decrement/storage.wgsl.expected.glsl
index 88579d1..a9833d7 100644
--- a/test/tint/statements/decrement/storage.wgsl.expected.glsl
+++ b/test/tint/statements/decrement/storage.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct i_block {
-  uint inner;
-};
-
-layout(binding = 0, std430) buffer i_block_1 {
+layout(binding = 0, std430) buffer i_block_ssbo {
   uint inner;
 } i;
+
 void tint_symbol() {
   i.inner = (i.inner - 1u);
 }
diff --git a/test/tint/statements/decrement/vector_component.wgsl.expected.glsl b/test/tint/statements/decrement/vector_component.wgsl.expected.glsl
index 908643e..38bf1e1 100644
--- a/test/tint/statements/decrement/vector_component.wgsl.expected.glsl
+++ b/test/tint/statements/decrement/vector_component.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct a_block {
-  uvec4 inner;
-};
-
-layout(binding = 0, std430) buffer a_block_1 {
+layout(binding = 0, std430) buffer a_block_ssbo {
   uvec4 inner;
 } a;
+
 void tint_symbol() {
   int tint_symbol_2 = 1;
   a.inner[tint_symbol_2] = (a.inner[tint_symbol_2] - 1u);
diff --git a/test/tint/statements/increment/array_element.wgsl.expected.glsl b/test/tint/statements/increment/array_element.wgsl.expected.glsl
index 8c4b54b..d5b11d4 100644
--- a/test/tint/statements/increment/array_element.wgsl.expected.glsl
+++ b/test/tint/statements/increment/array_element.wgsl.expected.glsl
@@ -4,9 +4,10 @@
 void unused_entry_point() {
   return;
 }
-layout(binding = 0, std430) buffer a_block_1 {
+layout(binding = 0, std430) buffer a_block_ssbo {
   uint inner[];
 } a;
+
 void tint_symbol() {
   a.inner[1] = (a.inner[1] + 1u);
 }
diff --git a/test/tint/statements/increment/complex.wgsl.expected.glsl b/test/tint/statements/increment/complex.wgsl.expected.glsl
index 26c1c10..ba161e5 100644
--- a/test/tint/statements/increment/complex.wgsl.expected.glsl
+++ b/test/tint/statements/increment/complex.wgsl.expected.glsl
@@ -8,9 +8,10 @@
   ivec4 a[4];
 };
 
-layout(binding = 0, std430) buffer tint_symbol_block_1 {
+layout(binding = 0, std430) buffer tint_symbol_block_ssbo {
   S inner[];
 } tint_symbol;
+
 uint v = 0u;
 int idx1() {
   v = (v + 1u);
diff --git a/test/tint/statements/increment/for_loop_continuing.wgsl.expected.glsl b/test/tint/statements/increment/for_loop_continuing.wgsl.expected.glsl
index 50eb494..ee11178 100644
--- a/test/tint/statements/increment/for_loop_continuing.wgsl.expected.glsl
+++ b/test/tint/statements/increment/for_loop_continuing.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct i_block {
-  uint inner;
-};
-
-layout(binding = 0, std430) buffer i_block_1 {
+layout(binding = 0, std430) buffer i_block_ssbo {
   uint inner;
 } i;
+
 void tint_symbol() {
   {
     for(; (i.inner < 10u); i.inner = (i.inner + 1u)) {
diff --git a/test/tint/statements/increment/for_loop_initializer.wgsl.expected.glsl b/test/tint/statements/increment/for_loop_initializer.wgsl.expected.glsl
index 77942ca..b4e940b 100644
--- a/test/tint/statements/increment/for_loop_initializer.wgsl.expected.glsl
+++ b/test/tint/statements/increment/for_loop_initializer.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct i_block {
-  uint inner;
-};
-
-layout(binding = 0, std430) buffer i_block_1 {
+layout(binding = 0, std430) buffer i_block_ssbo {
   uint inner;
 } i;
+
 void tint_symbol() {
   {
     for(i.inner = (i.inner + 1u); (i.inner < 10u); ) {
diff --git a/test/tint/statements/increment/storage.wgsl.expected.glsl b/test/tint/statements/increment/storage.wgsl.expected.glsl
index 3a8266d..5dc6ea6 100644
--- a/test/tint/statements/increment/storage.wgsl.expected.glsl
+++ b/test/tint/statements/increment/storage.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct i_block {
-  uint inner;
-};
-
-layout(binding = 0, std430) buffer i_block_1 {
+layout(binding = 0, std430) buffer i_block_ssbo {
   uint inner;
 } i;
+
 void tint_symbol() {
   i.inner = (i.inner + 1u);
 }
diff --git a/test/tint/statements/increment/vector_component.wgsl.expected.glsl b/test/tint/statements/increment/vector_component.wgsl.expected.glsl
index a502a86..c66efba 100644
--- a/test/tint/statements/increment/vector_component.wgsl.expected.glsl
+++ b/test/tint/statements/increment/vector_component.wgsl.expected.glsl
@@ -4,13 +4,10 @@
 void unused_entry_point() {
   return;
 }
-struct a_block {
-  uvec4 inner;
-};
-
-layout(binding = 0, std430) buffer a_block_1 {
+layout(binding = 0, std430) buffer a_block_ssbo {
   uvec4 inner;
 } a;
+
 void tint_symbol() {
   int tint_symbol_2 = 1;
   a.inner[tint_symbol_2] = (a.inner[tint_symbol_2] + 1u);
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.glsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.glsl
index e7e10ee..cca5043 100644
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.glsl
+++ b/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.glsl
@@ -8,23 +8,15 @@
   float el;
 };
 
-struct buf1 {
-  strided_arr x_GLF_uniform_float_values[3];
-};
-
 struct strided_arr_1 {
   int el;
 };
 
-struct buf0 {
-  strided_arr_1 x_GLF_uniform_int_values[4];
-};
-
-layout(binding = 1) uniform buf1_1 {
+layout(binding = 1) uniform buf1_ubo {
   strided_arr x_GLF_uniform_float_values[3];
 } x_6;
 
-layout(binding = 0) uniform buf0_1 {
+layout(binding = 0) uniform buf0_ubo {
   strided_arr_1 x_GLF_uniform_int_values[4];
 } x_8;
 
@@ -115,9 +107,9 @@
   return;
 }
 Error parsing GLSL shader:
-ERROR: 0:77: '[' :  matrix index out of range '4'
-ERROR: 0:77: '=' :  cannot convert from ' temp mediump 3-component vector of float' to ' temp mediump float'
-ERROR: 0:77: '' : compilation terminated 
+ERROR: 0:69: '[' :  matrix index out of range '4'
+ERROR: 0:69: '=' :  cannot convert from ' temp mediump 3-component vector of float' to ' temp mediump float'
+ERROR: 0:69: '' : compilation terminated
 ERROR: 3 compilation errors.  No code generated.
 
 
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.glsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.glsl
index e7e10ee..cca5043 100644
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.glsl
+++ b/test/tint/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.glsl
@@ -8,23 +8,15 @@
   float el;
 };
 
-struct buf1 {
-  strided_arr x_GLF_uniform_float_values[3];
-};
-
 struct strided_arr_1 {
   int el;
 };
 
-struct buf0 {
-  strided_arr_1 x_GLF_uniform_int_values[4];
-};
-
-layout(binding = 1) uniform buf1_1 {
+layout(binding = 1) uniform buf1_ubo {
   strided_arr x_GLF_uniform_float_values[3];
 } x_6;
 
-layout(binding = 0) uniform buf0_1 {
+layout(binding = 0) uniform buf0_ubo {
   strided_arr_1 x_GLF_uniform_int_values[4];
 } x_8;
 
@@ -115,9 +107,9 @@
   return;
 }
 Error parsing GLSL shader:
-ERROR: 0:77: '[' :  matrix index out of range '4'
-ERROR: 0:77: '=' :  cannot convert from ' temp mediump 3-component vector of float' to ' temp mediump float'
-ERROR: 0:77: '' : compilation terminated 
+ERROR: 0:69: '[' :  matrix index out of range '4'
+ERROR: 0:69: '=' :  cannot convert from ' temp mediump 3-component vector of float' to ' temp mediump float'
+ERROR: 0:69: '' : compilation terminated
 ERROR: 3 compilation errors.  No code generated.
 
 
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.glsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.glsl
index cfdb6b1..76ec7b3 100644
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.glsl
+++ b/test/tint/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.glsl
@@ -8,23 +8,15 @@
   float el;
 };
 
-struct buf1 {
-  strided_arr x_GLF_uniform_float_values[2];
-};
-
 struct strided_arr_1 {
   int el;
 };
 
-struct buf0 {
-  strided_arr_1 x_GLF_uniform_int_values[3];
-};
-
-layout(binding = 1) uniform buf1_1 {
+layout(binding = 1) uniform buf1_ubo {
   strided_arr x_GLF_uniform_float_values[2];
 } x_6;
 
-layout(binding = 0) uniform buf0_1 {
+layout(binding = 0) uniform buf0_ubo {
   strided_arr_1 x_GLF_uniform_int_values[3];
 } x_8;
 
@@ -83,8 +75,8 @@
   return;
 }
 Error parsing GLSL shader:
-ERROR: 0:38: '[' :  matrix index out of range '3'
-ERROR: 0:38: '' : compilation terminated 
+ERROR: 0:30: '[' :  matrix index out of range '3'
+ERROR: 0:30: '' : compilation terminated
 ERROR: 2 compilation errors.  No code generated.
 
 
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.glsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.glsl
index cfdb6b1..76ec7b3 100644
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.glsl
+++ b/test/tint/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.glsl
@@ -8,23 +8,15 @@
   float el;
 };
 
-struct buf1 {
-  strided_arr x_GLF_uniform_float_values[2];
-};
-
 struct strided_arr_1 {
   int el;
 };
 
-struct buf0 {
-  strided_arr_1 x_GLF_uniform_int_values[3];
-};
-
-layout(binding = 1) uniform buf1_1 {
+layout(binding = 1) uniform buf1_ubo {
   strided_arr x_GLF_uniform_float_values[2];
 } x_6;
 
-layout(binding = 0) uniform buf0_1 {
+layout(binding = 0) uniform buf0_ubo {
   strided_arr_1 x_GLF_uniform_int_values[3];
 } x_8;
 
@@ -83,8 +75,8 @@
   return;
 }
 Error parsing GLSL shader:
-ERROR: 0:38: '[' :  matrix index out of range '3'
-ERROR: 0:38: '' : compilation terminated 
+ERROR: 0:30: '[' :  matrix index out of range '3'
+ERROR: 0:30: '' : compilation terminated
 ERROR: 2 compilation errors.  No code generated.