dEQP-VK.graphicsfuzz.control-flow-in-function
authorPaul Thomson <paulthomson@google.com>
Mon, 2 Sep 2019 14:47:44 +0000 (15:47 +0100)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Mon, 30 Sep 2019 10:43:19 +0000 (06:43 -0400)
Components: Vulkan

New Tests:

dEQP-VK.graphicsfuzz.control-flow-in-function

Change-Id: Ie6d6e87acd34ed705b076b9b78de55bf4a190d06

android/cts/master/vk-master.txt
external/vulkancts/data/vulkan/amber/graphicsfuzz/control-flow-in-function.amber [new file with mode: 0644]
external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp
external/vulkancts/mustpass/master/vk-default-no-waivers.txt
external/vulkancts/mustpass/master/vk-default.txt

index 965963e..8edef1d 100644 (file)
@@ -483014,6 +483014,7 @@ dEQP-VK.conditional_rendering.draw_clear.draw.update_with_rendering_discard
 dEQP-VK.graphicsfuzz.barrier-in-loop-with-break
 dEQP-VK.graphicsfuzz.color-write-in-loop
 dEQP-VK.graphicsfuzz.continue-and-merge
+dEQP-VK.graphicsfuzz.control-flow-in-function
 dEQP-VK.graphicsfuzz.control-flow-switch
 dEQP-VK.graphicsfuzz.dead-barriers-in-loops
 dEQP-VK.graphicsfuzz.dead-struct-init
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/control-flow-in-function.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/control-flow-in-function.amber
new file mode 100644 (file)
index 0000000..5f1760a
--- /dev/null
@@ -0,0 +1,852 @@
+#!amber
+
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# A test for a bug found by GraphicsFuzz.
+
+# Short description: A fragment shader with a lot of control flow
+
+# The test passes because the fragment shader does not enter the first if statement, then writes
+# the color red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# precision highp float;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+#     vec2 injectionSwitch;
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# vec3 drawShape(vec2 pos)
+# {
+#     bool c2;
+#     c2 = pos.x > 1.0;
+#     if (c2)
+#     {
+#         return vec3(1.0);
+#     }
+#     bool c3;
+#     c3 = pos.y < 1.0;
+#     if (c3)
+#     {
+#         return vec3(1.0);
+#     }
+#     bool c4;
+#     c4 = pos.y > 1.0;
+#     if (c4)
+#     {
+#         return vec3(1.0);
+#     }
+#     bool c5;
+#     c5 = pos.x < 1.0;
+#     if (c5)
+#     {
+#         return vec3(1.0);
+#     }
+#     bool c6;
+#     c6 = pos.x + 1.0 > 1.0;
+#     if (c6)
+#     {
+#         return vec3(1.0);
+#     }
+#     int GLF_live4_looplimiter5;
+#     for (
+#         int GLF_live4i = 0;
+#         GLF_live4i < 4;
+#         ++GLF_live4i)
+#     {
+#         if (GLF_live4_looplimiter5 >= 7)
+#         {
+#             break;
+#         }
+#         GLF_live4_looplimiter5++;
+#         mat4x2 GLF_live7m42;
+#         GLF_live7m42 = mat4x2(1.0);
+#         mat3 GLF_live7m33;
+#         GLF_live7m33 = mat3(1.0);
+#         int GLF_live7_looplimiter3;
+#         for (
+#             int GLF_live7cols = 2;
+#             GLF_live7cols < 4;
+#             ++GLF_live7cols)
+#         {
+#             if (GLF_live7_looplimiter3 >= 7)
+#             {
+#                 break;
+#             }
+#             GLF_live7_looplimiter3++;
+#             int GLF_live7_looplimiter2;
+#             for (
+#                 int GLF_live7rows = 2;
+#                 GLF_live7rows < 4;
+#                 ++GLF_live7rows)
+#             {
+#                 if (GLF_live7_looplimiter2 >= 7)
+#                 {
+#                     break;
+#                 }
+#                 GLF_live7_looplimiter2++;
+#                 int GLF_live7_looplimiter1;
+#                 GLF_live7_looplimiter1 = 0;
+#                 for (
+#                     int GLF_live7c = 0;
+#                     GLF_live7c < 3;
+#                     GLF_live7c++)
+#                 {
+#                     if (GLF_live7_looplimiter1 >= 7)
+#                     {
+#                         break;
+#                     }
+#                     GLF_live7_looplimiter1++;
+#                     int GLF_live7_looplimiter0;
+#                     for (
+#                         int GLF_live7r = 0;
+#                         GLF_live7r < 2;
+#                         ++GLF_live7r)
+#                     {
+#                         if (GLF_live7_looplimiter0 >= 7)
+#                         {
+#                             break;
+#                         }
+#                         GLF_live7_looplimiter0++;
+#                         GLF_live7m33[GLF_live7c >= 0 && GLF_live7c < 3 ? GLF_live7c : 0][GLF_live7r >= 0 && GLF_live7r < 3 ? GLF_live7r : 0] = 1.0;
+#                         if (0.0 > injectionSwitch.y)
+#                         {
+#                         }
+#                         else
+#                         {
+#                             GLF_live7m42[GLF_live7c >= 0 && GLF_live7c < 4 ? GLF_live7c : 0][GLF_live7r >= 0 && GLF_live7r < 2 ? GLF_live7r : 0] = 1.0;
+#                         }
+#                     }
+#                 }
+#             }
+#         }
+#         float GLF_live7sums[9];
+#         int GLF_live7sum_index;
+#         GLF_live7sum_index = 0;
+#         int GLF_live7_looplimiter7;
+#         GLF_live7_looplimiter7 = 0;
+#         for (
+#             int GLF_live7cols = 2;
+#             GLF_live7cols < 4;
+#             ++GLF_live7cols)
+#         {
+#             if (GLF_live7_looplimiter7 >= 7)
+#             {
+#                 break;
+#             }
+#             GLF_live7_looplimiter7++;
+#             int GLF_live7rows;
+#             GLF_live7rows = 2;
+#             GLF_live7sums[GLF_live7sum_index >= 0 && GLF_live7sum_index < 9 ? GLF_live7sum_index : 0] = 0.0;
+#             for (
+#                 int GLF_live7c = 0;
+#                 GLF_live7c < 1;
+#                 GLF_live7c++)
+#             {
+#                 for (
+#                     int GLF_live7r = 0;
+#                     GLF_live7r < GLF_live7rows;
+#                     GLF_live7r++)
+#                 {
+#                     GLF_live7sums[GLF_live7sum_index >= 0 && GLF_live7sum_index < 9 ? GLF_live7sum_index : 0] += transpose(GLF_live7m33)[GLF_live7c < 3 ? 1 : int(injectionSwitch.x)][GLF_live7r < 3 ? 1 : 0];
+#                     GLF_live7sums[GLF_live7sum_index >= 0 && GLF_live7sum_index < 9 ? GLF_live7sum_index : 0] += GLF_live7m42[1][GLF_live7r];
+#                 }
+#             }
+#             GLF_live7sum_index++;
+#         }
+#     }
+#     return vec3(1.0);
+# }
+# void main()
+# {
+#     if (injectionSwitch.x >= 2.0) // always false
+#     {
+#         vec2 position = gl_FragCoord.xy;
+#         drawShape(position);
+#         drawShape(position);
+#
+#         for (
+#             int i = 25;
+#             i > 0;
+#             --i)
+#         {
+#             drawShape(position);
+#         }
+#     }
+#     _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 352
+; Schema: 0
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main" %326 %350
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+               OpName %12 "drawShape(vf2;"
+               OpName %11 "pos"
+               OpName %16 "c2"
+               OpName %29 "c3"
+               OpName %38 "c4"
+               OpName %46 "c5"
+               OpName %54 "c6"
+               OpName %65 "GLF_live4i"
+               OpName %75 "GLF_live4_looplimiter5"
+               OpName %87 "GLF_live7m42"
+               OpName %95 "GLF_live7m33"
+               OpName %100 "GLF_live7cols"
+               OpName %109 "GLF_live7_looplimiter3"
+               OpName %117 "GLF_live7rows"
+               OpName %125 "GLF_live7_looplimiter2"
+               OpName %133 "GLF_live7_looplimiter1"
+               OpName %134 "GLF_live7c"
+               OpName %150 "GLF_live7r"
+               OpName %158 "GLF_live7_looplimiter0"
+               OpName %181 "buf0"
+               OpMemberName %181 0 "injectionSwitch"
+               OpName %183 ""
+               OpName %214 "GLF_live7sum_index"
+               OpName %215 "GLF_live7_looplimiter7"
+               OpName %216 "GLF_live7cols"
+               OpName %231 "GLF_live7rows"
+               OpName %235 "GLF_live7sums"
+               OpName %245 "GLF_live7c"
+               OpName %253 "GLF_live7r"
+               OpName %284 "indexable"
+               OpName %323 "position"
+               OpName %326 "gl_FragCoord"
+               OpName %329 "param"
+               OpName %332 "param"
+               OpName %335 "i"
+               OpName %344 "param"
+               OpName %350 "_GLF_color"
+               OpDecorate %65 RelaxedPrecision
+               OpDecorate %72 RelaxedPrecision
+               OpDecorate %75 RelaxedPrecision
+               OpDecorate %76 RelaxedPrecision
+               OpDecorate %82 RelaxedPrecision
+               OpDecorate %84 RelaxedPrecision
+               OpDecorate %100 RelaxedPrecision
+               OpDecorate %107 RelaxedPrecision
+               OpDecorate %109 RelaxedPrecision
+               OpDecorate %110 RelaxedPrecision
+               OpDecorate %115 RelaxedPrecision
+               OpDecorate %116 RelaxedPrecision
+               OpDecorate %117 RelaxedPrecision
+               OpDecorate %123 RelaxedPrecision
+               OpDecorate %125 RelaxedPrecision
+               OpDecorate %126 RelaxedPrecision
+               OpDecorate %131 RelaxedPrecision
+               OpDecorate %132 RelaxedPrecision
+               OpDecorate %133 RelaxedPrecision
+               OpDecorate %134 RelaxedPrecision
+               OpDecorate %140 RelaxedPrecision
+               OpDecorate %143 RelaxedPrecision
+               OpDecorate %148 RelaxedPrecision
+               OpDecorate %149 RelaxedPrecision
+               OpDecorate %150 RelaxedPrecision
+               OpDecorate %156 RelaxedPrecision
+               OpDecorate %158 RelaxedPrecision
+               OpDecorate %159 RelaxedPrecision
+               OpDecorate %164 RelaxedPrecision
+               OpDecorate %165 RelaxedPrecision
+               OpDecorate %166 RelaxedPrecision
+               OpDecorate %168 RelaxedPrecision
+               OpDecorate %171 RelaxedPrecision
+               OpDecorate %173 RelaxedPrecision
+               OpDecorate %175 RelaxedPrecision
+               OpDecorate %178 RelaxedPrecision
+               OpMemberDecorate %181 0 Offset 0
+               OpDecorate %181 Block
+               OpDecorate %183 DescriptorSet 0
+               OpDecorate %183 Binding 0
+               OpDecorate %191 RelaxedPrecision
+               OpDecorate %193 RelaxedPrecision
+               OpDecorate %196 RelaxedPrecision
+               OpDecorate %198 RelaxedPrecision
+               OpDecorate %200 RelaxedPrecision
+               OpDecorate %203 RelaxedPrecision
+               OpDecorate %206 RelaxedPrecision
+               OpDecorate %207 RelaxedPrecision
+               OpDecorate %208 RelaxedPrecision
+               OpDecorate %209 RelaxedPrecision
+               OpDecorate %210 RelaxedPrecision
+               OpDecorate %211 RelaxedPrecision
+               OpDecorate %212 RelaxedPrecision
+               OpDecorate %213 RelaxedPrecision
+               OpDecorate %214 RelaxedPrecision
+               OpDecorate %215 RelaxedPrecision
+               OpDecorate %216 RelaxedPrecision
+               OpDecorate %222 RelaxedPrecision
+               OpDecorate %224 RelaxedPrecision
+               OpDecorate %229 RelaxedPrecision
+               OpDecorate %230 RelaxedPrecision
+               OpDecorate %231 RelaxedPrecision
+               OpDecorate %236 RelaxedPrecision
+               OpDecorate %238 RelaxedPrecision
+               OpDecorate %242 RelaxedPrecision
+               OpDecorate %245 RelaxedPrecision
+               OpDecorate %251 RelaxedPrecision
+               OpDecorate %253 RelaxedPrecision
+               OpDecorate %259 RelaxedPrecision
+               OpDecorate %260 RelaxedPrecision
+               OpDecorate %262 RelaxedPrecision
+               OpDecorate %264 RelaxedPrecision
+               OpDecorate %267 RelaxedPrecision
+               OpDecorate %271 RelaxedPrecision
+               OpDecorate %281 RelaxedPrecision
+               OpDecorate %291 RelaxedPrecision
+               OpDecorate %293 RelaxedPrecision
+               OpDecorate %296 RelaxedPrecision
+               OpDecorate %298 RelaxedPrecision
+               OpDecorate %305 RelaxedPrecision
+               OpDecorate %306 RelaxedPrecision
+               OpDecorate %307 RelaxedPrecision
+               OpDecorate %308 RelaxedPrecision
+               OpDecorate %309 RelaxedPrecision
+               OpDecorate %310 RelaxedPrecision
+               OpDecorate %311 RelaxedPrecision
+               OpDecorate %312 RelaxedPrecision
+               OpDecorate %313 RelaxedPrecision
+               OpDecorate %314 RelaxedPrecision
+               OpDecorate %326 BuiltIn FragCoord
+               OpDecorate %335 RelaxedPrecision
+               OpDecorate %342 RelaxedPrecision
+               OpDecorate %347 RelaxedPrecision
+               OpDecorate %348 RelaxedPrecision
+               OpDecorate %350 Location 0
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeFloat 32
+          %7 = OpTypeVector %6 2
+          %8 = OpTypePointer Function %7
+          %9 = OpTypeVector %6 3
+         %10 = OpTypeFunction %9 %8
+         %14 = OpTypeBool
+         %15 = OpTypePointer Function %14
+         %17 = OpTypeInt 32 0
+         %18 = OpConstant %17 0
+         %19 = OpTypePointer Function %6
+         %22 = OpConstant %6 1
+         %27 = OpConstantComposite %9 %22 %22 %22
+         %30 = OpConstant %17 1
+         %63 = OpTypeInt 32 1
+         %64 = OpTypePointer Function %63
+         %66 = OpConstant %63 0
+         %73 = OpConstant %63 4
+         %77 = OpConstant %63 7
+         %83 = OpConstant %63 1
+         %85 = OpTypeMatrix %7 4
+         %86 = OpTypePointer Function %85
+         %88 = OpConstant %6 0
+         %89 = OpConstantComposite %7 %22 %88
+         %90 = OpConstantComposite %7 %88 %22
+         %91 = OpConstantComposite %7 %88 %88
+         %92 = OpConstantComposite %85 %89 %90 %91 %89
+         %93 = OpTypeMatrix %9 3
+         %94 = OpTypePointer Function %93
+         %96 = OpConstantComposite %9 %22 %88 %88
+         %97 = OpConstantComposite %9 %88 %22 %88
+         %98 = OpConstantComposite %9 %88 %88 %22
+         %99 = OpConstantComposite %93 %96 %97 %98
+        %101 = OpConstant %63 2
+        %141 = OpConstant %63 3
+        %181 = OpTypeStruct %7
+        %182 = OpTypePointer Uniform %181
+        %183 = OpVariable %182 Uniform
+        %184 = OpTypePointer Uniform %6
+        %232 = OpConstant %17 9
+        %233 = OpTypeArray %6 %232
+        %234 = OpTypePointer Function %233
+        %239 = OpConstant %63 9
+        %319 = OpConstant %6 2
+        %324 = OpTypeVector %6 4
+        %325 = OpTypePointer Input %324
+        %326 = OpVariable %325 Input
+        %336 = OpConstant %63 25
+        %349 = OpTypePointer Output %324
+        %350 = OpVariable %349 Output
+        %351 = OpConstantComposite %324 %22 %88 %88 %22
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+        %323 = OpVariable %8 Function
+        %329 = OpVariable %8 Function
+        %332 = OpVariable %8 Function
+        %335 = OpVariable %64 Function
+        %344 = OpVariable %8 Function
+        %317 = OpAccessChain %184 %183 %66 %18
+        %318 = OpLoad %6 %317
+        %320 = OpFOrdGreaterThanEqual %14 %318 %319
+               OpSelectionMerge %322 None
+               OpBranchConditional %320 %321 %322
+        %321 = OpLabel
+        %327 = OpLoad %324 %326
+        %328 = OpVectorShuffle %7 %327 %327 0 1
+               OpStore %323 %328
+        %330 = OpLoad %7 %323
+               OpStore %329 %330
+        %331 = OpFunctionCall %9 %12 %329
+        %333 = OpLoad %7 %323
+               OpStore %332 %333
+        %334 = OpFunctionCall %9 %12 %332
+               OpStore %335 %336
+               OpBranch %337
+        %337 = OpLabel
+               OpLoopMerge %339 %340 None
+               OpBranch %341
+        %341 = OpLabel
+        %342 = OpLoad %63 %335
+        %343 = OpSGreaterThan %14 %342 %66
+               OpBranchConditional %343 %338 %339
+        %338 = OpLabel
+        %345 = OpLoad %7 %323
+               OpStore %344 %345
+        %346 = OpFunctionCall %9 %12 %344
+               OpBranch %340
+        %340 = OpLabel
+        %347 = OpLoad %63 %335
+        %348 = OpISub %63 %347 %83
+               OpStore %335 %348
+               OpBranch %337
+        %339 = OpLabel
+               OpBranch %322
+        %322 = OpLabel
+               OpStore %350 %351
+               OpReturn
+               OpFunctionEnd
+         %12 = OpFunction %9 None %10
+         %11 = OpFunctionParameter %8
+         %13 = OpLabel
+         %16 = OpVariable %15 Function
+         %29 = OpVariable %15 Function
+         %38 = OpVariable %15 Function
+         %46 = OpVariable %15 Function
+         %54 = OpVariable %15 Function
+         %65 = OpVariable %64 Function
+         %75 = OpVariable %64 Function
+         %87 = OpVariable %86 Function
+         %95 = OpVariable %94 Function
+        %100 = OpVariable %64 Function
+        %109 = OpVariable %64 Function
+        %117 = OpVariable %64 Function
+        %125 = OpVariable %64 Function
+        %133 = OpVariable %64 Function
+        %134 = OpVariable %64 Function
+        %150 = OpVariable %64 Function
+        %158 = OpVariable %64 Function
+        %214 = OpVariable %64 Function
+        %215 = OpVariable %64 Function
+        %216 = OpVariable %64 Function
+        %231 = OpVariable %64 Function
+        %235 = OpVariable %234 Function
+        %245 = OpVariable %64 Function
+        %253 = OpVariable %64 Function
+        %273 = OpVariable %64 Function
+        %284 = OpVariable %94 Function
+         %20 = OpAccessChain %19 %11 %18
+         %21 = OpLoad %6 %20
+         %23 = OpFOrdGreaterThan %14 %21 %22
+               OpStore %16 %23
+         %24 = OpLoad %14 %16
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %25 %26
+         %25 = OpLabel
+               OpReturnValue %27
+         %26 = OpLabel
+         %31 = OpAccessChain %19 %11 %30
+         %32 = OpLoad %6 %31
+         %33 = OpFOrdLessThan %14 %32 %22
+               OpStore %29 %33
+         %34 = OpLoad %14 %29
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %35 %36
+         %35 = OpLabel
+               OpReturnValue %27
+         %36 = OpLabel
+         %39 = OpAccessChain %19 %11 %30
+         %40 = OpLoad %6 %39
+         %41 = OpFOrdGreaterThan %14 %40 %22
+               OpStore %38 %41
+         %42 = OpLoad %14 %38
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %43 %44
+         %43 = OpLabel
+               OpReturnValue %27
+         %44 = OpLabel
+         %47 = OpAccessChain %19 %11 %18
+         %48 = OpLoad %6 %47
+         %49 = OpFOrdLessThan %14 %48 %22
+               OpStore %46 %49
+         %50 = OpLoad %14 %46
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %51 %52
+         %51 = OpLabel
+               OpReturnValue %27
+         %52 = OpLabel
+         %55 = OpAccessChain %19 %11 %18
+         %56 = OpLoad %6 %55
+         %57 = OpFAdd %6 %56 %22
+         %58 = OpFOrdGreaterThan %14 %57 %22
+               OpStore %54 %58
+         %59 = OpLoad %14 %54
+               OpSelectionMerge %61 None
+               OpBranchConditional %59 %60 %61
+         %60 = OpLabel
+               OpReturnValue %27
+         %61 = OpLabel
+               OpStore %65 %66
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %72 = OpLoad %63 %65
+         %74 = OpSLessThan %14 %72 %73
+               OpBranchConditional %74 %68 %69
+         %68 = OpLabel
+         %76 = OpLoad %63 %75
+         %78 = OpSGreaterThanEqual %14 %76 %77
+               OpSelectionMerge %80 None
+               OpBranchConditional %78 %79 %80
+         %79 = OpLabel
+               OpBranch %69
+         %80 = OpLabel
+         %82 = OpLoad %63 %75
+         %84 = OpIAdd %63 %82 %83
+               OpStore %75 %84
+               OpStore %87 %92
+               OpStore %95 %99
+               OpStore %100 %101
+               OpBranch %102
+        %102 = OpLabel
+               OpLoopMerge %104 %105 None
+               OpBranch %106
+        %106 = OpLabel
+        %107 = OpLoad %63 %100
+        %108 = OpSLessThan %14 %107 %73
+               OpBranchConditional %108 %103 %104
+        %103 = OpLabel
+        %110 = OpLoad %63 %109
+        %111 = OpSGreaterThanEqual %14 %110 %77
+               OpSelectionMerge %113 None
+               OpBranchConditional %111 %112 %113
+        %112 = OpLabel
+               OpBranch %104
+        %113 = OpLabel
+        %115 = OpLoad %63 %109
+        %116 = OpIAdd %63 %115 %83
+               OpStore %109 %116
+               OpStore %117 %101
+               OpBranch %118
+        %118 = OpLabel
+               OpLoopMerge %120 %121 None
+               OpBranch %122
+        %122 = OpLabel
+        %123 = OpLoad %63 %117
+        %124 = OpSLessThan %14 %123 %73
+               OpBranchConditional %124 %119 %120
+        %119 = OpLabel
+        %126 = OpLoad %63 %125
+        %127 = OpSGreaterThanEqual %14 %126 %77
+               OpSelectionMerge %129 None
+               OpBranchConditional %127 %128 %129
+        %128 = OpLabel
+               OpBranch %120
+        %129 = OpLabel
+        %131 = OpLoad %63 %125
+        %132 = OpIAdd %63 %131 %83
+               OpStore %125 %132
+               OpStore %133 %66
+               OpStore %134 %66
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %137 %138 None
+               OpBranch %139
+        %139 = OpLabel
+        %140 = OpLoad %63 %134
+        %142 = OpSLessThan %14 %140 %141
+               OpBranchConditional %142 %136 %137
+        %136 = OpLabel
+        %143 = OpLoad %63 %133
+        %144 = OpSGreaterThanEqual %14 %143 %77
+               OpSelectionMerge %146 None
+               OpBranchConditional %144 %145 %146
+        %145 = OpLabel
+               OpBranch %137
+        %146 = OpLabel
+        %148 = OpLoad %63 %133
+        %149 = OpIAdd %63 %148 %83
+               OpStore %133 %149
+               OpStore %150 %66
+               OpBranch %151
+        %151 = OpLabel
+               OpLoopMerge %153 %154 None
+               OpBranch %155
+        %155 = OpLabel
+        %156 = OpLoad %63 %150
+        %157 = OpSLessThan %14 %156 %101
+               OpBranchConditional %157 %152 %153
+        %152 = OpLabel
+        %159 = OpLoad %63 %158
+        %160 = OpSGreaterThanEqual %14 %159 %77
+               OpSelectionMerge %162 None
+               OpBranchConditional %160 %161 %162
+        %161 = OpLabel
+               OpBranch %153
+        %162 = OpLabel
+        %164 = OpLoad %63 %158
+        %165 = OpIAdd %63 %164 %83
+               OpStore %158 %165
+        %166 = OpLoad %63 %134
+        %167 = OpSGreaterThanEqual %14 %166 %66
+        %168 = OpLoad %63 %134
+        %169 = OpSLessThan %14 %168 %141
+        %170 = OpLogicalAnd %14 %167 %169
+        %171 = OpLoad %63 %134
+        %172 = OpSelect %63 %170 %171 %66
+        %173 = OpLoad %63 %150
+        %174 = OpSGreaterThanEqual %14 %173 %66
+        %175 = OpLoad %63 %150
+        %176 = OpSLessThan %14 %175 %141
+        %177 = OpLogicalAnd %14 %174 %176
+        %178 = OpLoad %63 %150
+        %179 = OpSelect %63 %177 %178 %66
+        %180 = OpAccessChain %19 %95 %172 %179
+               OpStore %180 %22
+        %185 = OpAccessChain %184 %183 %66 %30
+        %186 = OpLoad %6 %185
+        %187 = OpFOrdGreaterThan %14 %88 %186
+               OpSelectionMerge %189 None
+               OpBranchConditional %187 %188 %190
+        %188 = OpLabel
+               OpBranch %189
+        %190 = OpLabel
+        %191 = OpLoad %63 %134
+        %192 = OpSGreaterThanEqual %14 %191 %66
+        %193 = OpLoad %63 %134
+        %194 = OpSLessThan %14 %193 %73
+        %195 = OpLogicalAnd %14 %192 %194
+        %196 = OpLoad %63 %134
+        %197 = OpSelect %63 %195 %196 %66
+        %198 = OpLoad %63 %150
+        %199 = OpSGreaterThanEqual %14 %198 %66
+        %200 = OpLoad %63 %150
+        %201 = OpSLessThan %14 %200 %101
+        %202 = OpLogicalAnd %14 %199 %201
+        %203 = OpLoad %63 %150
+        %204 = OpSelect %63 %202 %203 %66
+        %205 = OpAccessChain %19 %87 %197 %204
+               OpStore %205 %22
+               OpBranch %189
+        %189 = OpLabel
+               OpBranch %154
+        %154 = OpLabel
+        %206 = OpLoad %63 %150
+        %207 = OpIAdd %63 %206 %83
+               OpStore %150 %207
+               OpBranch %151
+        %153 = OpLabel
+               OpBranch %138
+        %138 = OpLabel
+        %208 = OpLoad %63 %134
+        %209 = OpIAdd %63 %208 %83
+               OpStore %134 %209
+               OpBranch %135
+        %137 = OpLabel
+               OpBranch %121
+        %121 = OpLabel
+        %210 = OpLoad %63 %117
+        %211 = OpIAdd %63 %210 %83
+               OpStore %117 %211
+               OpBranch %118
+        %120 = OpLabel
+               OpBranch %105
+        %105 = OpLabel
+        %212 = OpLoad %63 %100
+        %213 = OpIAdd %63 %212 %83
+               OpStore %100 %213
+               OpBranch %102
+        %104 = OpLabel
+               OpStore %214 %66
+               OpStore %215 %66
+               OpStore %216 %101
+               OpBranch %217
+        %217 = OpLabel
+               OpLoopMerge %219 %220 None
+               OpBranch %221
+        %221 = OpLabel
+        %222 = OpLoad %63 %216
+        %223 = OpSLessThan %14 %222 %73
+               OpBranchConditional %223 %218 %219
+        %218 = OpLabel
+        %224 = OpLoad %63 %215
+        %225 = OpSGreaterThanEqual %14 %224 %77
+               OpSelectionMerge %227 None
+               OpBranchConditional %225 %226 %227
+        %226 = OpLabel
+               OpBranch %219
+        %227 = OpLabel
+        %229 = OpLoad %63 %215
+        %230 = OpIAdd %63 %229 %83
+               OpStore %215 %230
+               OpStore %231 %101
+        %236 = OpLoad %63 %214
+        %237 = OpSGreaterThanEqual %14 %236 %66
+        %238 = OpLoad %63 %214
+        %240 = OpSLessThan %14 %238 %239
+        %241 = OpLogicalAnd %14 %237 %240
+        %242 = OpLoad %63 %214
+        %243 = OpSelect %63 %241 %242 %66
+        %244 = OpAccessChain %19 %235 %243
+               OpStore %244 %88
+               OpStore %245 %66
+               OpBranch %246
+        %246 = OpLabel
+               OpLoopMerge %248 %249 None
+               OpBranch %250
+        %250 = OpLabel
+        %251 = OpLoad %63 %245
+        %252 = OpSLessThan %14 %251 %83
+               OpBranchConditional %252 %247 %248
+        %247 = OpLabel
+               OpStore %253 %66
+               OpBranch %254
+        %254 = OpLabel
+               OpLoopMerge %256 %257 None
+               OpBranch %258
+        %258 = OpLabel
+        %259 = OpLoad %63 %253
+        %260 = OpLoad %63 %231
+        %261 = OpSLessThan %14 %259 %260
+               OpBranchConditional %261 %255 %256
+        %255 = OpLabel
+        %262 = OpLoad %63 %214
+        %263 = OpSGreaterThanEqual %14 %262 %66
+        %264 = OpLoad %63 %214
+        %265 = OpSLessThan %14 %264 %239
+        %266 = OpLogicalAnd %14 %263 %265
+        %267 = OpLoad %63 %214
+        %268 = OpSelect %63 %266 %267 %66
+        %269 = OpLoad %93 %95
+        %270 = OpTranspose %93 %269
+        %271 = OpLoad %63 %245
+        %272 = OpSLessThan %14 %271 %141
+               OpSelectionMerge %275 None
+               OpBranchConditional %272 %274 %276
+        %274 = OpLabel
+               OpStore %273 %83
+               OpBranch %275
+        %276 = OpLabel
+        %277 = OpAccessChain %184 %183 %66 %18
+        %278 = OpLoad %6 %277
+        %279 = OpConvertFToS %63 %278
+               OpStore %273 %279
+               OpBranch %275
+        %275 = OpLabel
+        %280 = OpLoad %63 %273
+        %281 = OpLoad %63 %253
+        %282 = OpSLessThan %14 %281 %141
+        %283 = OpSelect %63 %282 %83 %66
+               OpStore %284 %270
+        %285 = OpAccessChain %19 %284 %280 %283
+        %286 = OpLoad %6 %285
+        %287 = OpAccessChain %19 %235 %268
+        %288 = OpLoad %6 %287
+        %289 = OpFAdd %6 %288 %286
+        %290 = OpAccessChain %19 %235 %268
+               OpStore %290 %289
+        %291 = OpLoad %63 %214
+        %292 = OpSGreaterThanEqual %14 %291 %66
+        %293 = OpLoad %63 %214
+        %294 = OpSLessThan %14 %293 %239
+        %295 = OpLogicalAnd %14 %292 %294
+        %296 = OpLoad %63 %214
+        %297 = OpSelect %63 %295 %296 %66
+        %298 = OpLoad %63 %253
+        %299 = OpAccessChain %19 %87 %83 %298
+        %300 = OpLoad %6 %299
+        %301 = OpAccessChain %19 %235 %297
+        %302 = OpLoad %6 %301
+        %303 = OpFAdd %6 %302 %300
+        %304 = OpAccessChain %19 %235 %297
+               OpStore %304 %303
+               OpBranch %257
+        %257 = OpLabel
+        %305 = OpLoad %63 %253
+        %306 = OpIAdd %63 %305 %83
+               OpStore %253 %306
+               OpBranch %254
+        %256 = OpLabel
+               OpBranch %249
+        %249 = OpLabel
+        %307 = OpLoad %63 %245
+        %308 = OpIAdd %63 %307 %83
+               OpStore %245 %308
+               OpBranch %246
+        %248 = OpLabel
+        %309 = OpLoad %63 %214
+        %310 = OpIAdd %63 %309 %83
+               OpStore %214 %310
+               OpBranch %220
+        %220 = OpLabel
+        %311 = OpLoad %63 %216
+        %312 = OpIAdd %63 %311 %83
+               OpStore %216 %312
+               OpBranch %217
+        %219 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+        %313 = OpLoad %63 %65
+        %314 = OpIAdd %63 %313 %83
+               OpStore %65 %314
+               OpBranch %67
+         %69 = OpLabel
+               OpReturnValue %27
+               OpFunctionEnd
+END
+
+# uniforms for variant
+
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+  ATTACH variant_vertex_shader
+  ATTACH variant_fragment_shader
+  FRAMEBUFFER_SIZE 256 256
+  BIND BUFFER variant_framebuffer AS color LOCATION 0
+  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
index 8519e1b..e4a07a1 100644 (file)
@@ -49,6 +49,7 @@ void createAmberTests (tcu::TestCaseGroup* group)
                {       "barrier-in-loop-with-break.amber",                             "barrier-in-loop-with-break",                   "A compute shader with a barrier in a loop with a break"                                                                },
                {       "color-write-in-loop.amber",                                    "color-write-in-loop",                                  "A fragment shader that writes to color in a loop"                                                                              },
                {       "continue-and-merge.amber",                                             "continue-and-merge",                                   "A fragment shader with two nested loops"                                                                                               },
+               {       "control-flow-in-function.amber",                               "control-flow-in-function",                             "A fragment shader with a lot of control flow"                                                                                  },
                {       "control-flow-switch.amber",                                    "control-flow-switch",                                  "A fragment shader with somewhat complex control flow and a switch"                                             },
                {       "dead-barriers-in-loops.amber",                                 "dead-barriers-in-loops",                               "A compute shader with dead barriers"                                                                                                   },
                {       "dead-struct-init.amber",                                               "dead-struct-init",                                             "A fragment shader that uses struct initializers"                                                                               },
index 0254c95..be877ce 100644 (file)
@@ -485160,6 +485160,7 @@ dEQP-VK.conditional_rendering.draw_clear.draw.update_with_rendering_discard
 dEQP-VK.graphicsfuzz.barrier-in-loop-with-break
 dEQP-VK.graphicsfuzz.color-write-in-loop
 dEQP-VK.graphicsfuzz.continue-and-merge
+dEQP-VK.graphicsfuzz.control-flow-in-function
 dEQP-VK.graphicsfuzz.control-flow-switch
 dEQP-VK.graphicsfuzz.dead-barriers-in-loops
 dEQP-VK.graphicsfuzz.dead-struct-init
index 233fb2f..d880050 100644 (file)
@@ -485007,6 +485007,7 @@ dEQP-VK.conditional_rendering.draw_clear.draw.update_with_rendering_discard
 dEQP-VK.graphicsfuzz.barrier-in-loop-with-break
 dEQP-VK.graphicsfuzz.color-write-in-loop
 dEQP-VK.graphicsfuzz.continue-and-merge
+dEQP-VK.graphicsfuzz.control-flow-in-function
 dEQP-VK.graphicsfuzz.control-flow-switch
 dEQP-VK.graphicsfuzz.dead-barriers-in-loops
 dEQP-VK.graphicsfuzz.dead-struct-init