Fix storage buffer structs, test output.

Bug: tint:1223
Change-Id: Idbf8f882f44a7bc3dc51bd046d48da3b78a609e2
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/66362
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Stephen White <senorblanco@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/writer/glsl/generator_impl.cc b/src/writer/glsl/generator_impl.cc
index c5a8aa0..b7a79c4 100644
--- a/src/writer/glsl/generator_impl.cc
+++ b/src/writer/glsl/generator_impl.cc
@@ -2290,12 +2290,6 @@
     const sem::Type* base_type = ary;
     std::vector<uint32_t> sizes;
     while (auto* arr = base_type->As<sem::Array>()) {
-      if (arr->IsRuntimeSized()) {
-        TINT_ICE(Writer, diagnostics_)
-            << "Runtime arrays may only exist in storage buffers, which should "
-               "have been transformed into a ByteAddressBuffer";
-        return false;
-      }
       sizes.push_back(arr->Count());
       base_type = arr->ElemType();
     }
@@ -2449,14 +2443,6 @@
 
 bool GeneratorImpl::EmitStructType(TextBuffer* b, const sem::Struct* str) {
   auto storage_class_uses = str->StorageClassUsage();
-  if (storage_class_uses.size() ==
-      (storage_class_uses.count(ast::StorageClass::kStorage))) {
-    // The only use of the structure is as a storage buffer.
-    // Structures used as storage buffer are read and written to via a
-    // ByteAddressBuffer instead of true structure.
-    return true;
-  }
-
   line(b) << "struct " << StructName(str) << " {";
   {
     ScopedIndent si(b);
@@ -2471,14 +2457,7 @@
 
       if (auto* decl = mem->Declaration()) {
         for (auto* deco : decl->decorations) {
-          if (deco->As<ast::LocationDecoration>()) {
-            auto& pipeline_stage_uses = str->PipelineStageUses();
-            if (pipeline_stage_uses.size() != 1) {
-              TINT_ICE(Writer, diagnostics_)
-                  << "invalid entry point IO struct uses";
-            }
-          } else if (auto* interpolate =
-                         deco->As<ast::InterpolateDecoration>()) {
+          if (auto* interpolate = deco->As<ast::InterpolateDecoration>()) {
             auto mod = interpolation_to_modifiers(interpolate->type,
                                                   interpolate->sampling);
             if (mod.empty()) {
diff --git a/src/writer/glsl/generator_impl_function_test.cc b/src/writer/glsl/generator_impl_function_test.cc
index 51c3cd6..6f36da4 100644
--- a/src/writer/glsl/generator_impl_function_test.cc
+++ b/src/writer/glsl/generator_impl_function_test.cc
@@ -536,6 +536,10 @@
   EXPECT_EQ(gen.result(), R"(#version 310 es
 precision mediump float;
 
+struct Data {
+  int a;
+  float b;
+};
 
 Data coord;
 
@@ -585,6 +589,10 @@
             R"(#version 310 es
 precision mediump float;
 
+struct Data {
+  int a;
+  float b;
+};
 
 Data coord;
 
@@ -630,6 +638,10 @@
   EXPECT_EQ(gen.result(), R"(#version 310 es
 precision mediump float;
 
+struct Data {
+  int a;
+  float b;
+};
 
 Data coord;
 
@@ -676,6 +688,10 @@
   EXPECT_EQ(gen.result(), R"(#version 310 es
 precision mediump float;
 
+struct Data {
+  int a;
+  float b;
+};
 
 Data coord;
 
@@ -781,6 +797,9 @@
             R"(#version 310 es
 precision mediump float;
 
+struct S {
+  float x;
+};
 
 S coord;
 
@@ -1046,6 +1065,9 @@
   EXPECT_EQ(gen.result(), R"(#version 310 es
 precision mediump float;
 
+struct Data {
+  float d;
+};
 
 Data data;
 
diff --git a/src/writer/glsl/generator_impl_member_accessor_test.cc b/src/writer/glsl/generator_impl_member_accessor_test.cc
index 9d19353..a7c0925 100644
--- a/src/writer/glsl/generator_impl_member_accessor_test.cc
+++ b/src/writer/glsl/generator_impl_member_accessor_test.cc
@@ -296,6 +296,10 @@
       R"(#version 310 es
 precision mediump float;
 
+struct Data {
+  int a;
+  mat2x3 b;
+};
 
 Data data;
 
@@ -339,6 +343,10 @@
       R"(#version 310 es
 precision mediump float;
 
+struct Data {
+  float z;
+  mat4x3 a;
+};
 
 Data data;
 
@@ -380,6 +388,10 @@
       R"(#version 310 es
 precision mediump float;
 
+struct Data {
+  float z;
+  int a[5];
+};
 
 Data data;
 
@@ -422,6 +434,10 @@
       R"(#version 310 es
 precision mediump float;
 
+struct Data {
+  float z;
+  int a[5];
+};
 
 Data data;
 
@@ -461,6 +477,10 @@
       R"(#version 310 es
 precision mediump float;
 
+struct Data {
+  float z;
+  int a[5];
+};
 
 Data data;
 
@@ -511,6 +531,13 @@
       R"(#version 310 es
 precision mediump float;
 
+struct Inner {
+  vec3 a;
+  vec3 b;
+};
+struct Data {
+  Inner c[4];
+};
 
 Data data;
 
@@ -564,6 +591,13 @@
       R"(#version 310 es
 precision mediump float;
 
+struct Inner {
+  vec3 a;
+  vec3 b;
+};
+struct Data {
+  Inner c[4];
+};
 
 Data data;
 
@@ -617,6 +651,13 @@
       R"(#version 310 es
 precision mediump float;
 
+struct Inner {
+  vec3 a;
+  vec3 b;
+};
+struct Data {
+  Inner c[4];
+};
 
 Data data;
 
@@ -670,6 +711,13 @@
       R"(#version 310 es
 precision mediump float;
 
+struct Inner {
+  vec3 a;
+  vec3 b;
+};
+struct Data {
+  Inner c[4];
+};
 
 Data data;
 
@@ -719,6 +767,13 @@
       R"(#version 310 es
 precision mediump float;
 
+struct Inner {
+  vec3 a;
+  vec3 b;
+};
+struct Data {
+  Inner c[4];
+};
 
 Data data;
 
@@ -772,6 +827,13 @@
       R"(#version 310 es
 precision mediump float;
 
+struct Inner {
+  ivec3 a;
+  vec3 b;
+};
+struct Data {
+  Inner c[4];
+};
 
 Data data;
 
diff --git a/src/writer/glsl/generator_impl_sanitizer_test.cc b/src/writer/glsl/generator_impl_sanitizer_test.cc
index d35ac15..3af3ae5 100644
--- a/src/writer/glsl/generator_impl_sanitizer_test.cc
+++ b/src/writer/glsl/generator_impl_sanitizer_test.cc
@@ -51,6 +51,9 @@
   auto* expect = R"(#version 310 es
 precision mediump float;
 
+struct my_struct {
+  float a[0];
+};
 
 my_struct b;
 
@@ -100,6 +103,10 @@
   auto* expect = R"(#version 310 es
 precision mediump float;
 
+struct my_struct {
+  float z;
+  float a[0];
+};
 
 my_struct b;
 
@@ -151,6 +158,9 @@
   auto* expect = R"(#version 310 es
 precision mediump float;
 
+struct my_struct {
+  float a[0];
+};
 
 my_struct b;
 
diff --git a/src/writer/glsl/generator_impl_type_test.cc b/src/writer/glsl/generator_impl_type_test.cc
index 7bdb286..2481f6f 100644
--- a/src/writer/glsl/generator_impl_type_test.cc
+++ b/src/writer/glsl/generator_impl_type_test.cc
@@ -183,27 +183,6 @@
 )");
 }
 
-TEST_F(GlslGeneratorImplTest_Type, EmitType_StructDecl_OmittedIfStorageBuffer) {
-  auto* s = Structure("S",
-                      {
-                          Member("a", ty.i32()),
-                          Member("b", ty.f32()),
-                      },
-                      {create<ast::StructBlockDecoration>()});
-  Global("g", ty.Of(s), ast::StorageClass::kStorage, ast::Access::kReadWrite,
-         ast::DecorationList{
-             create<ast::BindingDecoration>(0),
-             create<ast::GroupDecoration>(0),
-         });
-
-  GeneratorImpl& gen = Build();
-
-  TextGenerator::TextBuffer buf;
-  auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
-  ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
-  EXPECT_EQ(buf.String(), "");
-}
-
 TEST_F(GlslGeneratorImplTest_Type, EmitType_Struct) {
   auto* s = Structure("S", {
                                Member("a", ty.i32()),