dEQP-VK.graphicsfuzz.stable-rects-vec4-clamp-conditional-min-mix
authorToni Salmivalli <toni.salmivalli@siru.fi>
Fri, 17 Jul 2020 10:28:50 +0000 (13:28 +0300)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Wed, 5 Aug 2020 14:35:18 +0000 (10:35 -0400)
Components: Vulkan

New Tests:

dEQP-VK.graphicsfuzz.stable-rects-vec4-clamp-conditional-min-mix

Change-Id: I1c8c0ff590c7cbb2ab55c9d682c6d643556c5483

android/cts/master/vk-master-2020-03-01.txt
android/cts/master/vk-master.txt
external/vulkancts/data/vulkan/amber/graphicsfuzz/index.txt
external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix.amber [new file with mode: 0644]
external/vulkancts/mustpass/master/vk-default.txt

index 8cc0cc0..c932ea7 100644 (file)
@@ -276076,6 +276076,7 @@ dEQP-VK.graphicsfuzz.set-color-in-one-iteration-while-loop
 dEQP-VK.graphicsfuzz.similar-nested-ifs
 dEQP-VK.graphicsfuzz.smoothstep-after-loop
 dEQP-VK.graphicsfuzz.stable-binarysearch-tree-with-loop-read-write-global
+dEQP-VK.graphicsfuzz.stable-rects-vec4-clamp-conditional-min-mix
 dEQP-VK.graphicsfuzz.struct-and-unreachable-infinite-loop
 dEQP-VK.graphicsfuzz.struct-array-data-as-loop-iterator
 dEQP-VK.graphicsfuzz.struct-controlled-loop
index 90bc87a..1351b26 100644 (file)
@@ -686269,6 +686269,7 @@ dEQP-VK.graphicsfuzz.set-color-in-one-iteration-while-loop
 dEQP-VK.graphicsfuzz.similar-nested-ifs
 dEQP-VK.graphicsfuzz.smoothstep-after-loop
 dEQP-VK.graphicsfuzz.stable-binarysearch-tree-with-loop-read-write-global
+dEQP-VK.graphicsfuzz.stable-rects-vec4-clamp-conditional-min-mix
 dEQP-VK.graphicsfuzz.struct-and-unreachable-infinite-loop
 dEQP-VK.graphicsfuzz.struct-array-data-as-loop-iterator
 dEQP-VK.graphicsfuzz.struct-controlled-loop
index 2075cbe..71d1e24 100644 (file)
 {      "similar-nested-ifs.amber",                                                                                                                                     "similar-nested-ifs",                                                                                                                           "A fragment shader with similar nested ifs and loops"                                                           },
 {      "smoothstep-after-loop.amber",                                                                                                                          "smoothstep-after-loop",                                                                                                                        "Fragment shader with 1-iteration loop and smoothstep"                                                          },
 {      "stable-binarysearch-tree-with-loop-read-write-global.amber",                                                           "stable-binarysearch-tree-with-loop-read-write-global",                                                         "A pair of fragment shaders that both render red"                                                                       },
+{      "stable-rects-vec4-clamp-conditional-min-mix.amber",                                                                            "stable-rects-vec4-clamp-conditional-min-mix",                                                                          "A fragment shader with min-mix in always false conditional"                                            },
 {      "struct-and-unreachable-infinite-loop.amber",                                                                                           "struct-and-unreachable-infinite-loop",                                                                                         "Fragment shader with struct and unreachable infinite loop"                                                     },
 {      "struct-array-data-as-loop-iterator.amber",                                                                                                     "struct-array-data-as-loop-iterator",                                                                                           "A fragment shader that uses struct array data for loop iterator value"                         },
 {      "struct-controlled-loop.amber",                                                                                                                         "struct-controlled-loop",                                                                                                                       "Shader with loop controlled by struct"                                                                                         },
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix.amber
new file mode 100644 (file)
index 0000000..9537640
--- /dev/null
@@ -0,0 +1,742 @@
+#!amber
+
+# Copyright 2020 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 min-mix in always false conditional
+
+# The test passes because both shaders render the same image.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+# reference_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0 {
+#  vec2 resolution;
+# };
+# const vec4 pal[16] = vec4[16](vec4(0.0, 0.0, 0.0, 1.0), vec4(0.5, 0.0, 0.0, 1.0), vec4(0.0, 0.5, 0.0, 1.0), vec4(0.5, 0.5, 0.0, 1.0), vec4(0.0, 0.0, 0.5, 1.0), vec4(0.5, 0.0, 0.5, 1.0), vec4(0.0, 0.5, 0.5, 1.0), vec4(0.5, 0.5, 0.5, 1.0), vec4(0.0, 0.0, 0.0, 1.0), vec4(1.0, 0.0, 0.0, 1.0), vec4(0.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0), vec4(0.0, 0.0, 1.0, 1.0), vec4(1.0, 0.0, 1.0, 1.0), vec4(0.0, 1.0, 1.0, 1.0), vec4(1.0, 1.0, 1.0, 1.0));
+#
+# const vec4 picdata[8] = vec4[8](vec4(4, 4, 20, 4), vec4(4, 4, 4, 20), vec4(4, 20, 20, 4), vec4(20, 4, 4, 8), vec4(8, 6, 4, 2), vec4(2, 12, 2, 4), vec4(16, 2, 4, 4), vec4(12, 22, 4, 4));
+#
+# int index;
+#
+# int state[16];
+#
+# bool collision(vec2 pos, vec4 quad)
+# {
+#  if(pos.x < quad.x)
+#   {
+#    return false;
+#   }
+#  if(pos.y < quad.y)
+#   {
+#    return false;
+#   }
+#  if(pos.x > quad.x + quad.z)
+#   {
+#    return false;
+#   }
+#  if(pos.y > quad.y + quad.w)
+#   {
+#    return false;
+#   }
+#  return true;
+# }
+# vec4 match(vec2 pos)
+# {
+#  int i;
+#  vec4 res = vec4(0.5, 0.5, 1.0, 1.0);
+#  for( i = 0;
+#  i < 8; i ++)
+#   {
+#    if(collision(pos, picdata[i]))
+#     {
+#      res = pal[(int(picdata[i].x) * int(picdata[i].y) + i * 9 + 11) % 16];
+#     }
+#   }
+#  return res;
+# }
+# void main()
+# {
+#  vec2 lin = gl_FragCoord.xy / resolution;
+#  lin = floor(lin * 32.0);
+#  _GLF_color = match(lin.xy);
+# }
+SHADER fragment reference_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 189
+; Schema: 0
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main" %165 %180
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 320
+               OpName %4 "main"
+               OpName %15 "collision(vf2;vf4;"
+               OpName %13 "pos"
+               OpName %14 "quad"
+               OpName %19 "match(vf2;"
+               OpName %18 "pos"
+               OpName %69 "res"
+               OpName %75 "i"
+               OpName %105 "param"
+               OpName %107 "param"
+               OpName %109 "indexable"
+               OpName %135 "indexable"
+               OpName %140 "indexable"
+               OpName %154 "indexable"
+               OpName %163 "lin"
+               OpName %165 "gl_FragCoord"
+               OpName %168 "buf0"
+               OpMemberName %168 0 "resolution"
+               OpName %170 ""
+               OpName %180 "_GLF_color"
+               OpName %181 "param"
+               OpName %185 "index"
+               OpName %188 "state"
+               OpDecorate %165 BuiltIn FragCoord
+               OpMemberDecorate %168 0 Offset 0
+               OpDecorate %168 Block
+               OpDecorate %170 DescriptorSet 0
+               OpDecorate %170 Binding 0
+               OpDecorate %180 Location 0
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeFloat 32
+          %7 = OpTypeVector %6 2
+          %8 = OpTypePointer Function %7
+          %9 = OpTypeVector %6 4
+         %10 = OpTypePointer Function %9
+         %11 = OpTypeBool
+         %12 = OpTypeFunction %11 %8 %10
+         %17 = OpTypeFunction %9 %8
+         %21 = OpTypeInt 32 0
+         %22 = OpConstant %21 0
+         %23 = OpTypePointer Function %6
+         %31 = OpConstantFalse %11
+         %33 = OpConstant %21 1
+         %46 = OpConstant %21 2
+         %58 = OpConstant %21 3
+         %66 = OpConstantTrue %11
+         %70 = OpConstant %6 0.5
+         %71 = OpConstant %6 1
+         %72 = OpConstantComposite %9 %70 %70 %71 %71
+         %73 = OpTypeInt 32 1
+         %74 = OpTypePointer Function %73
+         %76 = OpConstant %73 0
+         %83 = OpConstant %73 8
+         %85 = OpConstant %21 8
+         %86 = OpTypeArray %9 %85
+         %87 = OpConstant %6 4
+         %88 = OpConstant %6 20
+         %89 = OpConstantComposite %9 %87 %87 %88 %87
+         %90 = OpConstantComposite %9 %87 %87 %87 %88
+         %91 = OpConstantComposite %9 %87 %88 %88 %87
+         %92 = OpConstant %6 8
+         %93 = OpConstantComposite %9 %88 %87 %87 %92
+         %94 = OpConstant %6 6
+         %95 = OpConstant %6 2
+         %96 = OpConstantComposite %9 %92 %94 %87 %95
+         %97 = OpConstant %6 12
+         %98 = OpConstantComposite %9 %95 %97 %95 %87
+         %99 = OpConstant %6 16
+        %100 = OpConstantComposite %9 %99 %95 %87 %87
+        %101 = OpConstant %6 22
+        %102 = OpConstantComposite %9 %97 %101 %87 %87
+        %103 = OpConstantComposite %86 %89 %90 %91 %93 %96 %98 %100 %102
+        %108 = OpTypePointer Function %86
+        %115 = OpConstant %21 16
+        %116 = OpTypeArray %9 %115
+        %117 = OpConstant %6 0
+        %118 = OpConstantComposite %9 %117 %117 %117 %71
+        %119 = OpConstantComposite %9 %70 %117 %117 %71
+        %120 = OpConstantComposite %9 %117 %70 %117 %71
+        %121 = OpConstantComposite %9 %70 %70 %117 %71
+        %122 = OpConstantComposite %9 %117 %117 %70 %71
+        %123 = OpConstantComposite %9 %70 %117 %70 %71
+        %124 = OpConstantComposite %9 %117 %70 %70 %71
+        %125 = OpConstantComposite %9 %70 %70 %70 %71
+        %126 = OpConstantComposite %9 %71 %117 %117 %71
+        %127 = OpConstantComposite %9 %117 %71 %117 %71
+        %128 = OpConstantComposite %9 %71 %71 %117 %71
+        %129 = OpConstantComposite %9 %117 %117 %71 %71
+        %130 = OpConstantComposite %9 %71 %117 %71 %71
+        %131 = OpConstantComposite %9 %117 %71 %71 %71
+        %132 = OpConstantComposite %9 %71 %71 %71 %71
+        %133 = OpConstantComposite %116 %118 %119 %120 %121 %122 %123 %124 %125 %118 %126 %127 %128 %129 %130 %131 %132
+        %146 = OpConstant %73 9
+        %149 = OpConstant %73 11
+        %151 = OpConstant %73 16
+        %153 = OpTypePointer Function %116
+        %158 = OpConstant %73 1
+        %164 = OpTypePointer Input %9
+        %165 = OpVariable %164 Input
+        %168 = OpTypeStruct %7
+        %169 = OpTypePointer Uniform %168
+        %170 = OpVariable %169 Uniform
+        %171 = OpTypePointer Uniform %7
+        %176 = OpConstant %6 32
+        %179 = OpTypePointer Output %9
+        %180 = OpVariable %179 Output
+        %184 = OpTypePointer Private %73
+        %185 = OpVariable %184 Private
+        %186 = OpTypeArray %73 %115
+        %187 = OpTypePointer Private %186
+        %188 = OpVariable %187 Private
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+        %163 = OpVariable %8 Function
+        %181 = OpVariable %8 Function
+        %166 = OpLoad %9 %165
+        %167 = OpVectorShuffle %7 %166 %166 0 1
+        %172 = OpAccessChain %171 %170 %76
+        %173 = OpLoad %7 %172
+        %174 = OpFDiv %7 %167 %173
+               OpStore %163 %174
+        %175 = OpLoad %7 %163
+        %177 = OpVectorTimesScalar %7 %175 %176
+        %178 = OpExtInst %7 %1 Floor %177
+               OpStore %163 %178
+        %182 = OpLoad %7 %163
+               OpStore %181 %182
+        %183 = OpFunctionCall %9 %19 %181
+               OpStore %180 %183
+               OpReturn
+               OpFunctionEnd
+         %15 = OpFunction %11 None %12
+         %13 = OpFunctionParameter %8
+         %14 = OpFunctionParameter %10
+         %16 = OpLabel
+         %24 = OpAccessChain %23 %13 %22
+         %25 = OpLoad %6 %24
+         %26 = OpAccessChain %23 %14 %22
+         %27 = OpLoad %6 %26
+         %28 = OpFOrdLessThan %11 %25 %27
+               OpSelectionMerge %30 None
+               OpBranchConditional %28 %29 %30
+         %29 = OpLabel
+               OpReturnValue %31
+         %30 = OpLabel
+         %34 = OpAccessChain %23 %13 %33
+         %35 = OpLoad %6 %34
+         %36 = OpAccessChain %23 %14 %33
+         %37 = OpLoad %6 %36
+         %38 = OpFOrdLessThan %11 %35 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %39 %40
+         %39 = OpLabel
+               OpReturnValue %31
+         %40 = OpLabel
+         %42 = OpAccessChain %23 %13 %22
+         %43 = OpLoad %6 %42
+         %44 = OpAccessChain %23 %14 %22
+         %45 = OpLoad %6 %44
+         %47 = OpAccessChain %23 %14 %46
+         %48 = OpLoad %6 %47
+         %49 = OpFAdd %6 %45 %48
+         %50 = OpFOrdGreaterThan %11 %43 %49
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %51 %52
+         %51 = OpLabel
+               OpReturnValue %31
+         %52 = OpLabel
+         %54 = OpAccessChain %23 %13 %33
+         %55 = OpLoad %6 %54
+         %56 = OpAccessChain %23 %14 %33
+         %57 = OpLoad %6 %56
+         %59 = OpAccessChain %23 %14 %58
+         %60 = OpLoad %6 %59
+         %61 = OpFAdd %6 %57 %60
+         %62 = OpFOrdGreaterThan %11 %55 %61
+               OpSelectionMerge %64 None
+               OpBranchConditional %62 %63 %64
+         %63 = OpLabel
+               OpReturnValue %31
+         %64 = OpLabel
+               OpReturnValue %66
+               OpFunctionEnd
+         %19 = OpFunction %9 None %17
+         %18 = OpFunctionParameter %8
+         %20 = OpLabel
+         %69 = OpVariable %10 Function
+         %75 = OpVariable %74 Function
+        %105 = OpVariable %8 Function
+        %107 = OpVariable %10 Function
+        %109 = OpVariable %108 Function
+        %135 = OpVariable %108 Function
+        %140 = OpVariable %108 Function
+        %154 = OpVariable %153 Function
+               OpStore %69 %72
+               OpStore %75 %76
+               OpBranch %77
+         %77 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %82 = OpLoad %73 %75
+         %84 = OpSLessThan %11 %82 %83
+               OpBranchConditional %84 %78 %79
+         %78 = OpLabel
+        %104 = OpLoad %73 %75
+        %106 = OpLoad %7 %18
+               OpStore %105 %106
+               OpStore %109 %103
+        %110 = OpAccessChain %10 %109 %104
+        %111 = OpLoad %9 %110
+               OpStore %107 %111
+        %112 = OpFunctionCall %11 %15 %105 %107
+               OpSelectionMerge %114 None
+               OpBranchConditional %112 %113 %114
+        %113 = OpLabel
+        %134 = OpLoad %73 %75
+               OpStore %135 %103
+        %136 = OpAccessChain %23 %135 %134 %22
+        %137 = OpLoad %6 %136
+        %138 = OpConvertFToS %73 %137
+        %139 = OpLoad %73 %75
+               OpStore %140 %103
+        %141 = OpAccessChain %23 %140 %139 %33
+        %142 = OpLoad %6 %141
+        %143 = OpConvertFToS %73 %142
+        %144 = OpIMul %73 %138 %143
+        %145 = OpLoad %73 %75
+        %147 = OpIMul %73 %145 %146
+        %148 = OpIAdd %73 %144 %147
+        %150 = OpIAdd %73 %148 %149
+        %152 = OpSMod %73 %150 %151
+               OpStore %154 %133
+        %155 = OpAccessChain %10 %154 %152
+        %156 = OpLoad %9 %155
+               OpStore %69 %156
+               OpBranch %114
+        %114 = OpLabel
+               OpBranch %80
+         %80 = OpLabel
+        %157 = OpLoad %73 %75
+        %159 = OpIAdd %73 %157 %158
+               OpStore %75 %159
+               OpBranch %77
+         %79 = OpLabel
+        %160 = OpLoad %9 %69
+               OpReturnValue %160
+               OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+  ATTACH reference_vertex_shader
+  ATTACH reference_fragment_shader
+  FRAMEBUFFER_SIZE 256 256
+  BIND BUFFER reference_framebuffer AS color LOCATION 0
+  BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0 {
+#  vec2 resolution;
+# };
+# const vec4 pal[16] = vec4[16](vec4(0.0, 0.0, 0.0, 1.0), vec4(0.5, 0.0, 0.0, 1.0), vec4(0.0, 0.5, 0.0, 1.0), vec4(0.5, 0.5, 0.0, 1.0), vec4(0.0, 0.0, 0.5, 1.0), vec4(0.5, 0.0, 0.5, 1.0), vec4(0.0, 0.5, 0.5, 1.0), vec4(0.5, 0.5, 0.5, 1.0), vec4(0.0, 0.0, 0.0, 1.0), vec4(1.0, 0.0, 0.0, 1.0), vec4(0.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0), vec4(0.0, 0.0, 1.0, 1.0), vec4(1.0, 0.0, 1.0, 1.0), vec4(0.0, 1.0, 1.0, 1.0), vec4(1.0, 1.0, 1.0, 1.0));
+#
+# const vec4 picdata[8] = vec4[8](vec4(4, 4, 20, 4), vec4(4, 4, 4, 20), vec4(4, 20, 20, 4), vec4(20, 4, 4, 8), vec4(8, 6, 4, 2), vec4(2, 12, 2, 4), vec4(16, 2, 4, 4), vec4(12, 22, 4, 4));
+#
+# bool collision(vec2 pos, vec4 quad)
+# {
+#  if(pos.x < quad.x)
+#   {
+#    return false;
+#   }
+#  if(pos.y < quad.y)
+#   {
+#    return false;
+#   }
+#  if(pos.x > quad.x + quad.z)
+#   {
+#    return false;
+#   }
+#  if(pos.y > quad.y + quad.w)
+#   {
+#    return false;
+#   }
+#  return true;
+# }
+# vec4 match(vec2 pos)
+# {
+#  int i;
+#  // res == vec4 ( x, 0.5, 1.0, 1.0) where x is the result of the calculation, x == 0.5.
+#  // The end result should be the same as in reference.
+#  vec4 res = vec4(clamp(0.5, 0.5, (gl_FragCoord.x < 0.0) ? -1.0 : (min(gl_FragCoord.x >= 0.0 ? (mix(1.0, 0.5, (gl_FragCoord.x >= 0.0))) : 1.0, 0.5))), 0.5, 1.0, 1.0);
+#  for( i = 0;
+#  i < 8; i ++)
+#   {
+#    if(collision(pos, picdata[i]))
+#     {
+#      res = pal[(int(picdata[i].x) * int(picdata[i].y) + i * 9 + 11) % 16];
+#     }
+#   }
+#  return res;
+# }
+# void main()
+# {
+#  vec2 lin = gl_FragCoord.xy / resolution;
+#  lin = floor(lin * 32.0);
+#  _GLF_color = match(lin.xy);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 208
+; Schema: 0
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main" %72 %204
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 320
+               OpName %4 "main"
+               OpName %15 "collision(vf2;vf4;"
+               OpName %13 "pos"
+               OpName %14 "quad"
+               OpName %19 "match(vf2;"
+               OpName %18 "pos"
+               OpName %69 "res"
+               OpName %72 "gl_FragCoord"
+               OpName %102 "i"
+               OpName %132 "param"
+               OpName %134 "param"
+               OpName %136 "indexable"
+               OpName %161 "indexable"
+               OpName %166 "indexable"
+               OpName %180 "indexable"
+               OpName %189 "lin"
+               OpName %192 "buf0"
+               OpMemberName %192 0 "resolution"
+               OpName %194 ""
+               OpName %204 "_GLF_color"
+               OpName %205 "param"
+               OpDecorate %72 BuiltIn FragCoord
+               OpMemberDecorate %192 0 Offset 0
+               OpDecorate %192 Block
+               OpDecorate %194 DescriptorSet 0
+               OpDecorate %194 Binding 0
+               OpDecorate %204 Location 0
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeFloat 32
+          %7 = OpTypeVector %6 2
+          %8 = OpTypePointer Function %7
+          %9 = OpTypeVector %6 4
+         %10 = OpTypePointer Function %9
+         %11 = OpTypeBool
+         %12 = OpTypeFunction %11 %8 %10
+         %17 = OpTypeFunction %9 %8
+         %21 = OpTypeInt 32 0
+         %22 = OpConstant %21 0
+         %23 = OpTypePointer Function %6
+         %31 = OpConstantFalse %11
+         %33 = OpConstant %21 1
+         %46 = OpConstant %21 2
+         %58 = OpConstant %21 3
+         %66 = OpConstantTrue %11
+         %70 = OpConstant %6 0.5
+         %71 = OpTypePointer Input %9
+         %72 = OpVariable %71 Input
+         %73 = OpTypePointer Input %6
+         %76 = OpConstant %6 0
+         %81 = OpConstant %6 -1
+         %89 = OpConstant %6 1
+        %100 = OpTypeInt 32 1
+        %101 = OpTypePointer Function %100
+        %103 = OpConstant %100 0
+        %110 = OpConstant %100 8
+        %112 = OpConstant %21 8
+        %113 = OpTypeArray %9 %112
+        %114 = OpConstant %6 4
+        %115 = OpConstant %6 20
+        %116 = OpConstantComposite %9 %114 %114 %115 %114
+        %117 = OpConstantComposite %9 %114 %114 %114 %115
+        %118 = OpConstantComposite %9 %114 %115 %115 %114
+        %119 = OpConstant %6 8
+        %120 = OpConstantComposite %9 %115 %114 %114 %119
+        %121 = OpConstant %6 6
+        %122 = OpConstant %6 2
+        %123 = OpConstantComposite %9 %119 %121 %114 %122
+        %124 = OpConstant %6 12
+        %125 = OpConstantComposite %9 %122 %124 %122 %114
+        %126 = OpConstant %6 16
+        %127 = OpConstantComposite %9 %126 %122 %114 %114
+        %128 = OpConstant %6 22
+        %129 = OpConstantComposite %9 %124 %128 %114 %114
+        %130 = OpConstantComposite %113 %116 %117 %118 %120 %123 %125 %127 %129
+        %135 = OpTypePointer Function %113
+        %142 = OpConstant %21 16
+        %143 = OpTypeArray %9 %142
+        %144 = OpConstantComposite %9 %76 %76 %76 %89
+        %145 = OpConstantComposite %9 %70 %76 %76 %89
+        %146 = OpConstantComposite %9 %76 %70 %76 %89
+        %147 = OpConstantComposite %9 %70 %70 %76 %89
+        %148 = OpConstantComposite %9 %76 %76 %70 %89
+        %149 = OpConstantComposite %9 %70 %76 %70 %89
+        %150 = OpConstantComposite %9 %76 %70 %70 %89
+        %151 = OpConstantComposite %9 %70 %70 %70 %89
+        %152 = OpConstantComposite %9 %89 %76 %76 %89
+        %153 = OpConstantComposite %9 %76 %89 %76 %89
+        %154 = OpConstantComposite %9 %89 %89 %76 %89
+        %155 = OpConstantComposite %9 %76 %76 %89 %89
+        %156 = OpConstantComposite %9 %89 %76 %89 %89
+        %157 = OpConstantComposite %9 %76 %89 %89 %89
+        %158 = OpConstantComposite %9 %89 %89 %89 %89
+        %159 = OpConstantComposite %143 %144 %145 %146 %147 %148 %149 %150 %151 %144 %152 %153 %154 %155 %156 %157 %158
+        %172 = OpConstant %100 9
+        %175 = OpConstant %100 11
+        %177 = OpConstant %100 16
+        %179 = OpTypePointer Function %143
+        %184 = OpConstant %100 1
+        %192 = OpTypeStruct %7
+        %193 = OpTypePointer Uniform %192
+        %194 = OpVariable %193 Uniform
+        %195 = OpTypePointer Uniform %7
+        %200 = OpConstant %6 32
+        %203 = OpTypePointer Output %9
+        %204 = OpVariable %203 Output
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+        %189 = OpVariable %8 Function
+        %205 = OpVariable %8 Function
+        %190 = OpLoad %9 %72
+        %191 = OpVectorShuffle %7 %190 %190 0 1
+        %196 = OpAccessChain %195 %194 %103
+        %197 = OpLoad %7 %196
+        %198 = OpFDiv %7 %191 %197
+               OpStore %189 %198
+        %199 = OpLoad %7 %189
+        %201 = OpVectorTimesScalar %7 %199 %200
+        %202 = OpExtInst %7 %1 Floor %201
+               OpStore %189 %202
+        %206 = OpLoad %7 %189
+               OpStore %205 %206
+        %207 = OpFunctionCall %9 %19 %205
+               OpStore %204 %207
+               OpReturn
+               OpFunctionEnd
+         %15 = OpFunction %11 None %12
+         %13 = OpFunctionParameter %8
+         %14 = OpFunctionParameter %10
+         %16 = OpLabel
+         %24 = OpAccessChain %23 %13 %22
+         %25 = OpLoad %6 %24
+         %26 = OpAccessChain %23 %14 %22
+         %27 = OpLoad %6 %26
+         %28 = OpFOrdLessThan %11 %25 %27
+               OpSelectionMerge %30 None
+               OpBranchConditional %28 %29 %30
+         %29 = OpLabel
+               OpReturnValue %31
+         %30 = OpLabel
+         %34 = OpAccessChain %23 %13 %33
+         %35 = OpLoad %6 %34
+         %36 = OpAccessChain %23 %14 %33
+         %37 = OpLoad %6 %36
+         %38 = OpFOrdLessThan %11 %35 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %39 %40
+         %39 = OpLabel
+               OpReturnValue %31
+         %40 = OpLabel
+         %42 = OpAccessChain %23 %13 %22
+         %43 = OpLoad %6 %42
+         %44 = OpAccessChain %23 %14 %22
+         %45 = OpLoad %6 %44
+         %47 = OpAccessChain %23 %14 %46
+         %48 = OpLoad %6 %47
+         %49 = OpFAdd %6 %45 %48
+         %50 = OpFOrdGreaterThan %11 %43 %49
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %51 %52
+         %51 = OpLabel
+               OpReturnValue %31
+         %52 = OpLabel
+         %54 = OpAccessChain %23 %13 %33
+         %55 = OpLoad %6 %54
+         %56 = OpAccessChain %23 %14 %33
+         %57 = OpLoad %6 %56
+         %59 = OpAccessChain %23 %14 %58
+         %60 = OpLoad %6 %59
+         %61 = OpFAdd %6 %57 %60
+         %62 = OpFOrdGreaterThan %11 %55 %61
+               OpSelectionMerge %64 None
+               OpBranchConditional %62 %63 %64
+         %63 = OpLabel
+               OpReturnValue %31
+         %64 = OpLabel
+               OpReturnValue %66
+               OpFunctionEnd
+         %19 = OpFunction %9 None %17
+         %18 = OpFunctionParameter %8
+         %20 = OpLabel
+         %69 = OpVariable %10 Function
+         %78 = OpVariable %23 Function
+         %86 = OpVariable %23 Function
+        %102 = OpVariable %101 Function
+        %132 = OpVariable %8 Function
+        %134 = OpVariable %10 Function
+        %136 = OpVariable %135 Function
+        %161 = OpVariable %135 Function
+        %166 = OpVariable %135 Function
+        %180 = OpVariable %179 Function
+         %74 = OpAccessChain %73 %72 %22
+         %75 = OpLoad %6 %74
+         %77 = OpFOrdLessThan %11 %75 %76
+               OpSelectionMerge %80 None
+               OpBranchConditional %77 %79 %82
+         %79 = OpLabel
+               OpStore %78 %81
+               OpBranch %80
+         %82 = OpLabel
+         %83 = OpAccessChain %73 %72 %22
+         %84 = OpLoad %6 %83
+         %85 = OpFOrdGreaterThanEqual %11 %84 %76
+               OpSelectionMerge %88 None
+               OpBranchConditional %85 %87 %94
+         %87 = OpLabel
+         %90 = OpAccessChain %73 %72 %22
+         %91 = OpLoad %6 %90
+         %92 = OpFOrdGreaterThanEqual %11 %91 %76
+         %93 = OpSelect %6 %92 %70 %89
+               OpStore %86 %93
+               OpBranch %88
+         %94 = OpLabel
+               OpStore %86 %89
+               OpBranch %88
+         %88 = OpLabel
+         %95 = OpLoad %6 %86
+         %96 = OpExtInst %6 %1 FMin %95 %70
+               OpStore %78 %96
+               OpBranch %80
+         %80 = OpLabel
+         %97 = OpLoad %6 %78
+         %98 = OpExtInst %6 %1 FClamp %70 %70 %97
+         %99 = OpCompositeConstruct %9 %98 %70 %89 %89
+               OpStore %69 %99
+               OpStore %102 %103
+               OpBranch %104
+        %104 = OpLabel
+               OpLoopMerge %106 %107 None
+               OpBranch %108
+        %108 = OpLabel
+        %109 = OpLoad %100 %102
+        %111 = OpSLessThan %11 %109 %110
+               OpBranchConditional %111 %105 %106
+        %105 = OpLabel
+        %131 = OpLoad %100 %102
+        %133 = OpLoad %7 %18
+               OpStore %132 %133
+               OpStore %136 %130
+        %137 = OpAccessChain %10 %136 %131
+        %138 = OpLoad %9 %137
+               OpStore %134 %138
+        %139 = OpFunctionCall %11 %15 %132 %134
+               OpSelectionMerge %141 None
+               OpBranchConditional %139 %140 %141
+        %140 = OpLabel
+        %160 = OpLoad %100 %102
+               OpStore %161 %130
+        %162 = OpAccessChain %23 %161 %160 %22
+        %163 = OpLoad %6 %162
+        %164 = OpConvertFToS %100 %163
+        %165 = OpLoad %100 %102
+               OpStore %166 %130
+        %167 = OpAccessChain %23 %166 %165 %33
+        %168 = OpLoad %6 %167
+        %169 = OpConvertFToS %100 %168
+        %170 = OpIMul %100 %164 %169
+        %171 = OpLoad %100 %102
+        %173 = OpIMul %100 %171 %172
+        %174 = OpIAdd %100 %170 %173
+        %176 = OpIAdd %100 %174 %175
+        %178 = OpSMod %100 %176 %177
+               OpStore %180 %159
+        %181 = OpAccessChain %10 %180 %178
+        %182 = OpLoad %9 %181
+               OpStore %69 %182
+               OpBranch %141
+        %141 = OpLabel
+               OpBranch %107
+        %107 = OpLabel
+        %183 = OpLoad %100 %102
+        %185 = OpIAdd %100 %183 %184
+               OpStore %102 %185
+               OpBranch %104
+        %106 = OpLabel
+        %186 = OpLoad %9 %69
+               OpReturnValue %186
+               OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> DATA
+ 256.0 256.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_resolution 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 reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
index ea2b2f2..dc27d45 100644 (file)
@@ -688487,6 +688487,7 @@ dEQP-VK.graphicsfuzz.set-color-in-one-iteration-while-loop
 dEQP-VK.graphicsfuzz.similar-nested-ifs
 dEQP-VK.graphicsfuzz.smoothstep-after-loop
 dEQP-VK.graphicsfuzz.stable-binarysearch-tree-with-loop-read-write-global
+dEQP-VK.graphicsfuzz.stable-rects-vec4-clamp-conditional-min-mix
 dEQP-VK.graphicsfuzz.struct-and-unreachable-infinite-loop
 dEQP-VK.graphicsfuzz.struct-array-data-as-loop-iterator
 dEQP-VK.graphicsfuzz.struct-controlled-loop