1#!amber 2 3# Copyright 2020 Google LLC 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16 17 18# A test for a bug found by GraphicsFuzz. 19 20# Short description: A fragment shader with nested conditional float in clamp 21 22# The test passes because both shaders render the same imgae. 23 24SHADER vertex reference_vertex_shader PASSTHROUGH 25 26# reference_fragment_shader is derived from the following GLSL: 27# #version 320 es 28# precision highp float; 29# 30# precision highp int; 31# 32# layout(location = 0) out vec4 _GLF_color; 33# 34# layout(set = 0, binding = 0) uniform buf0 35# { 36# vec2 resolution; 37# }; 38# float cross2d(vec2 a, vec2 b) 39# { 40# return ((a.x) * (b.y) - (b.x) * (a.y)); 41# } 42# int pointInTriangle(vec2 p, vec2 a, vec2 b, vec2 c) 43# { 44# float pab = cross2d(vec2(p.x - a.x, p.y - a.y), vec2(b.x - a.x, b.y - a.y)); 45# float pbc = cross2d(vec2(p.x - b.x, p.y - b.y), vec2(c.x - b.x, c.y - b.y)); 46# if (!((pab < 0.0 && pbc < 0.0) || (pab >= 0.0 && pbc >= 0.0))) 47# { 48# return 0; 49# } 50# float pca = cross2d(vec2(p.x - c.x, p.y - c.y), vec2(a.x - c.x, a.y - c.y)); 51# if (!((pab < 0.0 && pca < 0.0) || (pab >= 0.0 && pca >= 0.0))) 52# { 53# return 0; 54# } 55# return 1; 56# } 57# void main() 58# { 59# vec2 pos = gl_FragCoord.xy / resolution; 60# if (pointInTriangle(pos, vec2(0.7, 0.3), vec2(0.5, 0.9), vec2(0.1, 0.4)) == 1) 61# { 62# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); 63# } 64# else 65# { 66# _GLF_color = vec4(0.0, 0.0, 0.0, 1.0); 67# } 68# } 69SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 70; SPIR-V 71; Version: 1.0 72; Generator: Khronos Glslang Reference Front End; 10 73; Bound: 196 74; Schema: 0 75 OpCapability Shader 76 %1 = OpExtInstImport "GLSL.std.450" 77 OpMemoryModel Logical GLSL450 78 OpEntryPoint Fragment %4 "main" %162 %191 79 OpExecutionMode %4 OriginUpperLeft 80 OpSource ESSL 320 81 OpName %4 "main" 82 OpName %12 "cross2d(vf2;vf2;" 83 OpName %10 "a" 84 OpName %11 "b" 85 OpName %20 "pointInTriangle(vf2;vf2;vf2;vf2;" 86 OpName %16 "p" 87 OpName %17 "a" 88 OpName %18 "b" 89 OpName %19 "c" 90 OpName %39 "pab" 91 OpName %62 "param" 92 OpName %63 "param" 93 OpName %65 "pbc" 94 OpName %88 "param" 95 OpName %89 "param" 96 OpName %112 "pca" 97 OpName %135 "param" 98 OpName %136 "param" 99 OpName %159 "pos" 100 OpName %162 "gl_FragCoord" 101 OpName %165 "buf0" 102 OpMemberName %165 0 "resolution" 103 OpName %167 "" 104 OpName %181 "param" 105 OpName %183 "param" 106 OpName %184 "param" 107 OpName %185 "param" 108 OpName %191 "_GLF_color" 109 OpDecorate %162 BuiltIn FragCoord 110 OpMemberDecorate %165 0 Offset 0 111 OpDecorate %165 Block 112 OpDecorate %167 DescriptorSet 0 113 OpDecorate %167 Binding 0 114 OpDecorate %191 Location 0 115 %2 = OpTypeVoid 116 %3 = OpTypeFunction %2 117 %6 = OpTypeFloat 32 118 %7 = OpTypeVector %6 2 119 %8 = OpTypePointer Function %7 120 %9 = OpTypeFunction %6 %8 %8 121 %14 = OpTypeInt 32 1 122 %15 = OpTypeFunction %14 %8 %8 %8 %8 123 %22 = OpTypeInt 32 0 124 %23 = OpConstant %22 0 125 %24 = OpTypePointer Function %6 126 %27 = OpConstant %22 1 127 %91 = OpTypeBool 128 %93 = OpConstant %6 0 129 %110 = OpConstant %14 0 130 %156 = OpConstant %14 1 131 %160 = OpTypeVector %6 4 132 %161 = OpTypePointer Input %160 133 %162 = OpVariable %161 Input 134 %165 = OpTypeStruct %7 135 %166 = OpTypePointer Uniform %165 136 %167 = OpVariable %166 Uniform 137 %168 = OpTypePointer Uniform %7 138 %172 = OpConstant %6 0.699999988 139 %173 = OpConstant %6 0.300000012 140 %174 = OpConstantComposite %7 %172 %173 141 %175 = OpConstant %6 0.5 142 %176 = OpConstant %6 0.899999976 143 %177 = OpConstantComposite %7 %175 %176 144 %178 = OpConstant %6 0.100000001 145 %179 = OpConstant %6 0.400000006 146 %180 = OpConstantComposite %7 %178 %179 147 %190 = OpTypePointer Output %160 148 %191 = OpVariable %190 Output 149 %192 = OpConstant %6 1 150 %193 = OpConstantComposite %160 %192 %93 %93 %192 151 %195 = OpConstantComposite %160 %93 %93 %93 %192 152 %4 = OpFunction %2 None %3 153 %5 = OpLabel 154 %159 = OpVariable %8 Function 155 %181 = OpVariable %8 Function 156 %183 = OpVariable %8 Function 157 %184 = OpVariable %8 Function 158 %185 = OpVariable %8 Function 159 %163 = OpLoad %160 %162 160 %164 = OpVectorShuffle %7 %163 %163 0 1 161 %169 = OpAccessChain %168 %167 %110 162 %170 = OpLoad %7 %169 163 %171 = OpFDiv %7 %164 %170 164 OpStore %159 %171 165 %182 = OpLoad %7 %159 166 OpStore %181 %182 167 OpStore %183 %174 168 OpStore %184 %177 169 OpStore %185 %180 170 %186 = OpFunctionCall %14 %20 %181 %183 %184 %185 171 %187 = OpIEqual %91 %186 %156 172 OpSelectionMerge %189 None 173 OpBranchConditional %187 %188 %194 174 %188 = OpLabel 175 OpStore %191 %193 176 OpBranch %189 177 %194 = OpLabel 178 OpStore %191 %195 179 OpBranch %189 180 %189 = OpLabel 181 OpReturn 182 OpFunctionEnd 183 %12 = OpFunction %6 None %9 184 %10 = OpFunctionParameter %8 185 %11 = OpFunctionParameter %8 186 %13 = OpLabel 187 %25 = OpAccessChain %24 %10 %23 188 %26 = OpLoad %6 %25 189 %28 = OpAccessChain %24 %11 %27 190 %29 = OpLoad %6 %28 191 %30 = OpFMul %6 %26 %29 192 %31 = OpAccessChain %24 %11 %23 193 %32 = OpLoad %6 %31 194 %33 = OpAccessChain %24 %10 %27 195 %34 = OpLoad %6 %33 196 %35 = OpFMul %6 %32 %34 197 %36 = OpFSub %6 %30 %35 198 OpReturnValue %36 199 OpFunctionEnd 200 %20 = OpFunction %14 None %15 201 %16 = OpFunctionParameter %8 202 %17 = OpFunctionParameter %8 203 %18 = OpFunctionParameter %8 204 %19 = OpFunctionParameter %8 205 %21 = OpLabel 206 %39 = OpVariable %24 Function 207 %62 = OpVariable %8 Function 208 %63 = OpVariable %8 Function 209 %65 = OpVariable %24 Function 210 %88 = OpVariable %8 Function 211 %89 = OpVariable %8 Function 212 %112 = OpVariable %24 Function 213 %135 = OpVariable %8 Function 214 %136 = OpVariable %8 Function 215 %40 = OpAccessChain %24 %16 %23 216 %41 = OpLoad %6 %40 217 %42 = OpAccessChain %24 %17 %23 218 %43 = OpLoad %6 %42 219 %44 = OpFSub %6 %41 %43 220 %45 = OpAccessChain %24 %16 %27 221 %46 = OpLoad %6 %45 222 %47 = OpAccessChain %24 %17 %27 223 %48 = OpLoad %6 %47 224 %49 = OpFSub %6 %46 %48 225 %50 = OpCompositeConstruct %7 %44 %49 226 %51 = OpAccessChain %24 %18 %23 227 %52 = OpLoad %6 %51 228 %53 = OpAccessChain %24 %17 %23 229 %54 = OpLoad %6 %53 230 %55 = OpFSub %6 %52 %54 231 %56 = OpAccessChain %24 %18 %27 232 %57 = OpLoad %6 %56 233 %58 = OpAccessChain %24 %17 %27 234 %59 = OpLoad %6 %58 235 %60 = OpFSub %6 %57 %59 236 %61 = OpCompositeConstruct %7 %55 %60 237 OpStore %62 %50 238 OpStore %63 %61 239 %64 = OpFunctionCall %6 %12 %62 %63 240 OpStore %39 %64 241 %66 = OpAccessChain %24 %16 %23 242 %67 = OpLoad %6 %66 243 %68 = OpAccessChain %24 %18 %23 244 %69 = OpLoad %6 %68 245 %70 = OpFSub %6 %67 %69 246 %71 = OpAccessChain %24 %16 %27 247 %72 = OpLoad %6 %71 248 %73 = OpAccessChain %24 %18 %27 249 %74 = OpLoad %6 %73 250 %75 = OpFSub %6 %72 %74 251 %76 = OpCompositeConstruct %7 %70 %75 252 %77 = OpAccessChain %24 %19 %23 253 %78 = OpLoad %6 %77 254 %79 = OpAccessChain %24 %18 %23 255 %80 = OpLoad %6 %79 256 %81 = OpFSub %6 %78 %80 257 %82 = OpAccessChain %24 %19 %27 258 %83 = OpLoad %6 %82 259 %84 = OpAccessChain %24 %18 %27 260 %85 = OpLoad %6 %84 261 %86 = OpFSub %6 %83 %85 262 %87 = OpCompositeConstruct %7 %81 %86 263 OpStore %88 %76 264 OpStore %89 %87 265 %90 = OpFunctionCall %6 %12 %88 %89 266 OpStore %65 %90 267 %92 = OpLoad %6 %39 268 %94 = OpFOrdLessThan %91 %92 %93 269 %95 = OpLoad %6 %65 270 %96 = OpFOrdLessThan %91 %95 %93 271 %97 = OpLogicalAnd %91 %94 %96 272 %98 = OpLogicalNot %91 %97 273 OpSelectionMerge %100 None 274 OpBranchConditional %98 %99 %100 275 %99 = OpLabel 276 %101 = OpLoad %6 %39 277 %102 = OpFOrdGreaterThanEqual %91 %101 %93 278 %103 = OpLoad %6 %65 279 %104 = OpFOrdGreaterThanEqual %91 %103 %93 280 %105 = OpLogicalAnd %91 %102 %104 281 OpBranch %100 282 %100 = OpLabel 283 %106 = OpPhi %91 %97 %21 %105 %99 284 %107 = OpLogicalNot %91 %106 285 OpSelectionMerge %109 None 286 OpBranchConditional %107 %108 %109 287 %108 = OpLabel 288 OpReturnValue %110 289 %109 = OpLabel 290 %113 = OpAccessChain %24 %16 %23 291 %114 = OpLoad %6 %113 292 %115 = OpAccessChain %24 %19 %23 293 %116 = OpLoad %6 %115 294 %117 = OpFSub %6 %114 %116 295 %118 = OpAccessChain %24 %16 %27 296 %119 = OpLoad %6 %118 297 %120 = OpAccessChain %24 %19 %27 298 %121 = OpLoad %6 %120 299 %122 = OpFSub %6 %119 %121 300 %123 = OpCompositeConstruct %7 %117 %122 301 %124 = OpAccessChain %24 %17 %23 302 %125 = OpLoad %6 %124 303 %126 = OpAccessChain %24 %19 %23 304 %127 = OpLoad %6 %126 305 %128 = OpFSub %6 %125 %127 306 %129 = OpAccessChain %24 %17 %27 307 %130 = OpLoad %6 %129 308 %131 = OpAccessChain %24 %19 %27 309 %132 = OpLoad %6 %131 310 %133 = OpFSub %6 %130 %132 311 %134 = OpCompositeConstruct %7 %128 %133 312 OpStore %135 %123 313 OpStore %136 %134 314 %137 = OpFunctionCall %6 %12 %135 %136 315 OpStore %112 %137 316 %138 = OpLoad %6 %39 317 %139 = OpFOrdLessThan %91 %138 %93 318 %140 = OpLoad %6 %112 319 %141 = OpFOrdLessThan %91 %140 %93 320 %142 = OpLogicalAnd %91 %139 %141 321 %143 = OpLogicalNot %91 %142 322 OpSelectionMerge %145 None 323 OpBranchConditional %143 %144 %145 324 %144 = OpLabel 325 %146 = OpLoad %6 %39 326 %147 = OpFOrdGreaterThanEqual %91 %146 %93 327 %148 = OpLoad %6 %112 328 %149 = OpFOrdGreaterThanEqual %91 %148 %93 329 %150 = OpLogicalAnd %91 %147 %149 330 OpBranch %145 331 %145 = OpLabel 332 %151 = OpPhi %91 %142 %109 %150 %144 333 %152 = OpLogicalNot %91 %151 334 OpSelectionMerge %154 None 335 OpBranchConditional %152 %153 %154 336 %153 = OpLabel 337 OpReturnValue %110 338 %154 = OpLabel 339 OpReturnValue %156 340 OpFunctionEnd 341END 342 343# uniforms for reference 344 345# resolution 346BUFFER reference_resolution DATA_TYPE vec2<float> DATA 347 256.0 256.0 348END 349 350BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM 351 352PIPELINE graphics reference_pipeline 353 ATTACH reference_vertex_shader 354 ATTACH reference_fragment_shader 355 FRAMEBUFFER_SIZE 256 256 356 BIND BUFFER reference_framebuffer AS color LOCATION 0 357 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 358END 359CLEAR_COLOR reference_pipeline 0 0 0 255 360 361CLEAR reference_pipeline 362RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256 363 364 365SHADER vertex variant_vertex_shader PASSTHROUGH 366 367# variant_fragment_shader is derived from the following GLSL: 368# #version 320 es 369# precision highp float; 370# 371# precision highp int; 372# 373# layout(push_constant) uniform buf_push 374# { 375# vec2 injectionSwitch; // x == 0.0, y == 1.0 376# }; 377# layout(location = 0) out vec4 _GLF_color; 378# 379# layout(set = 0, binding = 0) uniform buf0 380# { 381# vec2 resolution; 382# }; 383# float cross2d(vec2 a, vec2 b) 384# { 385# return ((a.x) * (b.y) - (b.x) * (a.y)); 386# } 387# int pointInTriangle(vec2 p, vec2 a, vec2 b, vec2 c) 388# { 389# float pab = cross2d(vec2(p.x - a.x, p.y - a.y), vec2(b.x - a.x, b.y - a.y)); 390# float pbc = cross2d(vec2(p.x - b.x, p.y - b.y), vec2(c.x - b.x, c.y - b.y)); 391# if (!((pab < 0.0 && pbc < 0.0) || (pab >= 0.0 && pbc >= 0.0))) 392# { 393# return 0; 394# } 395# float pca = cross2d(vec2(p.x - c.x, p.y - c.y), vec2(a.x - c.x, a.y - c.y)); 396# if (!((pab < 0.0 && pca < 0.0) || (pab >= 0.0 && pca >= 0.0))) 397# { 398# return 0; 399# } 400# return 1; 401# } 402# void main() 403# { 404# // float_b == 0.4 405# float float_b = ((gl_FragCoord.x >= 0.0) ? (true ? 0.4 : (float(injectionSwitch.y))) : (-1.0)); 406# // float_a == 0.4 407# float float_a = (float(clamp(0.4, 0.4, float_b))); 408# vec2 pos = gl_FragCoord.xy / resolution; 409# if ((pointInTriangle(pos, vec2(0.7, 0.3), vec2(0.5, 0.9), vec2(0.1, float_a))) == 1) 410# { 411# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); 412# } 413# else 414# { 415# _GLF_color = vec4(0.0, 0.0, 0.0, 1.0); 416# } 417# } 418SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 419; SPIR-V 420; Version: 1.0 421; Generator: Khronos Glslang Reference Front End; 10 422; Bound: 223 423; Schema: 0 424 OpCapability Shader 425 %1 = OpExtInstImport "GLSL.std.450" 426 OpMemoryModel Logical GLSL450 427 OpEntryPoint Fragment %4 "main" %162 %218 428 OpExecutionMode %4 OriginUpperLeft 429 OpSource ESSL 320 430 OpName %4 "main" 431 OpName %12 "cross2d(vf2;vf2;" 432 OpName %10 "a" 433 OpName %11 "b" 434 OpName %20 "pointInTriangle(vf2;vf2;vf2;vf2;" 435 OpName %16 "p" 436 OpName %17 "a" 437 OpName %18 "b" 438 OpName %19 "c" 439 OpName %39 "pab" 440 OpName %62 "param" 441 OpName %63 "param" 442 OpName %65 "pbc" 443 OpName %88 "param" 444 OpName %89 "param" 445 OpName %112 "pca" 446 OpName %135 "param" 447 OpName %136 "param" 448 OpName %159 "float_b" 449 OpName %162 "gl_FragCoord" 450 OpName %176 "buf_push" 451 OpMemberName %176 0 "injectionSwitch" 452 OpName %178 "" 453 OpName %186 "float_a" 454 OpName %189 "pos" 455 OpName %192 "buf0" 456 OpMemberName %192 0 "resolution" 457 OpName %194 "" 458 OpName %208 "param" 459 OpName %210 "param" 460 OpName %211 "param" 461 OpName %212 "param" 462 OpName %218 "_GLF_color" 463 OpDecorate %162 BuiltIn FragCoord 464 OpMemberDecorate %176 0 Offset 0 465 OpDecorate %176 Block 466 OpMemberDecorate %192 0 Offset 0 467 OpDecorate %192 Block 468 OpDecorate %194 DescriptorSet 0 469 OpDecorate %194 Binding 0 470 OpDecorate %218 Location 0 471 %2 = OpTypeVoid 472 %3 = OpTypeFunction %2 473 %6 = OpTypeFloat 32 474 %7 = OpTypeVector %6 2 475 %8 = OpTypePointer Function %7 476 %9 = OpTypeFunction %6 %8 %8 477 %14 = OpTypeInt 32 1 478 %15 = OpTypeFunction %14 %8 %8 %8 %8 479 %22 = OpTypeInt 32 0 480 %23 = OpConstant %22 0 481 %24 = OpTypePointer Function %6 482 %27 = OpConstant %22 1 483 %91 = OpTypeBool 484 %93 = OpConstant %6 0 485 %110 = OpConstant %14 0 486 %156 = OpConstant %14 1 487 %160 = OpTypeVector %6 4 488 %161 = OpTypePointer Input %160 489 %162 = OpVariable %161 Input 490 %163 = OpTypePointer Input %6 491 %170 = OpConstantTrue %91 492 %174 = OpConstant %6 0.400000006 493 %176 = OpTypeStruct %7 494 %177 = OpTypePointer PushConstant %176 495 %178 = OpVariable %177 PushConstant 496 %179 = OpTypePointer PushConstant %6 497 %184 = OpConstant %6 -1 498 %192 = OpTypeStruct %7 499 %193 = OpTypePointer Uniform %192 500 %194 = OpVariable %193 Uniform 501 %195 = OpTypePointer Uniform %7 502 %199 = OpConstant %6 0.699999988 503 %200 = OpConstant %6 0.300000012 504 %201 = OpConstantComposite %7 %199 %200 505 %202 = OpConstant %6 0.5 506 %203 = OpConstant %6 0.899999976 507 %204 = OpConstantComposite %7 %202 %203 508 %205 = OpConstant %6 0.100000001 509 %217 = OpTypePointer Output %160 510 %218 = OpVariable %217 Output 511 %219 = OpConstant %6 1 512 %220 = OpConstantComposite %160 %219 %93 %93 %219 513 %222 = OpConstantComposite %160 %93 %93 %93 %219 514 %4 = OpFunction %2 None %3 515 %5 = OpLabel 516 %159 = OpVariable %24 Function 517 %167 = OpVariable %24 Function 518 %171 = OpVariable %24 Function 519 %186 = OpVariable %24 Function 520 %189 = OpVariable %8 Function 521 %208 = OpVariable %8 Function 522 %210 = OpVariable %8 Function 523 %211 = OpVariable %8 Function 524 %212 = OpVariable %8 Function 525 %164 = OpAccessChain %163 %162 %23 526 %165 = OpLoad %6 %164 527 %166 = OpFOrdGreaterThanEqual %91 %165 %93 528 OpSelectionMerge %169 None 529 OpBranchConditional %166 %168 %183 530 %168 = OpLabel 531 OpSelectionMerge %173 None 532 OpBranchConditional %170 %172 %175 533 %172 = OpLabel 534 OpStore %171 %174 535 OpBranch %173 536 %175 = OpLabel 537 %180 = OpAccessChain %179 %178 %110 %27 538 %181 = OpLoad %6 %180 539 OpStore %171 %181 540 OpBranch %173 541 %173 = OpLabel 542 %182 = OpLoad %6 %171 543 OpStore %167 %182 544 OpBranch %169 545 %183 = OpLabel 546 OpStore %167 %184 547 OpBranch %169 548 %169 = OpLabel 549 %185 = OpLoad %6 %167 550 OpStore %159 %185 551 %187 = OpLoad %6 %159 552 %188 = OpExtInst %6 %1 FClamp %174 %174 %187 553 OpStore %186 %188 554 %190 = OpLoad %160 %162 555 %191 = OpVectorShuffle %7 %190 %190 0 1 556 %196 = OpAccessChain %195 %194 %110 557 %197 = OpLoad %7 %196 558 %198 = OpFDiv %7 %191 %197 559 OpStore %189 %198 560 %206 = OpLoad %6 %186 561 %207 = OpCompositeConstruct %7 %205 %206 562 %209 = OpLoad %7 %189 563 OpStore %208 %209 564 OpStore %210 %201 565 OpStore %211 %204 566 OpStore %212 %207 567 %213 = OpFunctionCall %14 %20 %208 %210 %211 %212 568 %214 = OpIEqual %91 %213 %156 569 OpSelectionMerge %216 None 570 OpBranchConditional %214 %215 %221 571 %215 = OpLabel 572 OpStore %218 %220 573 OpBranch %216 574 %221 = OpLabel 575 OpStore %218 %222 576 OpBranch %216 577 %216 = OpLabel 578 OpReturn 579 OpFunctionEnd 580 %12 = OpFunction %6 None %9 581 %10 = OpFunctionParameter %8 582 %11 = OpFunctionParameter %8 583 %13 = OpLabel 584 %25 = OpAccessChain %24 %10 %23 585 %26 = OpLoad %6 %25 586 %28 = OpAccessChain %24 %11 %27 587 %29 = OpLoad %6 %28 588 %30 = OpFMul %6 %26 %29 589 %31 = OpAccessChain %24 %11 %23 590 %32 = OpLoad %6 %31 591 %33 = OpAccessChain %24 %10 %27 592 %34 = OpLoad %6 %33 593 %35 = OpFMul %6 %32 %34 594 %36 = OpFSub %6 %30 %35 595 OpReturnValue %36 596 OpFunctionEnd 597 %20 = OpFunction %14 None %15 598 %16 = OpFunctionParameter %8 599 %17 = OpFunctionParameter %8 600 %18 = OpFunctionParameter %8 601 %19 = OpFunctionParameter %8 602 %21 = OpLabel 603 %39 = OpVariable %24 Function 604 %62 = OpVariable %8 Function 605 %63 = OpVariable %8 Function 606 %65 = OpVariable %24 Function 607 %88 = OpVariable %8 Function 608 %89 = OpVariable %8 Function 609 %112 = OpVariable %24 Function 610 %135 = OpVariable %8 Function 611 %136 = OpVariable %8 Function 612 %40 = OpAccessChain %24 %16 %23 613 %41 = OpLoad %6 %40 614 %42 = OpAccessChain %24 %17 %23 615 %43 = OpLoad %6 %42 616 %44 = OpFSub %6 %41 %43 617 %45 = OpAccessChain %24 %16 %27 618 %46 = OpLoad %6 %45 619 %47 = OpAccessChain %24 %17 %27 620 %48 = OpLoad %6 %47 621 %49 = OpFSub %6 %46 %48 622 %50 = OpCompositeConstruct %7 %44 %49 623 %51 = OpAccessChain %24 %18 %23 624 %52 = OpLoad %6 %51 625 %53 = OpAccessChain %24 %17 %23 626 %54 = OpLoad %6 %53 627 %55 = OpFSub %6 %52 %54 628 %56 = OpAccessChain %24 %18 %27 629 %57 = OpLoad %6 %56 630 %58 = OpAccessChain %24 %17 %27 631 %59 = OpLoad %6 %58 632 %60 = OpFSub %6 %57 %59 633 %61 = OpCompositeConstruct %7 %55 %60 634 OpStore %62 %50 635 OpStore %63 %61 636 %64 = OpFunctionCall %6 %12 %62 %63 637 OpStore %39 %64 638 %66 = OpAccessChain %24 %16 %23 639 %67 = OpLoad %6 %66 640 %68 = OpAccessChain %24 %18 %23 641 %69 = OpLoad %6 %68 642 %70 = OpFSub %6 %67 %69 643 %71 = OpAccessChain %24 %16 %27 644 %72 = OpLoad %6 %71 645 %73 = OpAccessChain %24 %18 %27 646 %74 = OpLoad %6 %73 647 %75 = OpFSub %6 %72 %74 648 %76 = OpCompositeConstruct %7 %70 %75 649 %77 = OpAccessChain %24 %19 %23 650 %78 = OpLoad %6 %77 651 %79 = OpAccessChain %24 %18 %23 652 %80 = OpLoad %6 %79 653 %81 = OpFSub %6 %78 %80 654 %82 = OpAccessChain %24 %19 %27 655 %83 = OpLoad %6 %82 656 %84 = OpAccessChain %24 %18 %27 657 %85 = OpLoad %6 %84 658 %86 = OpFSub %6 %83 %85 659 %87 = OpCompositeConstruct %7 %81 %86 660 OpStore %88 %76 661 OpStore %89 %87 662 %90 = OpFunctionCall %6 %12 %88 %89 663 OpStore %65 %90 664 %92 = OpLoad %6 %39 665 %94 = OpFOrdLessThan %91 %92 %93 666 %95 = OpLoad %6 %65 667 %96 = OpFOrdLessThan %91 %95 %93 668 %97 = OpLogicalAnd %91 %94 %96 669 %98 = OpLogicalNot %91 %97 670 OpSelectionMerge %100 None 671 OpBranchConditional %98 %99 %100 672 %99 = OpLabel 673 %101 = OpLoad %6 %39 674 %102 = OpFOrdGreaterThanEqual %91 %101 %93 675 %103 = OpLoad %6 %65 676 %104 = OpFOrdGreaterThanEqual %91 %103 %93 677 %105 = OpLogicalAnd %91 %102 %104 678 OpBranch %100 679 %100 = OpLabel 680 %106 = OpPhi %91 %97 %21 %105 %99 681 %107 = OpLogicalNot %91 %106 682 OpSelectionMerge %109 None 683 OpBranchConditional %107 %108 %109 684 %108 = OpLabel 685 OpReturnValue %110 686 %109 = OpLabel 687 %113 = OpAccessChain %24 %16 %23 688 %114 = OpLoad %6 %113 689 %115 = OpAccessChain %24 %19 %23 690 %116 = OpLoad %6 %115 691 %117 = OpFSub %6 %114 %116 692 %118 = OpAccessChain %24 %16 %27 693 %119 = OpLoad %6 %118 694 %120 = OpAccessChain %24 %19 %27 695 %121 = OpLoad %6 %120 696 %122 = OpFSub %6 %119 %121 697 %123 = OpCompositeConstruct %7 %117 %122 698 %124 = OpAccessChain %24 %17 %23 699 %125 = OpLoad %6 %124 700 %126 = OpAccessChain %24 %19 %23 701 %127 = OpLoad %6 %126 702 %128 = OpFSub %6 %125 %127 703 %129 = OpAccessChain %24 %17 %27 704 %130 = OpLoad %6 %129 705 %131 = OpAccessChain %24 %19 %27 706 %132 = OpLoad %6 %131 707 %133 = OpFSub %6 %130 %132 708 %134 = OpCompositeConstruct %7 %128 %133 709 OpStore %135 %123 710 OpStore %136 %134 711 %137 = OpFunctionCall %6 %12 %135 %136 712 OpStore %112 %137 713 %138 = OpLoad %6 %39 714 %139 = OpFOrdLessThan %91 %138 %93 715 %140 = OpLoad %6 %112 716 %141 = OpFOrdLessThan %91 %140 %93 717 %142 = OpLogicalAnd %91 %139 %141 718 %143 = OpLogicalNot %91 %142 719 OpSelectionMerge %145 None 720 OpBranchConditional %143 %144 %145 721 %144 = OpLabel 722 %146 = OpLoad %6 %39 723 %147 = OpFOrdGreaterThanEqual %91 %146 %93 724 %148 = OpLoad %6 %112 725 %149 = OpFOrdGreaterThanEqual %91 %148 %93 726 %150 = OpLogicalAnd %91 %147 %149 727 OpBranch %145 728 %145 = OpLabel 729 %151 = OpPhi %91 %142 %109 %150 %144 730 %152 = OpLogicalNot %91 %151 731 OpSelectionMerge %154 None 732 OpBranchConditional %152 %153 %154 733 %153 = OpLabel 734 OpReturnValue %110 735 %154 = OpLabel 736 OpReturnValue %156 737 OpFunctionEnd 738END 739 740# uniforms for variant 741 742# resolution 743BUFFER variant_resolution DATA_TYPE vec2<float> DATA 744 256.0 256.0 745END 746# injectionSwitch 747BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA 748 0.0 1.0 749END 750 751BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 752 753PIPELINE graphics variant_pipeline 754 ATTACH variant_vertex_shader 755 ATTACH variant_fragment_shader 756 FRAMEBUFFER_SIZE 256 256 757 BIND BUFFER variant_framebuffer AS color LOCATION 0 758 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 759 BIND BUFFER variant_injectionSwitch AS push_constant 760END 761CLEAR_COLOR variant_pipeline 0 0 0 255 762 763CLEAR variant_pipeline 764RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 765 766EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005 767