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