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