glsl: Don't emit structs with runtime-sized arrays

The GLSL emitted for these was invalid, and we don't need these
structs since they're only used as the store types of buffers, which
are handled elsewhere.

Change-Id: I17c15e408b5c36e9b895e5950528a6d02d1802a6
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/72381
Reviewed-by: Stephen White <senorblanco@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/writer/glsl/generator_impl.cc b/src/writer/glsl/generator_impl.cc
index c021420..8e2cc8e 100644
--- a/src/writer/glsl/generator_impl.cc
+++ b/src/writer/glsl/generator_impl.cc
@@ -123,8 +123,18 @@
         return false;
       }
     } else if (auto* str = decl->As<ast::Struct>()) {
-      if (!EmitStructType(current_buffer_, builder_.Sem().Get(str))) {
-        return false;
+      // 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.
+      TINT_ASSERT(Writer, str->members.size() > 0);
+      auto* last_member = str->members[str->members.size() - 1];
+      auto* arr = last_member->type->As<ast::Array>();
+      if (!arr || !arr->IsRuntimeArray()) {
+        if (!EmitStructType(current_buffer_, builder_.Sem().Get(str))) {
+          return false;
+        }
       }
     } else if (auto* func = decl->As<ast::Function>()) {
       if (func->IsEntryPoint()) {
diff --git a/src/writer/glsl/generator_impl_sanitizer_test.cc b/src/writer/glsl/generator_impl_sanitizer_test.cc
index c7be764..8d5fdb2 100644
--- a/src/writer/glsl/generator_impl_sanitizer_test.cc
+++ b/src/writer/glsl/generator_impl_sanitizer_test.cc
@@ -51,9 +51,6 @@
   auto* expect = R"(#version 310 es
 precision mediump float;
 
-struct my_struct {
-  float a[];
-};
 
 layout (binding = 1) buffer my_struct_1 {
   float a[];
@@ -105,10 +102,6 @@
   auto* expect = R"(#version 310 es
 precision mediump float;
 
-struct my_struct {
-  float z;
-  float a[];
-};
 
 layout (binding = 1) buffer my_struct_1 {
   float z;
@@ -163,9 +156,6 @@
   auto* expect = R"(#version 310 es
 precision mediump float;
 
-struct my_struct {
-  float a[];
-};
 
 layout (binding = 1) buffer my_struct_1 {
   float a[];
diff --git a/test/bug/tint/1113.wgsl.expected.glsl b/test/bug/tint/1113.wgsl.expected.glsl
index 07877d9..b27604e 100644
--- a/test/bug/tint/1113.wgsl.expected.glsl
+++ b/test/bug/tint/1113.wgsl.expected.glsl
@@ -1,6 +1,28 @@
 #version 310 es
 precision mediump float;
 
+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 {
   uint numTriangles;
@@ -118,6 +140,28 @@
 #version 310 es
 precision mediump float;
 
+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 {
   uint numTriangles;
@@ -204,6 +248,28 @@
 #version 310 es
 precision mediump float;
 
+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 {
   uint numTriangles;
diff --git a/test/bug/tint/1121.wgsl.expected.glsl b/test/bug/tint/1121.wgsl.expected.glsl
index fbdcc64..880f6a2 100644
--- a/test/bug/tint/1121.wgsl.expected.glsl
+++ b/test/bug/tint/1121.wgsl.expected.glsl
@@ -15,11 +15,23 @@
   uint count;
   uint lightId[64];
 };
+struct Tiles {
+  TileLightIdData data[4];
+};
 
 layout (binding = 0) buffer Tiles_1 {
   TileLightIdData data[4];
 } tileLightId;
 
+struct Config {
+  uint numLights;
+  uint numTiles;
+  uint tileCountX;
+  uint tileCountY;
+  uint numTileLightSlot;
+  uint tileSize;
+};
+
 layout (binding = 0) uniform Config_1 {
   uint numLights;
   uint numTiles;
@@ -29,6 +41,14 @@
   uint tileSize;
 } config;
 
+struct Uniforms {
+  vec4 tint_symbol;
+  vec4 tint_symbol_1;
+  mat4 viewMatrix;
+  mat4 projectionMatrix;
+  vec4 fullScreenSize;
+};
+
 layout (binding = 0) uniform Uniforms_1 {
   vec4 tint_symbol;
   vec4 tint_symbol_1;
diff --git a/test/bug/tint/534.wgsl.expected.glsl b/test/bug/tint/534.wgsl.expected.glsl
index 6a80ad6..44c9721 100644
--- a/test/bug/tint/534.wgsl.expected.glsl
+++ b/test/bug/tint/534.wgsl.expected.glsl
@@ -1,6 +1,12 @@
 #version 310 es
 precision mediump float;
 
+struct Uniforms {
+  uint dstTextureFlipY;
+  uint isFloat16;
+  uint isRGB10A2Unorm;
+  uint channelCount;
+};
 
 uniform highp sampler2D src;
 uniform highp sampler2D dst;
diff --git a/test/bug/tint/744.wgsl.expected.glsl b/test/bug/tint/744.wgsl.expected.glsl
index e8890c4..d79301c 100644
--- a/test/bug/tint/744.wgsl.expected.glsl
+++ b/test/bug/tint/744.wgsl.expected.glsl
@@ -1,6 +1,11 @@
 #version 310 es
 precision mediump float;
 
+struct Uniforms {
+  uvec2 aShape;
+  uvec2 bShape;
+  uvec2 outShape;
+};
 
 layout (binding = 0) buffer Matrix_1 {
   uint numbers[];
diff --git a/test/bug/tint/757.wgsl.expected.glsl b/test/bug/tint/757.wgsl.expected.glsl
index b1f5845..33da240 100644
--- a/test/bug/tint/757.wgsl.expected.glsl
+++ b/test/bug/tint/757.wgsl.expected.glsl
@@ -1,6 +1,9 @@
 #version 310 es
 precision mediump float;
 
+struct Constants {
+  int level;
+};
 
 uniform highp sampler2DArray myTexture;
 
diff --git a/test/bug/tint/913.wgsl.expected.glsl b/test/bug/tint/913.wgsl.expected.glsl
index 76e16ae..d70e652 100644
--- a/test/bug/tint/913.wgsl.expected.glsl
+++ b/test/bug/tint/913.wgsl.expected.glsl
@@ -1,6 +1,13 @@
 #version 310 es
 precision mediump float;
 
+struct Uniforms {
+  uint dstTextureFlipY;
+  uint channelCount;
+  uvec2 srcCopyOrigin;
+  uvec2 dstCopyOrigin;
+  uvec2 copySize;
+};
 
 uniform highp sampler2D src;
 uniform highp sampler2D dst;
diff --git a/test/bug/tint/914.wgsl.expected.glsl b/test/bug/tint/914.wgsl.expected.glsl
index 951dea5..4ca2f35 100644
--- a/test/bug/tint/914.wgsl.expected.glsl
+++ b/test/bug/tint/914.wgsl.expected.glsl
@@ -1,6 +1,11 @@
 #version 310 es
 precision mediump float;
 
+struct Uniforms {
+  uint dimAOuter;
+  uint dimInner;
+  uint dimBOuter;
+};
 
 layout (binding = 0) buffer Matrix_1 {
   float numbers[];
diff --git a/test/intrinsics/ignore/runtime_array.wgsl.expected.glsl b/test/intrinsics/ignore/runtime_array.wgsl.expected.glsl
index 1848860..0d0e581 100644
--- a/test/intrinsics/ignore/runtime_array.wgsl.expected.glsl
+++ b/test/intrinsics/ignore/runtime_array.wgsl.expected.glsl
@@ -1,4 +1,4 @@
-intrinsics/ignore/runtime_array.wgsl:10:5 warning: use of deprecated intrinsic
+intrinsics/ignore/runtime_array.wgsl:9:5 warning: use of deprecated intrinsic
     ignore(s.arr);
     ^^^^^^
 
diff --git a/test/intrinsics/ignore/storage_buffer.wgsl.expected.glsl b/test/intrinsics/ignore/storage_buffer.wgsl.expected.glsl
index 211b0a1..3ad8ba8 100644
--- a/test/intrinsics/ignore/storage_buffer.wgsl.expected.glsl
+++ b/test/intrinsics/ignore/storage_buffer.wgsl.expected.glsl
@@ -1,8 +1,8 @@
-intrinsics/ignore/storage_buffer.wgsl:10:5 warning: use of deprecated intrinsic
+intrinsics/ignore/storage_buffer.wgsl:9:5 warning: use of deprecated intrinsic
     ignore(s);
     ^^^^^^
 
-intrinsics/ignore/storage_buffer.wgsl:11:5 warning: use of deprecated intrinsic
+intrinsics/ignore/storage_buffer.wgsl:10:5 warning: use of deprecated intrinsic
     ignore(s.i);
     ^^^^^^
 
diff --git a/test/intrinsics/ignore/uniform_buffer.wgsl.expected.glsl b/test/intrinsics/ignore/uniform_buffer.wgsl.expected.glsl
index 987d1c2..fdd2c81 100644
--- a/test/intrinsics/ignore/uniform_buffer.wgsl.expected.glsl
+++ b/test/intrinsics/ignore/uniform_buffer.wgsl.expected.glsl
@@ -1,8 +1,8 @@
-intrinsics/ignore/uniform_buffer.wgsl:10:5 warning: use of deprecated intrinsic
+intrinsics/ignore/uniform_buffer.wgsl:9:5 warning: use of deprecated intrinsic
     ignore(u);
     ^^^^^^
 
-intrinsics/ignore/uniform_buffer.wgsl:11:5 warning: use of deprecated intrinsic
+intrinsics/ignore/uniform_buffer.wgsl:10:5 warning: use of deprecated intrinsic
     ignore(u.i);
     ^^^^^^