writer/spirv: Do not add Flat to fragment outputs
Use the sanitizer to add the decoration only to the variables that are
vertex outputs and fragment inputs.
Bug: dawn:963, tint:746
Change-Id: I1b91cf3550fb3c6f583d69e822444534a576e0cd
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/56460
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/transform/spirv.cc b/src/transform/spirv.cc
index c67f8af..e004b9b 100644
--- a/src/transform/spirv.cc
+++ b/src/transform/spirv.cc
@@ -320,6 +320,14 @@
new_decorations.push_back(
ctx.dst->ASTNodes().Create<ast::DisableValidationDecoration>(
ctx.dst->ID(), ast::DisabledValidation::kIgnoreStorageClass));
+ if (ty->is_integer_scalar_or_vector() &&
+ ast::HasDecoration<ast::LocationDecoration>(new_decorations) &&
+ func->pipeline_stage() == ast::PipelineStage::kFragment) {
+ // Vulkan requires that integer user-defined fragment inputs are
+ // always decorated with `Flat`.
+ new_decorations.push_back(ctx.dst->Interpolate(
+ ast::InterpolationType::kFlat, ast::InterpolationSampling::kNone));
+ }
auto global_var_symbol = ctx.dst->Sym();
auto* global_var =
ctx.dst->Var(global_var_symbol, ctx.Clone(declared_ty),
@@ -378,6 +386,14 @@
new_decorations.push_back(
ctx.dst->ASTNodes().Create<ast::DisableValidationDecoration>(
ctx.dst->ID(), ast::DisabledValidation::kIgnoreStorageClass));
+ if (ty->is_integer_scalar_or_vector() &&
+ ast::HasDecoration<ast::LocationDecoration>(new_decorations) &&
+ func->pipeline_stage() == ast::PipelineStage::kVertex) {
+ // Vulkan requires that integer user-defined vertex outputs are
+ // always decorated with `Flat`.
+ new_decorations.push_back(ctx.dst->Interpolate(
+ ast::InterpolationType::kFlat, ast::InterpolationSampling::kNone));
+ }
auto global_var_symbol = ctx.dst->Sym();
auto* global_var =
ctx.dst->Var(global_var_symbol, ctx.Clone(declared_ty),
diff --git a/src/transform/spirv_test.cc b/src/transform/spirv_test.cc
index 4a2c45b..6abeae1 100644
--- a/src/transform/spirv_test.cc
+++ b/src/transform/spirv_test.cc
@@ -125,7 +125,7 @@
)";
auto* expect = R"(
-[[location(0), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol : u32;
+[[location(0), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol : u32;
[[location(0), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_2 : f32;
@@ -165,7 +165,7 @@
auto* expect = R"(
type myf32 = f32;
-[[location(0), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol : u32;
+[[location(0), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol : u32;
[[location(0), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_2 : myf32;
@@ -472,6 +472,135 @@
EXPECT_EQ(expect, str(got));
}
+TEST_F(SpirvTest, HandleEntryPointIOTypes_InterpolateAttributes_Integers) {
+ // Test that we add a Flat attribute to integers that are vertex outputs and
+ // fragment inputs, but not vertex inputs or fragment outputs.
+ auto* src = R"(
+struct VertexIn {
+ [[location(0)]] i : i32;
+ [[location(1)]] u : u32;
+ [[location(2)]] vi : vec4<i32>;
+ [[location(3)]] vu : vec4<u32>;
+};
+
+struct VertexOut {
+ [[location(0)]] i : i32;
+ [[location(1)]] u : u32;
+ [[location(2)]] vi : vec4<i32>;
+ [[location(3)]] vu : vec4<u32>;
+ [[builtin(position)]] pos : vec4<f32>;
+};
+
+struct FragmentInterface {
+ [[location(0)]] i : i32;
+ [[location(1)]] u : u32;
+ [[location(2)]] vi : vec4<i32>;
+ [[location(3)]] vu : vec4<u32>;
+};
+
+[[stage(vertex)]]
+fn vert_main(in : VertexIn) -> VertexOut {
+ return VertexOut(in.i, in.u, in.vi, in.vu);
+}
+
+[[stage(fragment)]]
+fn frag_main(inputs : FragmentInterface) -> FragmentInterface {
+ return inputs;
+}
+)";
+
+ auto* expect = R"(
+struct VertexIn {
+ i : i32;
+ u : u32;
+ vi : vec4<i32>;
+ vu : vec4<u32>;
+};
+
+struct VertexOut {
+ i : i32;
+ u : u32;
+ vi : vec4<i32>;
+ vu : vec4<u32>;
+ pos : vec4<f32>;
+};
+
+struct FragmentInterface {
+ i : i32;
+ u : u32;
+ vi : vec4<i32>;
+ vu : vec4<u32>;
+};
+
+[[location(0), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol : i32;
+
+[[location(1), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol_1 : u32;
+
+[[location(2), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol_2 : vec4<i32>;
+
+[[location(3), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol_3 : vec4<u32>;
+
+[[location(0), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<out> tint_symbol_6 : i32;
+
+[[location(1), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<out> tint_symbol_7 : u32;
+
+[[location(2), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<out> tint_symbol_8 : vec4<i32>;
+
+[[location(3), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<out> tint_symbol_9 : vec4<u32>;
+
+[[builtin(position), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_10 : vec4<f32>;
+
+fn tint_symbol_11(tint_symbol_5 : VertexOut) {
+ tint_symbol_6 = tint_symbol_5.i;
+ tint_symbol_7 = tint_symbol_5.u;
+ tint_symbol_8 = tint_symbol_5.vi;
+ tint_symbol_9 = tint_symbol_5.vu;
+ tint_symbol_10 = tint_symbol_5.pos;
+}
+
+[[stage(vertex)]]
+fn vert_main() {
+ let tint_symbol_4 : VertexIn = VertexIn(tint_symbol, tint_symbol_1, tint_symbol_2, tint_symbol_3);
+ tint_symbol_11(VertexOut(tint_symbol_4.i, tint_symbol_4.u, tint_symbol_4.vi, tint_symbol_4.vu));
+ return;
+}
+
+[[location(0), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol_12 : i32;
+
+[[location(1), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol_13 : u32;
+
+[[location(2), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol_14 : vec4<i32>;
+
+[[location(3), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol_15 : vec4<u32>;
+
+[[location(0), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_18 : i32;
+
+[[location(1), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_19 : u32;
+
+[[location(2), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_20 : vec4<i32>;
+
+[[location(3), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_21 : vec4<u32>;
+
+fn tint_symbol_22(tint_symbol_17 : FragmentInterface) {
+ tint_symbol_18 = tint_symbol_17.i;
+ tint_symbol_19 = tint_symbol_17.u;
+ tint_symbol_20 = tint_symbol_17.vi;
+ tint_symbol_21 = tint_symbol_17.vu;
+}
+
+[[stage(fragment)]]
+fn frag_main() {
+ let tint_symbol_16 : FragmentInterface = FragmentInterface(tint_symbol_12, tint_symbol_13, tint_symbol_14, tint_symbol_15);
+ tint_symbol_22(tint_symbol_16);
+ return;
+}
+)";
+
+ auto got = Run<Spirv>(src);
+
+ EXPECT_EQ(expect, str(got));
+}
+
TEST_F(SpirvTest, HandleEntryPointIOTypes_StructLayoutDecorations) {
auto* src = R"(
[[block]]
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 5e11941..a06ddbb 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -848,11 +848,6 @@
push_annot(spv::Op::OpDecorate,
{Operand::Int(var_id), Operand::Int(SpvDecorationLocation),
Operand::Int(location->value())});
- if (type->is_integer_scalar_or_vector()) {
- // Vulkan requires that integers are always decorated with `Flat`.
- AddInterpolationDecorations(var_id, ast::InterpolationType::kFlat,
- ast::InterpolationSampling::kNone);
- }
} else if (auto* interpolate = deco->As<ast::InterpolateDecoration>()) {
AddInterpolationDecorations(var_id, interpolate->type(),
interpolate->sampling());
diff --git a/test/shader_io/fragment_output_locations.wgsl.expected.spvasm b/test/shader_io/fragment_output_locations.wgsl.expected.spvasm
index fe3c135..ef873b5 100644
--- a/test/shader_io/fragment_output_locations.wgsl.expected.spvasm
+++ b/test/shader_io/fragment_output_locations.wgsl.expected.spvasm
@@ -30,9 +30,7 @@
OpName %tint_symbol_9 "tint_symbol_9"
OpName %main3 "main3"
OpDecorate %tint_symbol_1 Location 0
- OpDecorate %tint_symbol_1 Flat
OpDecorate %tint_symbol_4 Location 1
- OpDecorate %tint_symbol_4 Flat
OpDecorate %tint_symbol_7 Location 2
OpDecorate %tint_symbol_10 Location 3
%int = OpTypeInt 32 1
diff --git a/test/shader_io/fragment_output_locations_struct.wgsl.expected.spvasm b/test/shader_io/fragment_output_locations_struct.wgsl.expected.spvasm
index 21ee12d..9ad60b7 100644
--- a/test/shader_io/fragment_output_locations_struct.wgsl.expected.spvasm
+++ b/test/shader_io/fragment_output_locations_struct.wgsl.expected.spvasm
@@ -20,9 +20,7 @@
OpName %tint_symbol "tint_symbol"
OpName %main "main"
OpDecorate %tint_symbol_1 Location 0
- OpDecorate %tint_symbol_1 Flat
OpDecorate %tint_symbol_2 Location 1
- OpDecorate %tint_symbol_2 Flat
OpDecorate %tint_symbol_3 Location 2
OpDecorate %tint_symbol_4 Location 3
OpMemberDecorate %FragmentOutputs 0 Offset 0
diff --git a/test/shader_io/fragment_output_mixed.wgsl.expected.spvasm b/test/shader_io/fragment_output_mixed.wgsl.expected.spvasm
index 64bde73..164fdf0 100644
--- a/test/shader_io/fragment_output_mixed.wgsl.expected.spvasm
+++ b/test/shader_io/fragment_output_mixed.wgsl.expected.spvasm
@@ -25,10 +25,8 @@
OpName %tint_symbol "tint_symbol"
OpName %main "main"
OpDecorate %tint_symbol_1 Location 0
- OpDecorate %tint_symbol_1 Flat
OpDecorate %tint_symbol_2 BuiltIn FragDepth
OpDecorate %tint_symbol_3 Location 1
- OpDecorate %tint_symbol_3 Flat
OpDecorate %tint_symbol_4 Location 2
OpDecorate %_arr_uint_uint_1 ArrayStride 4
OpDecorate %tint_symbol_5 BuiltIn SampleMask
diff --git a/test/shader_io/interpolate_integers.wgsl b/test/shader_io/interpolate_integers.wgsl
index f6419cf..436d6f0 100644
--- a/test/shader_io/interpolate_integers.wgsl
+++ b/test/shader_io/interpolate_integers.wgsl
@@ -12,5 +12,6 @@
}
[[stage(fragment)]]
-fn frag_main(inputs : Interface) {
+fn frag_main(inputs : Interface) -> [[location(0)]] i32 {
+ return inputs.i;
}
diff --git a/test/shader_io/interpolate_integers.wgsl.expected.hlsl b/test/shader_io/interpolate_integers.wgsl.expected.hlsl
index 73372e8..64cc0c1 100644
--- a/test/shader_io/interpolate_integers.wgsl.expected.hlsl
+++ b/test/shader_io/interpolate_integers.wgsl.expected.hlsl
@@ -15,8 +15,8 @@
tint_symbol vert_main() {
const Interface tint_symbol_1 = {0, 0u, int4(0, 0, 0, 0), uint4(0u, 0u, 0u, 0u), float4(0.0f, 0.0f, 0.0f, 0.0f)};
- const tint_symbol tint_symbol_4 = {tint_symbol_1.i, tint_symbol_1.u, tint_symbol_1.vi, tint_symbol_1.vu, tint_symbol_1.pos};
- return tint_symbol_4;
+ const tint_symbol tint_symbol_5 = {tint_symbol_1.i, tint_symbol_1.u, tint_symbol_1.vi, tint_symbol_1.vu, tint_symbol_1.pos};
+ return tint_symbol_5;
}
struct tint_symbol_3 {
@@ -26,8 +26,12 @@
uint4 vu : TEXCOORD3;
float4 pos : SV_Position;
};
+struct tint_symbol_4 {
+ int value : SV_Target0;
+};
-void frag_main(tint_symbol_3 tint_symbol_2) {
+tint_symbol_4 frag_main(tint_symbol_3 tint_symbol_2) {
const Interface inputs = {tint_symbol_2.i, tint_symbol_2.u, tint_symbol_2.vi, tint_symbol_2.vu, tint_symbol_2.pos};
- return;
+ const tint_symbol_4 tint_symbol_6 = {inputs.i};
+ return tint_symbol_6;
}
diff --git a/test/shader_io/interpolate_integers.wgsl.expected.msl b/test/shader_io/interpolate_integers.wgsl.expected.msl
index 544aa30..4fb8d3a 100644
--- a/test/shader_io/interpolate_integers.wgsl.expected.msl
+++ b/test/shader_io/interpolate_integers.wgsl.expected.msl
@@ -21,15 +21,19 @@
int4 vi [[user(locn2)]];
uint4 vu [[user(locn3)]];
};
+struct tint_symbol_5 {
+ int value [[color(0)]];
+};
vertex tint_symbol vert_main() {
Interface const tint_symbol_1 = {};
- tint_symbol const tint_symbol_5 = {.i=tint_symbol_1.i, .u=tint_symbol_1.u, .vi=tint_symbol_1.vi, .vu=tint_symbol_1.vu, .pos=tint_symbol_1.pos};
- return tint_symbol_5;
+ tint_symbol const tint_symbol_6 = {.i=tint_symbol_1.i, .u=tint_symbol_1.u, .vi=tint_symbol_1.vi, .vu=tint_symbol_1.vu, .pos=tint_symbol_1.pos};
+ return tint_symbol_6;
}
-fragment void frag_main(float4 tint_symbol_3 [[position]], tint_symbol_4 tint_symbol_2 [[stage_in]]) {
+fragment tint_symbol_5 frag_main(float4 tint_symbol_3 [[position]], tint_symbol_4 tint_symbol_2 [[stage_in]]) {
Interface const inputs = {.i=tint_symbol_2.i, .u=tint_symbol_2.u, .vi=tint_symbol_2.vi, .vu=tint_symbol_2.vu, .pos=tint_symbol_3};
- return;
+ tint_symbol_5 const tint_symbol_7 = {.value=inputs.i};
+ return tint_symbol_7;
}
diff --git a/test/shader_io/interpolate_integers.wgsl.expected.spvasm b/test/shader_io/interpolate_integers.wgsl.expected.spvasm
index 39474b1..7caa7e2 100644
--- a/test/shader_io/interpolate_integers.wgsl.expected.spvasm
+++ b/test/shader_io/interpolate_integers.wgsl.expected.spvasm
@@ -1,12 +1,12 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
-; Bound: 54
+; Bound: 67
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vert_main "vert_main" %tint_pointsize %tint_symbol_1 %tint_symbol_2 %tint_symbol_3 %tint_symbol_4 %tint_symbol_5
- OpEntryPoint Fragment %frag_main "frag_main"
+ OpEntryPoint Fragment %frag_main "frag_main" %tint_symbol_7 %tint_symbol_8 %tint_symbol_9 %tint_symbol_10 %tint_symbol_11 %tint_symbol_14
OpExecutionMode %frag_main OriginUpperLeft
OpName %tint_pointsize "tint_pointsize"
OpName %tint_symbol_1 "tint_symbol_1"
@@ -19,6 +19,7 @@
OpName %tint_symbol_9 "tint_symbol_9"
OpName %tint_symbol_10 "tint_symbol_10"
OpName %tint_symbol_11 "tint_symbol_11"
+ OpName %tint_symbol_14 "tint_symbol_14"
OpName %Interface "Interface"
OpMemberName %Interface 0 "i"
OpMemberName %Interface 1 "u"
@@ -28,6 +29,8 @@
OpName %tint_symbol_6 "tint_symbol_6"
OpName %tint_symbol "tint_symbol"
OpName %vert_main "vert_main"
+ OpName %tint_symbol_15 "tint_symbol_15"
+ OpName %tint_symbol_13 "tint_symbol_13"
OpName %frag_main "frag_main"
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %tint_symbol_1 Location 0
@@ -48,6 +51,7 @@
OpDecorate %tint_symbol_10 Location 3
OpDecorate %tint_symbol_10 Flat
OpDecorate %tint_symbol_11 BuiltIn FragCoord
+ OpDecorate %tint_symbol_14 Location 0
OpMemberDecorate %Interface 0 Offset 0
OpMemberDecorate %Interface 1 Offset 4
OpMemberDecorate %Interface 2 Offset 16
@@ -87,34 +91,50 @@
%tint_symbol_10 = OpVariable %_ptr_Input_v4uint Input
%_ptr_Input_v4float = OpTypePointer Input %v4float
%tint_symbol_11 = OpVariable %_ptr_Input_v4float Input
+%tint_symbol_14 = OpVariable %_ptr_Output_int Output %8
%void = OpTypeVoid
%Interface = OpTypeStruct %int %uint %v4int %v4uint %v4float
- %35 = OpTypeFunction %void %Interface
- %46 = OpTypeFunction %void
+ %36 = OpTypeFunction %void %Interface
+ %47 = OpTypeFunction %void
%float_1 = OpConstant %float 1
- %51 = OpConstantNull %Interface
-%tint_symbol_6 = OpFunction %void None %35
+ %52 = OpConstantNull %Interface
+ %53 = OpTypeFunction %void %int
+%tint_symbol_6 = OpFunction %void None %36
%tint_symbol = OpFunctionParameter %Interface
- %40 = OpLabel
- %41 = OpCompositeExtract %int %tint_symbol 0
- OpStore %tint_symbol_1 %41
- %42 = OpCompositeExtract %uint %tint_symbol 1
- OpStore %tint_symbol_2 %42
- %43 = OpCompositeExtract %v4int %tint_symbol 2
- OpStore %tint_symbol_3 %43
- %44 = OpCompositeExtract %v4uint %tint_symbol 3
- OpStore %tint_symbol_4 %44
- %45 = OpCompositeExtract %v4float %tint_symbol 4
- OpStore %tint_symbol_5 %45
+ %41 = OpLabel
+ %42 = OpCompositeExtract %int %tint_symbol 0
+ OpStore %tint_symbol_1 %42
+ %43 = OpCompositeExtract %uint %tint_symbol 1
+ OpStore %tint_symbol_2 %43
+ %44 = OpCompositeExtract %v4int %tint_symbol 2
+ OpStore %tint_symbol_3 %44
+ %45 = OpCompositeExtract %v4uint %tint_symbol 3
+ OpStore %tint_symbol_4 %45
+ %46 = OpCompositeExtract %v4float %tint_symbol 4
+ OpStore %tint_symbol_5 %46
OpReturn
OpFunctionEnd
- %vert_main = OpFunction %void None %46
- %48 = OpLabel
+ %vert_main = OpFunction %void None %47
+ %49 = OpLabel
OpStore %tint_pointsize %float_1
- %50 = OpFunctionCall %void %tint_symbol_6 %51
+ %51 = OpFunctionCall %void %tint_symbol_6 %52
OpReturn
OpFunctionEnd
- %frag_main = OpFunction %void None %46
- %53 = OpLabel
+%tint_symbol_15 = OpFunction %void None %53
+%tint_symbol_13 = OpFunctionParameter %int
+ %56 = OpLabel
+ OpStore %tint_symbol_14 %tint_symbol_13
+ OpReturn
+ OpFunctionEnd
+ %frag_main = OpFunction %void None %47
+ %58 = OpLabel
+ %59 = OpLoad %int %tint_symbol_7
+ %60 = OpLoad %uint %tint_symbol_8
+ %61 = OpLoad %v4int %tint_symbol_9
+ %62 = OpLoad %v4uint %tint_symbol_10
+ %63 = OpLoad %v4float %tint_symbol_11
+ %64 = OpCompositeConstruct %Interface %59 %60 %61 %62 %63
+ %66 = OpCompositeExtract %int %64 0
+ %65 = OpFunctionCall %void %tint_symbol_15 %66
OpReturn
OpFunctionEnd
diff --git a/test/shader_io/interpolate_integers.wgsl.expected.wgsl b/test/shader_io/interpolate_integers.wgsl.expected.wgsl
index 8144f53..e20933e 100644
--- a/test/shader_io/interpolate_integers.wgsl.expected.wgsl
+++ b/test/shader_io/interpolate_integers.wgsl.expected.wgsl
@@ -17,5 +17,6 @@
}
[[stage(fragment)]]
-fn frag_main(inputs : Interface) {
+fn frag_main(inputs : Interface) -> [[location(0)]] i32 {
+ return inputs.i;
}
diff --git a/test/shader_io/vertex_input_locations.wgsl.expected.spvasm b/test/shader_io/vertex_input_locations.wgsl.expected.spvasm
index 0991719..9a0c93b 100644
--- a/test/shader_io/vertex_input_locations.wgsl.expected.spvasm
+++ b/test/shader_io/vertex_input_locations.wgsl.expected.spvasm
@@ -17,9 +17,7 @@
OpName %main "main"
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %tint_symbol Location 0
- OpDecorate %tint_symbol Flat
OpDecorate %tint_symbol_1 Location 1
- OpDecorate %tint_symbol_1 Flat
OpDecorate %tint_symbol_2 Location 2
OpDecorate %tint_symbol_3 Location 3
OpDecorate %tint_symbol_5 BuiltIn Position
diff --git a/test/shader_io/vertex_input_locations_struct.wgsl.expected.spvasm b/test/shader_io/vertex_input_locations_struct.wgsl.expected.spvasm
index 970bfe8..3766af8 100644
--- a/test/shader_io/vertex_input_locations_struct.wgsl.expected.spvasm
+++ b/test/shader_io/vertex_input_locations_struct.wgsl.expected.spvasm
@@ -22,9 +22,7 @@
OpMemberName %VertexInputs 3 "loc3"
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %tint_symbol Location 0
- OpDecorate %tint_symbol Flat
OpDecorate %tint_symbol_1 Location 1
- OpDecorate %tint_symbol_1 Flat
OpDecorate %tint_symbol_2 Location 2
OpDecorate %tint_symbol_3 Location 3
OpDecorate %tint_symbol_6 BuiltIn Position
diff --git a/test/shader_io/vertex_input_mixed.wgsl.expected.spvasm b/test/shader_io/vertex_input_mixed.wgsl.expected.spvasm
index 48ccb64..f930879 100644
--- a/test/shader_io/vertex_input_mixed.wgsl.expected.spvasm
+++ b/test/shader_io/vertex_input_mixed.wgsl.expected.spvasm
@@ -26,9 +26,7 @@
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %tint_symbol BuiltIn VertexIndex
OpDecorate %tint_symbol_1 Location 0
- OpDecorate %tint_symbol_1 Flat
OpDecorate %tint_symbol_3 Location 1
- OpDecorate %tint_symbol_3 Flat
OpDecorate %tint_symbol_4 BuiltIn InstanceIndex
OpDecorate %tint_symbol_5 Location 2
OpDecorate %tint_symbol_6 Location 3