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 if and conditional statement 21 22# The test passes because both shaders render the same image. 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# struct BST 35# { 36# int data; 37# int leftIndex; 38# int rightIndex; 39# }; 40# 41# BST tree[10]; 42# 43# void makeTreeNode(inout BST tree, int data) 44# { 45# tree.data = data; 46# tree.leftIndex = -1; 47# tree.rightIndex = -1; 48# } 49# void insert(int treeIndex, int data) 50# { 51# int baseIndex = 0; 52# while (baseIndex <= treeIndex) 53# { 54# if (data <= tree[baseIndex].data) 55# { 56# if (tree[baseIndex].leftIndex == -1) 57# { 58# tree[baseIndex].leftIndex = treeIndex; 59# makeTreeNode(tree[treeIndex], data); 60# return; 61# } 62# else 63# { 64# baseIndex = tree[baseIndex].leftIndex; 65# continue; 66# } 67# } 68# else 69# { 70# if (tree[baseIndex].rightIndex == -1) 71# { 72# tree[baseIndex].rightIndex = treeIndex; 73# makeTreeNode(tree[treeIndex], data); 74# return; 75# } 76# else 77# { 78# baseIndex = tree[baseIndex].rightIndex; 79# continue; 80# } 81# } 82# } 83# } 84# int search(int target) 85# { 86# BST currentNode; 87# int index = 0; 88# while (index != -1) 89# { 90# currentNode = tree[index]; 91# if (currentNode.data == target) 92# { 93# return target; 94# } 95# index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex; 96# } 97# return -1; 98# } 99# void main() 100# { 101# int treeIndex = 0; 102# makeTreeNode(tree[0], 9); 103# treeIndex++; 104# insert(treeIndex, 5); 105# treeIndex++; 106# insert(treeIndex, 12); 107# treeIndex++; 108# insert(treeIndex, 15); 109# treeIndex++; 110# insert(treeIndex, 7); 111# treeIndex++; 112# insert(treeIndex, 8); 113# treeIndex++; 114# insert(treeIndex, 2); 115# treeIndex++; 116# insert(treeIndex, 6); 117# treeIndex++; 118# insert(treeIndex, 17); 119# treeIndex++; 120# insert(treeIndex, 13); 121# int count = 0; 122# for (int i = 0; i < 20; i++) 123# { 124# int result = search(i); 125# switch (i) 126# { 127# case 9: 128# case 5: 129# case 12: 130# case 15: 131# case 7: 132# case 8: 133# case 2: 134# case 6: 135# case 17: 136# case 13: 137# if (result == i) 138# { 139# count++; 140# } 141# break; 142# default: 143# if (result == -1) 144# { 145# count++; 146# } 147# break; 148# } 149# } 150# if (count == 20) 151# { 152# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); 153# } 154# else 155# { 156# _GLF_color = vec4(0.0, 0.0, 1.0, 1.0); 157# } 158# } 159SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 160; SPIR-V 161; Version: 1.0 162; Generator: Khronos Glslang Reference Front End; 10 163; Bound: 260 164; Schema: 0 165 OpCapability Shader 166 %1 = OpExtInstImport "GLSL.std.450" 167 OpMemoryModel Logical GLSL450 168 OpEntryPoint Fragment %4 "main" %254 169 OpExecutionMode %4 OriginUpperLeft 170 OpSource ESSL 320 171 OpName %4 "main" 172 OpName %7 "BST" 173 OpMemberName %7 0 "data" 174 OpMemberName %7 1 "leftIndex" 175 OpMemberName %7 2 "rightIndex" 176 OpName %13 "makeTreeNode(struct-BST-i1-i1-i11;i1;" 177 OpName %11 "tree" 178 OpName %12 "data" 179 OpName %18 "insert(i1;i1;" 180 OpName %16 "treeIndex" 181 OpName %17 "data" 182 OpName %22 "search(i1;" 183 OpName %21 "target" 184 OpName %32 "baseIndex" 185 OpName %47 "tree" 186 OpName %65 "param" 187 OpName %69 "param" 188 OpName %91 "param" 189 OpName %94 "param" 190 OpName %105 "index" 191 OpName %113 "currentNode" 192 OpName %140 "treeIndex" 193 OpName %142 "param" 194 OpName %145 "param" 195 OpName %152 "param" 196 OpName %154 "param" 197 OpName %159 "param" 198 OpName %161 "param" 199 OpName %166 "param" 200 OpName %168 "param" 201 OpName %173 "param" 202 OpName %175 "param" 203 OpName %180 "param" 204 OpName %182 "param" 205 OpName %186 "param" 206 OpName %188 "param" 207 OpName %193 "param" 208 OpName %195 "param" 209 OpName %200 "param" 210 OpName %202 "param" 211 OpName %207 "param" 212 OpName %209 "param" 213 OpName %211 "count" 214 OpName %212 "i" 215 OpName %221 "result" 216 OpName %222 "param" 217 OpName %254 "_GLF_color" 218 OpDecorate %254 Location 0 219 %2 = OpTypeVoid 220 %3 = OpTypeFunction %2 221 %6 = OpTypeInt 32 1 222 %7 = OpTypeStruct %6 %6 %6 223 %8 = OpTypePointer Function %7 224 %9 = OpTypePointer Function %6 225 %10 = OpTypeFunction %2 %8 %9 226 %15 = OpTypeFunction %2 %9 %9 227 %20 = OpTypeFunction %6 %9 228 %24 = OpConstant %6 0 229 %27 = OpConstant %6 1 230 %28 = OpConstant %6 -1 231 %30 = OpConstant %6 2 232 %40 = OpTypeBool 233 %43 = OpTypeInt 32 0 234 %44 = OpConstant %43 10 235 %45 = OpTypeArray %7 %44 236 %46 = OpTypePointer Private %45 237 %47 = OpVariable %46 Private 238 %49 = OpTypePointer Private %6 239 %66 = OpTypePointer Private %7 240 %141 = OpConstant %6 9 241 %151 = OpConstant %6 5 242 %158 = OpConstant %6 12 243 %165 = OpConstant %6 15 244 %172 = OpConstant %6 7 245 %179 = OpConstant %6 8 246 %192 = OpConstant %6 6 247 %199 = OpConstant %6 17 248 %206 = OpConstant %6 13 249 %219 = OpConstant %6 20 250 %251 = OpTypeFloat 32 251 %252 = OpTypeVector %251 4 252 %253 = OpTypePointer Output %252 253 %254 = OpVariable %253 Output 254 %255 = OpConstant %251 1 255 %256 = OpConstant %251 0 256 %257 = OpConstantComposite %252 %255 %256 %256 %255 257 %259 = OpConstantComposite %252 %256 %256 %255 %255 258 %4 = OpFunction %2 None %3 259 %5 = OpLabel 260 %140 = OpVariable %9 Function 261 %142 = OpVariable %8 Function 262 %145 = OpVariable %9 Function 263 %152 = OpVariable %9 Function 264 %154 = OpVariable %9 Function 265 %159 = OpVariable %9 Function 266 %161 = OpVariable %9 Function 267 %166 = OpVariable %9 Function 268 %168 = OpVariable %9 Function 269 %173 = OpVariable %9 Function 270 %175 = OpVariable %9 Function 271 %180 = OpVariable %9 Function 272 %182 = OpVariable %9 Function 273 %186 = OpVariable %9 Function 274 %188 = OpVariable %9 Function 275 %193 = OpVariable %9 Function 276 %195 = OpVariable %9 Function 277 %200 = OpVariable %9 Function 278 %202 = OpVariable %9 Function 279 %207 = OpVariable %9 Function 280 %209 = OpVariable %9 Function 281 %211 = OpVariable %9 Function 282 %212 = OpVariable %9 Function 283 %221 = OpVariable %9 Function 284 %222 = OpVariable %9 Function 285 OpStore %140 %24 286 %143 = OpAccessChain %66 %47 %24 287 %144 = OpLoad %7 %143 288 OpStore %142 %144 289 OpStore %145 %141 290 %146 = OpFunctionCall %2 %13 %142 %145 291 %147 = OpLoad %7 %142 292 %148 = OpAccessChain %66 %47 %24 293 OpStore %148 %147 294 %149 = OpLoad %6 %140 295 %150 = OpIAdd %6 %149 %27 296 OpStore %140 %150 297 %153 = OpLoad %6 %140 298 OpStore %152 %153 299 OpStore %154 %151 300 %155 = OpFunctionCall %2 %18 %152 %154 301 %156 = OpLoad %6 %140 302 %157 = OpIAdd %6 %156 %27 303 OpStore %140 %157 304 %160 = OpLoad %6 %140 305 OpStore %159 %160 306 OpStore %161 %158 307 %162 = OpFunctionCall %2 %18 %159 %161 308 %163 = OpLoad %6 %140 309 %164 = OpIAdd %6 %163 %27 310 OpStore %140 %164 311 %167 = OpLoad %6 %140 312 OpStore %166 %167 313 OpStore %168 %165 314 %169 = OpFunctionCall %2 %18 %166 %168 315 %170 = OpLoad %6 %140 316 %171 = OpIAdd %6 %170 %27 317 OpStore %140 %171 318 %174 = OpLoad %6 %140 319 OpStore %173 %174 320 OpStore %175 %172 321 %176 = OpFunctionCall %2 %18 %173 %175 322 %177 = OpLoad %6 %140 323 %178 = OpIAdd %6 %177 %27 324 OpStore %140 %178 325 %181 = OpLoad %6 %140 326 OpStore %180 %181 327 OpStore %182 %179 328 %183 = OpFunctionCall %2 %18 %180 %182 329 %184 = OpLoad %6 %140 330 %185 = OpIAdd %6 %184 %27 331 OpStore %140 %185 332 %187 = OpLoad %6 %140 333 OpStore %186 %187 334 OpStore %188 %30 335 %189 = OpFunctionCall %2 %18 %186 %188 336 %190 = OpLoad %6 %140 337 %191 = OpIAdd %6 %190 %27 338 OpStore %140 %191 339 %194 = OpLoad %6 %140 340 OpStore %193 %194 341 OpStore %195 %192 342 %196 = OpFunctionCall %2 %18 %193 %195 343 %197 = OpLoad %6 %140 344 %198 = OpIAdd %6 %197 %27 345 OpStore %140 %198 346 %201 = OpLoad %6 %140 347 OpStore %200 %201 348 OpStore %202 %199 349 %203 = OpFunctionCall %2 %18 %200 %202 350 %204 = OpLoad %6 %140 351 %205 = OpIAdd %6 %204 %27 352 OpStore %140 %205 353 %208 = OpLoad %6 %140 354 OpStore %207 %208 355 OpStore %209 %206 356 %210 = OpFunctionCall %2 %18 %207 %209 357 OpStore %211 %24 358 OpStore %212 %24 359 OpBranch %213 360 %213 = OpLabel 361 OpLoopMerge %215 %216 None 362 OpBranch %217 363 %217 = OpLabel 364 %218 = OpLoad %6 %212 365 %220 = OpSLessThan %40 %218 %219 366 OpBranchConditional %220 %214 %215 367 %214 = OpLabel 368 %223 = OpLoad %6 %212 369 OpStore %222 %223 370 %224 = OpFunctionCall %6 %22 %222 371 OpStore %221 %224 372 %225 = OpLoad %6 %212 373 OpSelectionMerge %228 None 374 OpSwitch %225 %227 9 %226 5 %226 12 %226 15 %226 7 %226 8 %226 2 %226 6 %226 17 %226 13 %226 375 %227 = OpLabel 376 %237 = OpLoad %6 %221 377 %238 = OpIEqual %40 %237 %28 378 OpSelectionMerge %240 None 379 OpBranchConditional %238 %239 %240 380 %239 = OpLabel 381 %241 = OpLoad %6 %211 382 %242 = OpIAdd %6 %241 %27 383 OpStore %211 %242 384 OpBranch %240 385 %240 = OpLabel 386 OpBranch %228 387 %226 = OpLabel 388 %229 = OpLoad %6 %221 389 %230 = OpLoad %6 %212 390 %231 = OpIEqual %40 %229 %230 391 OpSelectionMerge %233 None 392 OpBranchConditional %231 %232 %233 393 %232 = OpLabel 394 %234 = OpLoad %6 %211 395 %235 = OpIAdd %6 %234 %27 396 OpStore %211 %235 397 OpBranch %233 398 %233 = OpLabel 399 OpBranch %228 400 %228 = OpLabel 401 OpBranch %216 402 %216 = OpLabel 403 %245 = OpLoad %6 %212 404 %246 = OpIAdd %6 %245 %27 405 OpStore %212 %246 406 OpBranch %213 407 %215 = OpLabel 408 %247 = OpLoad %6 %211 409 %248 = OpIEqual %40 %247 %219 410 OpSelectionMerge %250 None 411 OpBranchConditional %248 %249 %258 412 %249 = OpLabel 413 OpStore %254 %257 414 OpBranch %250 415 %258 = OpLabel 416 OpStore %254 %259 417 OpBranch %250 418 %250 = OpLabel 419 OpReturn 420 OpFunctionEnd 421 %13 = OpFunction %2 None %10 422 %11 = OpFunctionParameter %8 423 %12 = OpFunctionParameter %9 424 %14 = OpLabel 425 %25 = OpLoad %6 %12 426 %26 = OpAccessChain %9 %11 %24 427 OpStore %26 %25 428 %29 = OpAccessChain %9 %11 %27 429 OpStore %29 %28 430 %31 = OpAccessChain %9 %11 %30 431 OpStore %31 %28 432 OpReturn 433 OpFunctionEnd 434 %18 = OpFunction %2 None %15 435 %16 = OpFunctionParameter %9 436 %17 = OpFunctionParameter %9 437 %19 = OpLabel 438 %32 = OpVariable %9 Function 439 %65 = OpVariable %8 Function 440 %69 = OpVariable %9 Function 441 %91 = OpVariable %8 Function 442 %94 = OpVariable %9 Function 443 OpStore %32 %24 444 OpBranch %33 445 %33 = OpLabel 446 OpLoopMerge %35 %36 None 447 OpBranch %37 448 %37 = OpLabel 449 %38 = OpLoad %6 %32 450 %39 = OpLoad %6 %16 451 %41 = OpSLessThanEqual %40 %38 %39 452 OpBranchConditional %41 %34 %35 453 %34 = OpLabel 454 %42 = OpLoad %6 %17 455 %48 = OpLoad %6 %32 456 %50 = OpAccessChain %49 %47 %48 %24 457 %51 = OpLoad %6 %50 458 %52 = OpSLessThanEqual %40 %42 %51 459 OpSelectionMerge %54 None 460 OpBranchConditional %52 %53 %80 461 %53 = OpLabel 462 %55 = OpLoad %6 %32 463 %56 = OpAccessChain %49 %47 %55 %27 464 %57 = OpLoad %6 %56 465 %58 = OpIEqual %40 %57 %28 466 OpSelectionMerge %60 None 467 OpBranchConditional %58 %59 %75 468 %59 = OpLabel 469 %61 = OpLoad %6 %32 470 %62 = OpLoad %6 %16 471 %63 = OpAccessChain %49 %47 %61 %27 472 OpStore %63 %62 473 %64 = OpLoad %6 %16 474 %67 = OpAccessChain %66 %47 %64 475 %68 = OpLoad %7 %67 476 OpStore %65 %68 477 %70 = OpLoad %6 %17 478 OpStore %69 %70 479 %71 = OpFunctionCall %2 %13 %65 %69 480 %72 = OpLoad %7 %65 481 %73 = OpAccessChain %66 %47 %64 482 OpStore %73 %72 483 OpReturn 484 %75 = OpLabel 485 %76 = OpLoad %6 %32 486 %77 = OpAccessChain %49 %47 %76 %27 487 %78 = OpLoad %6 %77 488 OpStore %32 %78 489 OpBranch %36 490 %60 = OpLabel 491 OpUnreachable 492 %80 = OpLabel 493 %81 = OpLoad %6 %32 494 %82 = OpAccessChain %49 %47 %81 %30 495 %83 = OpLoad %6 %82 496 %84 = OpIEqual %40 %83 %28 497 OpSelectionMerge %86 None 498 OpBranchConditional %84 %85 %100 499 %85 = OpLabel 500 %87 = OpLoad %6 %32 501 %88 = OpLoad %6 %16 502 %89 = OpAccessChain %49 %47 %87 %30 503 OpStore %89 %88 504 %90 = OpLoad %6 %16 505 %92 = OpAccessChain %66 %47 %90 506 %93 = OpLoad %7 %92 507 OpStore %91 %93 508 %95 = OpLoad %6 %17 509 OpStore %94 %95 510 %96 = OpFunctionCall %2 %13 %91 %94 511 %97 = OpLoad %7 %91 512 %98 = OpAccessChain %66 %47 %90 513 OpStore %98 %97 514 OpReturn 515 %100 = OpLabel 516 %101 = OpLoad %6 %32 517 %102 = OpAccessChain %49 %47 %101 %30 518 %103 = OpLoad %6 %102 519 OpStore %32 %103 520 OpBranch %36 521 %86 = OpLabel 522 OpUnreachable 523 %54 = OpLabel 524 OpUnreachable 525 %36 = OpLabel 526 OpBranch %33 527 %35 = OpLabel 528 OpReturn 529 OpFunctionEnd 530 %22 = OpFunction %6 None %20 531 %21 = OpFunctionParameter %9 532 %23 = OpLabel 533 %105 = OpVariable %9 Function 534 %113 = OpVariable %8 Function 535 %129 = OpVariable %9 Function 536 OpStore %105 %24 537 OpBranch %106 538 %106 = OpLabel 539 OpLoopMerge %108 %109 None 540 OpBranch %110 541 %110 = OpLabel 542 %111 = OpLoad %6 %105 543 %112 = OpINotEqual %40 %111 %28 544 OpBranchConditional %112 %107 %108 545 %107 = OpLabel 546 %114 = OpLoad %6 %105 547 %115 = OpAccessChain %66 %47 %114 548 %116 = OpLoad %7 %115 549 OpStore %113 %116 550 %117 = OpAccessChain %9 %113 %24 551 %118 = OpLoad %6 %117 552 %119 = OpLoad %6 %21 553 %120 = OpIEqual %40 %118 %119 554 OpSelectionMerge %122 None 555 OpBranchConditional %120 %121 %122 556 %121 = OpLabel 557 %123 = OpLoad %6 %21 558 OpReturnValue %123 559 %122 = OpLabel 560 %125 = OpLoad %6 %21 561 %126 = OpAccessChain %9 %113 %24 562 %127 = OpLoad %6 %126 563 %128 = OpSGreaterThan %40 %125 %127 564 OpSelectionMerge %131 None 565 OpBranchConditional %128 %130 %134 566 %130 = OpLabel 567 %132 = OpAccessChain %9 %113 %30 568 %133 = OpLoad %6 %132 569 OpStore %129 %133 570 OpBranch %131 571 %134 = OpLabel 572 %135 = OpAccessChain %9 %113 %27 573 %136 = OpLoad %6 %135 574 OpStore %129 %136 575 OpBranch %131 576 %131 = OpLabel 577 %137 = OpLoad %6 %129 578 OpStore %105 %137 579 OpBranch %109 580 %109 = OpLabel 581 OpBranch %106 582 %108 = OpLabel 583 OpReturnValue %28 584 OpFunctionEnd 585END 586 587 588BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM 589 590PIPELINE graphics reference_pipeline 591 ATTACH reference_vertex_shader 592 ATTACH reference_fragment_shader 593 FRAMEBUFFER_SIZE 256 256 594 BIND BUFFER reference_framebuffer AS color LOCATION 0 595END 596CLEAR_COLOR reference_pipeline 0 0 0 255 597 598CLEAR reference_pipeline 599RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256 600 601 602SHADER vertex variant_vertex_shader PASSTHROUGH 603 604# variant_fragment_shader is derived from the following GLSL: 605# #version 320 es 606# precision highp float; 607# 608# precision highp int; 609# 610# layout(set = 0, binding = 0) uniform buf0 611# { 612# vec2 injectionSwitch; // x == 0.0, y == 1.0 613# }; 614# layout(location = 0) out vec4 _GLF_color; 615# 616# struct BST 617# { 618# int data; 619# int leftIndex; 620# int rightIndex; 621# }; 622# 623# BST tree[10]; 624# 625# void makeTreeNode(inout BST tree, int data) 626# { 627# tree.data = data; 628# tree.leftIndex = -1; 629# tree.rightIndex = -1; 630# } 631# void insert(int treeIndex, int data) 632# { 633# int baseIndex = 0; 634# while (baseIndex <= treeIndex) 635# { 636# if (data <= tree[baseIndex].data) 637# { 638# if (tree[baseIndex].leftIndex == -1) 639# { 640# tree[baseIndex].leftIndex = treeIndex; 641# // Always true. 642# if (injectionSwitch.x < injectionSwitch.y) 643# { 644# makeTreeNode(tree[treeIndex], data); 645# } 646# // Always true. 647# if (injectionSwitch.x < injectionSwitch.y) 648# { 649# return; 650# } 651# } 652# else 653# { 654# baseIndex = tree[baseIndex].leftIndex; 655# continue; 656# } 657# } 658# else 659# { 660# // Conditional statement's result is irrelevant. 661# if ((injectionSwitch.x < injectionSwitch.y ? tree[baseIndex].rightIndex : tree[baseIndex].rightIndex) == -1) 662# { 663# tree[baseIndex].rightIndex = treeIndex; 664# makeTreeNode(tree[treeIndex], data); 665# return; 666# } 667# else 668# { 669# baseIndex = tree[baseIndex].rightIndex; 670# continue; 671# } 672# } 673# // Always false. 674# if (injectionSwitch.x > injectionSwitch.y) 675# { 676# return; 677# } 678# } 679# } 680# int search(int target) 681# { 682# BST currentNode; 683# int index = 0; 684# while (index != -1) 685# { 686# currentNode = tree[index]; 687# if (currentNode.data == target) 688# { 689# return target; 690# } 691# index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex; 692# } 693# return -1; 694# } 695# void main() 696# { 697# int treeIndex = 0; 698# makeTreeNode(tree[0], 9); 699# treeIndex++; 700# insert(treeIndex, 5); 701# treeIndex++; 702# insert(treeIndex, 12); 703# treeIndex++; 704# insert(treeIndex, 15); 705# treeIndex++; 706# insert(treeIndex, 7); 707# treeIndex++; 708# insert(treeIndex, 8); 709# treeIndex++; 710# insert(treeIndex, 2); 711# treeIndex++; 712# insert(treeIndex, 6); 713# treeIndex++; 714# insert(treeIndex, 17); 715# treeIndex++; 716# insert(treeIndex, 13); 717# int count = 0; 718# for (int i = 0; i < 20; i++) 719# { 720# int result = search(i); 721# switch (i) 722# { 723# case 9: 724# case 5: 725# case 12: 726# case 15: 727# case 7: 728# case 8: 729# case 2: 730# case 6: 731# case 17: 732# case 13: 733# if (result == i) 734# { 735# count++; 736# } 737# break; 738# default: 739# if (result == -1) 740# { 741# count++; 742# } 743# break; 744# } 745# } 746# if (count == 20) 747# { 748# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); 749# } 750# else 751# { 752# _GLF_color = vec4(0.0, 0.0, 1.0, 1.0); 753# } 754# } 755SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 756; SPIR-V 757; Version: 1.0 758; Generator: Khronos Glslang Reference Front End; 10 759; Bound: 302 760; Schema: 0 761 OpCapability Shader 762 %1 = OpExtInstImport "GLSL.std.450" 763 OpMemoryModel Logical GLSL450 764 OpEntryPoint Fragment %4 "main" %296 765 OpExecutionMode %4 OriginUpperLeft 766 OpSource ESSL 320 767 OpName %4 "main" 768 OpName %7 "BST" 769 OpMemberName %7 0 "data" 770 OpMemberName %7 1 "leftIndex" 771 OpMemberName %7 2 "rightIndex" 772 OpName %13 "makeTreeNode(struct-BST-i1-i1-i11;i1;" 773 OpName %11 "tree" 774 OpName %12 "data" 775 OpName %18 "insert(i1;i1;" 776 OpName %16 "treeIndex" 777 OpName %17 "data" 778 OpName %22 "search(i1;" 779 OpName %21 "target" 780 OpName %32 "baseIndex" 781 OpName %47 "tree" 782 OpName %66 "buf0" 783 OpMemberName %66 0 "injectionSwitch" 784 OpName %68 "" 785 OpName %80 "param" 786 OpName %84 "param" 787 OpName %126 "param" 788 OpName %129 "param" 789 OpName %148 "index" 790 OpName %156 "currentNode" 791 OpName %183 "treeIndex" 792 OpName %185 "param" 793 OpName %188 "param" 794 OpName %195 "param" 795 OpName %197 "param" 796 OpName %202 "param" 797 OpName %204 "param" 798 OpName %209 "param" 799 OpName %211 "param" 800 OpName %216 "param" 801 OpName %218 "param" 802 OpName %223 "param" 803 OpName %225 "param" 804 OpName %229 "param" 805 OpName %231 "param" 806 OpName %236 "param" 807 OpName %238 "param" 808 OpName %243 "param" 809 OpName %245 "param" 810 OpName %250 "param" 811 OpName %252 "param" 812 OpName %254 "count" 813 OpName %255 "i" 814 OpName %264 "result" 815 OpName %265 "param" 816 OpName %296 "_GLF_color" 817 OpMemberDecorate %66 0 Offset 0 818 OpDecorate %66 Block 819 OpDecorate %68 DescriptorSet 0 820 OpDecorate %68 Binding 0 821 OpDecorate %296 Location 0 822 %2 = OpTypeVoid 823 %3 = OpTypeFunction %2 824 %6 = OpTypeInt 32 1 825 %7 = OpTypeStruct %6 %6 %6 826 %8 = OpTypePointer Function %7 827 %9 = OpTypePointer Function %6 828 %10 = OpTypeFunction %2 %8 %9 829 %15 = OpTypeFunction %2 %9 %9 830 %20 = OpTypeFunction %6 %9 831 %24 = OpConstant %6 0 832 %27 = OpConstant %6 1 833 %28 = OpConstant %6 -1 834 %30 = OpConstant %6 2 835 %40 = OpTypeBool 836 %43 = OpTypeInt 32 0 837 %44 = OpConstant %43 10 838 %45 = OpTypeArray %7 %44 839 %46 = OpTypePointer Private %45 840 %47 = OpVariable %46 Private 841 %49 = OpTypePointer Private %6 842 %64 = OpTypeFloat 32 843 %65 = OpTypeVector %64 2 844 %66 = OpTypeStruct %65 845 %67 = OpTypePointer Uniform %66 846 %68 = OpVariable %67 Uniform 847 %69 = OpConstant %43 0 848 %70 = OpTypePointer Uniform %64 849 %73 = OpConstant %43 1 850 %81 = OpTypePointer Private %7 851 %184 = OpConstant %6 9 852 %194 = OpConstant %6 5 853 %201 = OpConstant %6 12 854 %208 = OpConstant %6 15 855 %215 = OpConstant %6 7 856 %222 = OpConstant %6 8 857 %235 = OpConstant %6 6 858 %242 = OpConstant %6 17 859 %249 = OpConstant %6 13 860 %262 = OpConstant %6 20 861 %294 = OpTypeVector %64 4 862 %295 = OpTypePointer Output %294 863 %296 = OpVariable %295 Output 864 %297 = OpConstant %64 1 865 %298 = OpConstant %64 0 866 %299 = OpConstantComposite %294 %297 %298 %298 %297 867 %301 = OpConstantComposite %294 %298 %298 %297 %297 868 %4 = OpFunction %2 None %3 869 %5 = OpLabel 870 %183 = OpVariable %9 Function 871 %185 = OpVariable %8 Function 872 %188 = OpVariable %9 Function 873 %195 = OpVariable %9 Function 874 %197 = OpVariable %9 Function 875 %202 = OpVariable %9 Function 876 %204 = OpVariable %9 Function 877 %209 = OpVariable %9 Function 878 %211 = OpVariable %9 Function 879 %216 = OpVariable %9 Function 880 %218 = OpVariable %9 Function 881 %223 = OpVariable %9 Function 882 %225 = OpVariable %9 Function 883 %229 = OpVariable %9 Function 884 %231 = OpVariable %9 Function 885 %236 = OpVariable %9 Function 886 %238 = OpVariable %9 Function 887 %243 = OpVariable %9 Function 888 %245 = OpVariable %9 Function 889 %250 = OpVariable %9 Function 890 %252 = OpVariable %9 Function 891 %254 = OpVariable %9 Function 892 %255 = OpVariable %9 Function 893 %264 = OpVariable %9 Function 894 %265 = OpVariable %9 Function 895 OpStore %183 %24 896 %186 = OpAccessChain %81 %47 %24 897 %187 = OpLoad %7 %186 898 OpStore %185 %187 899 OpStore %188 %184 900 %189 = OpFunctionCall %2 %13 %185 %188 901 %190 = OpLoad %7 %185 902 %191 = OpAccessChain %81 %47 %24 903 OpStore %191 %190 904 %192 = OpLoad %6 %183 905 %193 = OpIAdd %6 %192 %27 906 OpStore %183 %193 907 %196 = OpLoad %6 %183 908 OpStore %195 %196 909 OpStore %197 %194 910 %198 = OpFunctionCall %2 %18 %195 %197 911 %199 = OpLoad %6 %183 912 %200 = OpIAdd %6 %199 %27 913 OpStore %183 %200 914 %203 = OpLoad %6 %183 915 OpStore %202 %203 916 OpStore %204 %201 917 %205 = OpFunctionCall %2 %18 %202 %204 918 %206 = OpLoad %6 %183 919 %207 = OpIAdd %6 %206 %27 920 OpStore %183 %207 921 %210 = OpLoad %6 %183 922 OpStore %209 %210 923 OpStore %211 %208 924 %212 = OpFunctionCall %2 %18 %209 %211 925 %213 = OpLoad %6 %183 926 %214 = OpIAdd %6 %213 %27 927 OpStore %183 %214 928 %217 = OpLoad %6 %183 929 OpStore %216 %217 930 OpStore %218 %215 931 %219 = OpFunctionCall %2 %18 %216 %218 932 %220 = OpLoad %6 %183 933 %221 = OpIAdd %6 %220 %27 934 OpStore %183 %221 935 %224 = OpLoad %6 %183 936 OpStore %223 %224 937 OpStore %225 %222 938 %226 = OpFunctionCall %2 %18 %223 %225 939 %227 = OpLoad %6 %183 940 %228 = OpIAdd %6 %227 %27 941 OpStore %183 %228 942 %230 = OpLoad %6 %183 943 OpStore %229 %230 944 OpStore %231 %30 945 %232 = OpFunctionCall %2 %18 %229 %231 946 %233 = OpLoad %6 %183 947 %234 = OpIAdd %6 %233 %27 948 OpStore %183 %234 949 %237 = OpLoad %6 %183 950 OpStore %236 %237 951 OpStore %238 %235 952 %239 = OpFunctionCall %2 %18 %236 %238 953 %240 = OpLoad %6 %183 954 %241 = OpIAdd %6 %240 %27 955 OpStore %183 %241 956 %244 = OpLoad %6 %183 957 OpStore %243 %244 958 OpStore %245 %242 959 %246 = OpFunctionCall %2 %18 %243 %245 960 %247 = OpLoad %6 %183 961 %248 = OpIAdd %6 %247 %27 962 OpStore %183 %248 963 %251 = OpLoad %6 %183 964 OpStore %250 %251 965 OpStore %252 %249 966 %253 = OpFunctionCall %2 %18 %250 %252 967 OpStore %254 %24 968 OpStore %255 %24 969 OpBranch %256 970 %256 = OpLabel 971 OpLoopMerge %258 %259 None 972 OpBranch %260 973 %260 = OpLabel 974 %261 = OpLoad %6 %255 975 %263 = OpSLessThan %40 %261 %262 976 OpBranchConditional %263 %257 %258 977 %257 = OpLabel 978 %266 = OpLoad %6 %255 979 OpStore %265 %266 980 %267 = OpFunctionCall %6 %22 %265 981 OpStore %264 %267 982 %268 = OpLoad %6 %255 983 OpSelectionMerge %271 None 984 OpSwitch %268 %270 9 %269 5 %269 12 %269 15 %269 7 %269 8 %269 2 %269 6 %269 17 %269 13 %269 985 %270 = OpLabel 986 %280 = OpLoad %6 %264 987 %281 = OpIEqual %40 %280 %28 988 OpSelectionMerge %283 None 989 OpBranchConditional %281 %282 %283 990 %282 = OpLabel 991 %284 = OpLoad %6 %254 992 %285 = OpIAdd %6 %284 %27 993 OpStore %254 %285 994 OpBranch %283 995 %283 = OpLabel 996 OpBranch %271 997 %269 = OpLabel 998 %272 = OpLoad %6 %264 999 %273 = OpLoad %6 %255 1000 %274 = OpIEqual %40 %272 %273 1001 OpSelectionMerge %276 None 1002 OpBranchConditional %274 %275 %276 1003 %275 = OpLabel 1004 %277 = OpLoad %6 %254 1005 %278 = OpIAdd %6 %277 %27 1006 OpStore %254 %278 1007 OpBranch %276 1008 %276 = OpLabel 1009 OpBranch %271 1010 %271 = OpLabel 1011 OpBranch %259 1012 %259 = OpLabel 1013 %288 = OpLoad %6 %255 1014 %289 = OpIAdd %6 %288 %27 1015 OpStore %255 %289 1016 OpBranch %256 1017 %258 = OpLabel 1018 %290 = OpLoad %6 %254 1019 %291 = OpIEqual %40 %290 %262 1020 OpSelectionMerge %293 None 1021 OpBranchConditional %291 %292 %300 1022 %292 = OpLabel 1023 OpStore %296 %299 1024 OpBranch %293 1025 %300 = OpLabel 1026 OpStore %296 %301 1027 OpBranch %293 1028 %293 = OpLabel 1029 OpReturn 1030 OpFunctionEnd 1031 %13 = OpFunction %2 None %10 1032 %11 = OpFunctionParameter %8 1033 %12 = OpFunctionParameter %9 1034 %14 = OpLabel 1035 %25 = OpLoad %6 %12 1036 %26 = OpAccessChain %9 %11 %24 1037 OpStore %26 %25 1038 %29 = OpAccessChain %9 %11 %27 1039 OpStore %29 %28 1040 %31 = OpAccessChain %9 %11 %30 1041 OpStore %31 %28 1042 OpReturn 1043 OpFunctionEnd 1044 %18 = OpFunction %2 None %15 1045 %16 = OpFunctionParameter %9 1046 %17 = OpFunctionParameter %9 1047 %19 = OpLabel 1048 %32 = OpVariable %9 Function 1049 %80 = OpVariable %8 Function 1050 %84 = OpVariable %9 Function 1051 %108 = OpVariable %9 Function 1052 %126 = OpVariable %8 Function 1053 %129 = OpVariable %9 Function 1054 OpStore %32 %24 1055 OpBranch %33 1056 %33 = OpLabel 1057 OpLoopMerge %35 %36 None 1058 OpBranch %37 1059 %37 = OpLabel 1060 %38 = OpLoad %6 %32 1061 %39 = OpLoad %6 %16 1062 %41 = OpSLessThanEqual %40 %38 %39 1063 OpBranchConditional %41 %34 %35 1064 %34 = OpLabel 1065 %42 = OpLoad %6 %17 1066 %48 = OpLoad %6 %32 1067 %50 = OpAccessChain %49 %47 %48 %24 1068 %51 = OpLoad %6 %50 1069 %52 = OpSLessThanEqual %40 %42 %51 1070 OpSelectionMerge %54 None 1071 OpBranchConditional %52 %53 %102 1072 %53 = OpLabel 1073 %55 = OpLoad %6 %32 1074 %56 = OpAccessChain %49 %47 %55 %27 1075 %57 = OpLoad %6 %56 1076 %58 = OpIEqual %40 %57 %28 1077 OpSelectionMerge %60 None 1078 OpBranchConditional %58 %59 %97 1079 %59 = OpLabel 1080 %61 = OpLoad %6 %32 1081 %62 = OpLoad %6 %16 1082 %63 = OpAccessChain %49 %47 %61 %27 1083 OpStore %63 %62 1084 %71 = OpAccessChain %70 %68 %24 %69 1085 %72 = OpLoad %64 %71 1086 %74 = OpAccessChain %70 %68 %24 %73 1087 %75 = OpLoad %64 %74 1088 %76 = OpFOrdLessThan %40 %72 %75 1089 OpSelectionMerge %78 None 1090 OpBranchConditional %76 %77 %78 1091 %77 = OpLabel 1092 %79 = OpLoad %6 %16 1093 %82 = OpAccessChain %81 %47 %79 1094 %83 = OpLoad %7 %82 1095 OpStore %80 %83 1096 %85 = OpLoad %6 %17 1097 OpStore %84 %85 1098 %86 = OpFunctionCall %2 %13 %80 %84 1099 %87 = OpLoad %7 %80 1100 %88 = OpAccessChain %81 %47 %79 1101 OpStore %88 %87 1102 OpBranch %78 1103 %78 = OpLabel 1104 %89 = OpAccessChain %70 %68 %24 %69 1105 %90 = OpLoad %64 %89 1106 %91 = OpAccessChain %70 %68 %24 %73 1107 %92 = OpLoad %64 %91 1108 %93 = OpFOrdLessThan %40 %90 %92 1109 OpSelectionMerge %95 None 1110 OpBranchConditional %93 %94 %95 1111 %94 = OpLabel 1112 OpReturn 1113 %95 = OpLabel 1114 OpBranch %60 1115 %97 = OpLabel 1116 %98 = OpLoad %6 %32 1117 %99 = OpAccessChain %49 %47 %98 %27 1118 %100 = OpLoad %6 %99 1119 OpStore %32 %100 1120 OpBranch %36 1121 %60 = OpLabel 1122 OpBranch %54 1123 %102 = OpLabel 1124 %103 = OpAccessChain %70 %68 %24 %69 1125 %104 = OpLoad %64 %103 1126 %105 = OpAccessChain %70 %68 %24 %73 1127 %106 = OpLoad %64 %105 1128 %107 = OpFOrdLessThan %40 %104 %106 1129 OpSelectionMerge %110 None 1130 OpBranchConditional %107 %109 %114 1131 %109 = OpLabel 1132 %111 = OpLoad %6 %32 1133 %112 = OpAccessChain %49 %47 %111 %30 1134 %113 = OpLoad %6 %112 1135 OpStore %108 %113 1136 OpBranch %110 1137 %114 = OpLabel 1138 %115 = OpLoad %6 %32 1139 %116 = OpAccessChain %49 %47 %115 %30 1140 %117 = OpLoad %6 %116 1141 OpStore %108 %117 1142 OpBranch %110 1143 %110 = OpLabel 1144 %118 = OpLoad %6 %108 1145 %119 = OpIEqual %40 %118 %28 1146 OpSelectionMerge %121 None 1147 OpBranchConditional %119 %120 %135 1148 %120 = OpLabel 1149 %122 = OpLoad %6 %32 1150 %123 = OpLoad %6 %16 1151 %124 = OpAccessChain %49 %47 %122 %30 1152 OpStore %124 %123 1153 %125 = OpLoad %6 %16 1154 %127 = OpAccessChain %81 %47 %125 1155 %128 = OpLoad %7 %127 1156 OpStore %126 %128 1157 %130 = OpLoad %6 %17 1158 OpStore %129 %130 1159 %131 = OpFunctionCall %2 %13 %126 %129 1160 %132 = OpLoad %7 %126 1161 %133 = OpAccessChain %81 %47 %125 1162 OpStore %133 %132 1163 OpReturn 1164 %135 = OpLabel 1165 %136 = OpLoad %6 %32 1166 %137 = OpAccessChain %49 %47 %136 %30 1167 %138 = OpLoad %6 %137 1168 OpStore %32 %138 1169 OpBranch %36 1170 %121 = OpLabel 1171 OpUnreachable 1172 %54 = OpLabel 1173 %140 = OpAccessChain %70 %68 %24 %69 1174 %141 = OpLoad %64 %140 1175 %142 = OpAccessChain %70 %68 %24 %73 1176 %143 = OpLoad %64 %142 1177 %144 = OpFOrdGreaterThan %40 %141 %143 1178 OpSelectionMerge %146 None 1179 OpBranchConditional %144 %145 %146 1180 %145 = OpLabel 1181 OpReturn 1182 %146 = OpLabel 1183 OpBranch %36 1184 %36 = OpLabel 1185 OpBranch %33 1186 %35 = OpLabel 1187 OpReturn 1188 OpFunctionEnd 1189 %22 = OpFunction %6 None %20 1190 %21 = OpFunctionParameter %9 1191 %23 = OpLabel 1192 %148 = OpVariable %9 Function 1193 %156 = OpVariable %8 Function 1194 %172 = OpVariable %9 Function 1195 OpStore %148 %24 1196 OpBranch %149 1197 %149 = OpLabel 1198 OpLoopMerge %151 %152 None 1199 OpBranch %153 1200 %153 = OpLabel 1201 %154 = OpLoad %6 %148 1202 %155 = OpINotEqual %40 %154 %28 1203 OpBranchConditional %155 %150 %151 1204 %150 = OpLabel 1205 %157 = OpLoad %6 %148 1206 %158 = OpAccessChain %81 %47 %157 1207 %159 = OpLoad %7 %158 1208 OpStore %156 %159 1209 %160 = OpAccessChain %9 %156 %24 1210 %161 = OpLoad %6 %160 1211 %162 = OpLoad %6 %21 1212 %163 = OpIEqual %40 %161 %162 1213 OpSelectionMerge %165 None 1214 OpBranchConditional %163 %164 %165 1215 %164 = OpLabel 1216 %166 = OpLoad %6 %21 1217 OpReturnValue %166 1218 %165 = OpLabel 1219 %168 = OpLoad %6 %21 1220 %169 = OpAccessChain %9 %156 %24 1221 %170 = OpLoad %6 %169 1222 %171 = OpSGreaterThan %40 %168 %170 1223 OpSelectionMerge %174 None 1224 OpBranchConditional %171 %173 %177 1225 %173 = OpLabel 1226 %175 = OpAccessChain %9 %156 %30 1227 %176 = OpLoad %6 %175 1228 OpStore %172 %176 1229 OpBranch %174 1230 %177 = OpLabel 1231 %178 = OpAccessChain %9 %156 %27 1232 %179 = OpLoad %6 %178 1233 OpStore %172 %179 1234 OpBranch %174 1235 %174 = OpLabel 1236 %180 = OpLoad %6 %172 1237 OpStore %148 %180 1238 OpBranch %152 1239 %152 = OpLabel 1240 OpBranch %149 1241 %151 = OpLabel 1242 OpReturnValue %28 1243 OpFunctionEnd 1244END 1245 1246# uniforms for variant 1247 1248# injectionSwitch 1249BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA 1250 0.0 1.0 1251END 1252 1253BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 1254 1255PIPELINE graphics variant_pipeline 1256 ATTACH variant_vertex_shader 1257 ATTACH variant_fragment_shader 1258 FRAMEBUFFER_SIZE 256 256 1259 BIND BUFFER variant_framebuffer AS color LOCATION 0 1260 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0 1261END 1262CLEAR_COLOR variant_pipeline 0 0 0 255 1263 1264CLEAR variant_pipeline 1265RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 1266 1267EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005 1268