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); ^^^^^^