1#!amber 2 3# Copyright 2022 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 coverage-gap found by the GraphicsFuzz project. 19 20# Short description: A fragment shader that covers specific LLVM code paths 21 22# The test passes because the shader always writes red. 23 24SHADER vertex variant_vertex_shader PASSTHROUGH 25 26# variant_fragment_shader is derived from the following GLSL: 27# #version 320 es 28# 29# #define _int_1 _GLF_uniform_int_values[0] 30# #define _int_0 _GLF_uniform_int_values[1] 31# #define _int_2 _GLF_uniform_int_values[2] 32# #define _int_4 _GLF_uniform_int_values[3] 33# #define _float_1_0 _GLF_uniform_float_values[0] 34# #define _float_0_0 _GLF_uniform_float_values[1] 35# #define _float_2_0 _GLF_uniform_float_values[2] 36# 37# precision highp float; 38# precision highp int; 39# 40# // Contents of _GLF_uniform_float_values: [1.0, 0.0, 2.0] 41# layout(set = 0, binding = 0) uniform buf0 42# { 43# float _GLF_uniform_float_values[3]; 44# }; 45# 46# // Contents of _GLF_uniform_int_values: [1, 0, 2, 4] 47# layout(set = 0, binding = 1) uniform buf1 48# { 49# int _GLF_uniform_int_values[4]; 50# }; 51# 52# // Contents of injectionSwitch: [0.0, 1.0] 53# layout(set = 0, binding = 2) uniform buf2 54# { 55# highp vec2 injectionSwitch; 56# }; 57# 58# layout(location = 0) out vec4 _GLF_color; 59# 60# ivec4 func() 61# { 62# ivec4 v = ivec4(_int_1); 63# int a = _int_1; 64# 65# // Iterates twice. 66# for(int b = 0; b < 2; b++) 67# { 68# int c = 0; 69# 70# // Iterates three times. 71# for(int d = _int_1; c < 3; d++) 72# { 73# // Always false. 74# if(gl_FragCoord.x < _float_0_0) 75# { 76# if(injectionSwitch.y > _float_0_0) 77# { 78# vec2 v0 = vec2(_float_1_0) * mat2(_float_1_0); 79# for(int i = _int_1; i >= 1; i--) { } 80# 81# vec2 v1 = vec2(_float_1_0) * mat2(_float_1_0); 82# for(int i = _int_1; i >= 1; i--) { } 83# 84# vec2 v2 = vec2(_float_1_0) * mat2(_float_1_0); 85# for(int i = _int_1; i >= 0; i--) { } 86# } 87# } 88# else 89# { 90# c++; 91# } 92# 93# // Same as a += d. 94# for(int i = _int_0; i < d; i++) 95# { 96# a++; 97# } 98# 99# a *= _int_2; 100# 101# // v = vec4(a); 102# for(int i = _int_0; i < _int_4; i++) 103# { 104# v[i] = a; 105# } 106# } 107# } 108# 109# return v; 110# } 111# 112# // Same as func(), but manually simplified. 113# ivec4 funcSimplified() 114# { 115# ivec4 v = ivec4(1); 116# int a = 1; 117# 118# for(int b = 0; b < 2; b++) 119# { 120# for(int d = 1; d < 4; d++) 121# { 122# a = (a + d) * 2; 123# } 124# } 125# 126# return ivec4(a); 127# } 128# 129# void main() 130# { 131# // Always true. 132# if(func() == funcSimplified()) 133# { 134# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1); 135# } 136# else 137# { 138# _GLF_color = vec4(_int_0); 139# } 140# } 141SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 142; SPIR-V 143; Version: 1.0 144; Generator: Khronos Glslang Reference Front End; 10 145; Bound: 259 146; Schema: 0 147 OpCapability Shader 148 %1 = OpExtInstImport "GLSL.std.450" 149 OpMemoryModel Logical GLSL450 150 OpEntryPoint Fragment %4 "main" %55 %240 151 OpExecutionMode %4 OriginUpperLeft 152 OpSource ESSL 320 153 OpName %4 "main" 154 OpName %9 "func(" 155 OpName %11 "funcSimplified(" 156 OpName %14 "v" 157 OpName %18 "buf1" 158 OpMemberName %18 0 "_GLF_uniform_int_values" 159 OpName %20 "" 160 OpName %27 "a" 161 OpName %30 "b" 162 OpName %40 "c" 163 OpName %41 "d" 164 OpName %55 "gl_FragCoord" 165 OpName %62 "buf0" 166 OpMemberName %62 0 "_GLF_uniform_float_values" 167 OpName %64 "" 168 OpName %73 "buf2" 169 OpMemberName %73 0 "injectionSwitch" 170 OpName %75 "" 171 OpName %85 "v0" 172 OpName %98 "i" 173 OpName %110 "v1" 174 OpName %120 "i" 175 OpName %132 "v2" 176 OpName %142 "i" 177 OpName %157 "i" 178 OpName %176 "i" 179 OpName %200 "v" 180 OpName %202 "a" 181 OpName %203 "b" 182 OpName %211 "d" 183 OpName %240 "_GLF_color" 184 OpDecorate %17 ArrayStride 16 185 OpMemberDecorate %18 0 Offset 0 186 OpDecorate %18 Block 187 OpDecorate %20 DescriptorSet 0 188 OpDecorate %20 Binding 1 189 OpDecorate %55 BuiltIn FragCoord 190 OpDecorate %61 ArrayStride 16 191 OpMemberDecorate %62 0 Offset 0 192 OpDecorate %62 Block 193 OpDecorate %64 DescriptorSet 0 194 OpDecorate %64 Binding 0 195 OpMemberDecorate %73 0 Offset 0 196 OpDecorate %73 Block 197 OpDecorate %75 DescriptorSet 0 198 OpDecorate %75 Binding 2 199 OpDecorate %240 Location 0 200 %2 = OpTypeVoid 201 %3 = OpTypeFunction %2 202 %6 = OpTypeInt 32 1 203 %7 = OpTypeVector %6 4 204 %8 = OpTypeFunction %7 205 %13 = OpTypePointer Function %7 206 %15 = OpTypeInt 32 0 207 %16 = OpConstant %15 4 208 %17 = OpTypeArray %6 %16 209 %18 = OpTypeStruct %17 210 %19 = OpTypePointer Uniform %18 211 %20 = OpVariable %19 Uniform 212 %21 = OpConstant %6 0 213 %22 = OpTypePointer Uniform %6 214 %26 = OpTypePointer Function %6 215 %37 = OpConstant %6 2 216 %38 = OpTypeBool 217 %50 = OpConstant %6 3 218 %52 = OpTypeFloat 32 219 %53 = OpTypeVector %52 4 220 %54 = OpTypePointer Input %53 221 %55 = OpVariable %54 Input 222 %56 = OpConstant %15 0 223 %57 = OpTypePointer Input %52 224 %60 = OpConstant %15 3 225 %61 = OpTypeArray %52 %60 226 %62 = OpTypeStruct %61 227 %63 = OpTypePointer Uniform %62 228 %64 = OpVariable %63 Uniform 229 %65 = OpConstant %6 1 230 %66 = OpTypePointer Uniform %52 231 %72 = OpTypeVector %52 2 232 %73 = OpTypeStruct %72 233 %74 = OpTypePointer Uniform %73 234 %75 = OpVariable %74 Uniform 235 %76 = OpConstant %15 1 236 %84 = OpTypePointer Function %72 237 %91 = OpTypeMatrix %72 2 238 %92 = OpConstant %52 1 239 %93 = OpConstant %52 0 240 %201 = OpConstantComposite %7 %65 %65 %65 %65 241 %218 = OpConstant %6 4 242 %234 = OpTypeVector %38 4 243 %239 = OpTypePointer Output %53 244 %240 = OpVariable %239 Output 245 %4 = OpFunction %2 None %3 246 %5 = OpLabel 247 %232 = OpFunctionCall %7 %9 248 %233 = OpFunctionCall %7 %11 249 %235 = OpIEqual %234 %232 %233 250 %236 = OpAll %38 %235 251 OpSelectionMerge %238 None 252 OpBranchConditional %236 %237 %254 253 %237 = OpLabel 254 %241 = OpAccessChain %22 %20 %21 %21 255 %242 = OpLoad %6 %241 256 %243 = OpConvertSToF %52 %242 257 %244 = OpAccessChain %22 %20 %21 %65 258 %245 = OpLoad %6 %244 259 %246 = OpConvertSToF %52 %245 260 %247 = OpAccessChain %22 %20 %21 %65 261 %248 = OpLoad %6 %247 262 %249 = OpConvertSToF %52 %248 263 %250 = OpAccessChain %22 %20 %21 %21 264 %251 = OpLoad %6 %250 265 %252 = OpConvertSToF %52 %251 266 %253 = OpCompositeConstruct %53 %243 %246 %249 %252 267 OpStore %240 %253 268 OpBranch %238 269 %254 = OpLabel 270 %255 = OpAccessChain %22 %20 %21 %65 271 %256 = OpLoad %6 %255 272 %257 = OpConvertSToF %52 %256 273 %258 = OpCompositeConstruct %53 %257 %257 %257 %257 274 OpStore %240 %258 275 OpBranch %238 276 %238 = OpLabel 277 OpReturn 278 OpFunctionEnd 279 %9 = OpFunction %7 None %8 280 %10 = OpLabel 281 %14 = OpVariable %13 Function 282 %27 = OpVariable %26 Function 283 %30 = OpVariable %26 Function 284 %40 = OpVariable %26 Function 285 %41 = OpVariable %26 Function 286 %85 = OpVariable %84 Function 287 %98 = OpVariable %26 Function 288 %110 = OpVariable %84 Function 289 %120 = OpVariable %26 Function 290 %132 = OpVariable %84 Function 291 %142 = OpVariable %26 Function 292 %157 = OpVariable %26 Function 293 %176 = OpVariable %26 Function 294 %23 = OpAccessChain %22 %20 %21 %21 295 %24 = OpLoad %6 %23 296 %25 = OpCompositeConstruct %7 %24 %24 %24 %24 297 OpStore %14 %25 298 %28 = OpAccessChain %22 %20 %21 %21 299 %29 = OpLoad %6 %28 300 OpStore %27 %29 301 OpStore %30 %21 302 OpBranch %31 303 %31 = OpLabel 304 OpLoopMerge %33 %34 None 305 OpBranch %35 306 %35 = OpLabel 307 %36 = OpLoad %6 %30 308 %39 = OpSLessThan %38 %36 %37 309 OpBranchConditional %39 %32 %33 310 %32 = OpLabel 311 OpStore %40 %21 312 %42 = OpAccessChain %22 %20 %21 %21 313 %43 = OpLoad %6 %42 314 OpStore %41 %43 315 OpBranch %44 316 %44 = OpLabel 317 OpLoopMerge %46 %47 None 318 OpBranch %48 319 %48 = OpLabel 320 %49 = OpLoad %6 %40 321 %51 = OpSLessThan %38 %49 %50 322 OpBranchConditional %51 %45 %46 323 %45 = OpLabel 324 %58 = OpAccessChain %57 %55 %56 325 %59 = OpLoad %52 %58 326 %67 = OpAccessChain %66 %64 %21 %65 327 %68 = OpLoad %52 %67 328 %69 = OpFOrdLessThan %38 %59 %68 329 OpSelectionMerge %71 None 330 OpBranchConditional %69 %70 %154 331 %70 = OpLabel 332 %77 = OpAccessChain %66 %75 %21 %76 333 %78 = OpLoad %52 %77 334 %79 = OpAccessChain %66 %64 %21 %65 335 %80 = OpLoad %52 %79 336 %81 = OpFOrdGreaterThan %38 %78 %80 337 OpSelectionMerge %83 None 338 OpBranchConditional %81 %82 %83 339 %82 = OpLabel 340 %86 = OpAccessChain %66 %64 %21 %21 341 %87 = OpLoad %52 %86 342 %88 = OpCompositeConstruct %72 %87 %87 343 %89 = OpAccessChain %66 %64 %21 %21 344 %90 = OpLoad %52 %89 345 %94 = OpCompositeConstruct %72 %90 %93 346 %95 = OpCompositeConstruct %72 %93 %90 347 %96 = OpCompositeConstruct %91 %94 %95 348 %97 = OpVectorTimesMatrix %72 %88 %96 349 OpStore %85 %97 350 %99 = OpAccessChain %22 %20 %21 %21 351 %100 = OpLoad %6 %99 352 OpStore %98 %100 353 OpBranch %101 354 %101 = OpLabel 355 OpLoopMerge %103 %104 None 356 OpBranch %105 357 %105 = OpLabel 358 %106 = OpLoad %6 %98 359 %107 = OpSGreaterThanEqual %38 %106 %65 360 OpBranchConditional %107 %102 %103 361 %102 = OpLabel 362 OpBranch %104 363 %104 = OpLabel 364 %108 = OpLoad %6 %98 365 %109 = OpISub %6 %108 %65 366 OpStore %98 %109 367 OpBranch %101 368 %103 = OpLabel 369 %111 = OpAccessChain %66 %64 %21 %21 370 %112 = OpLoad %52 %111 371 %113 = OpCompositeConstruct %72 %112 %112 372 %114 = OpAccessChain %66 %64 %21 %21 373 %115 = OpLoad %52 %114 374 %116 = OpCompositeConstruct %72 %115 %93 375 %117 = OpCompositeConstruct %72 %93 %115 376 %118 = OpCompositeConstruct %91 %116 %117 377 %119 = OpVectorTimesMatrix %72 %113 %118 378 OpStore %110 %119 379 %121 = OpAccessChain %22 %20 %21 %21 380 %122 = OpLoad %6 %121 381 OpStore %120 %122 382 OpBranch %123 383 %123 = OpLabel 384 OpLoopMerge %125 %126 None 385 OpBranch %127 386 %127 = OpLabel 387 %128 = OpLoad %6 %120 388 %129 = OpSGreaterThanEqual %38 %128 %65 389 OpBranchConditional %129 %124 %125 390 %124 = OpLabel 391 OpBranch %126 392 %126 = OpLabel 393 %130 = OpLoad %6 %120 394 %131 = OpISub %6 %130 %65 395 OpStore %120 %131 396 OpBranch %123 397 %125 = OpLabel 398 %133 = OpAccessChain %66 %64 %21 %21 399 %134 = OpLoad %52 %133 400 %135 = OpCompositeConstruct %72 %134 %134 401 %136 = OpAccessChain %66 %64 %21 %21 402 %137 = OpLoad %52 %136 403 %138 = OpCompositeConstruct %72 %137 %93 404 %139 = OpCompositeConstruct %72 %93 %137 405 %140 = OpCompositeConstruct %91 %138 %139 406 %141 = OpVectorTimesMatrix %72 %135 %140 407 OpStore %132 %141 408 %143 = OpAccessChain %22 %20 %21 %21 409 %144 = OpLoad %6 %143 410 OpStore %142 %144 411 OpBranch %145 412 %145 = OpLabel 413 OpLoopMerge %147 %148 None 414 OpBranch %149 415 %149 = OpLabel 416 %150 = OpLoad %6 %142 417 %151 = OpSGreaterThanEqual %38 %150 %21 418 OpBranchConditional %151 %146 %147 419 %146 = OpLabel 420 OpBranch %148 421 %148 = OpLabel 422 %152 = OpLoad %6 %142 423 %153 = OpISub %6 %152 %65 424 OpStore %142 %153 425 OpBranch %145 426 %147 = OpLabel 427 OpBranch %83 428 %83 = OpLabel 429 OpBranch %71 430 %154 = OpLabel 431 %155 = OpLoad %6 %40 432 %156 = OpIAdd %6 %155 %65 433 OpStore %40 %156 434 OpBranch %71 435 %71 = OpLabel 436 %158 = OpAccessChain %22 %20 %21 %65 437 %159 = OpLoad %6 %158 438 OpStore %157 %159 439 OpBranch %160 440 %160 = OpLabel 441 OpLoopMerge %162 %163 None 442 OpBranch %164 443 %164 = OpLabel 444 %165 = OpLoad %6 %157 445 %166 = OpLoad %6 %41 446 %167 = OpSLessThan %38 %165 %166 447 OpBranchConditional %167 %161 %162 448 %161 = OpLabel 449 %168 = OpLoad %6 %27 450 %169 = OpIAdd %6 %168 %65 451 OpStore %27 %169 452 OpBranch %163 453 %163 = OpLabel 454 %170 = OpLoad %6 %157 455 %171 = OpIAdd %6 %170 %65 456 OpStore %157 %171 457 OpBranch %160 458 %162 = OpLabel 459 %172 = OpAccessChain %22 %20 %21 %37 460 %173 = OpLoad %6 %172 461 %174 = OpLoad %6 %27 462 %175 = OpIMul %6 %174 %173 463 OpStore %27 %175 464 %177 = OpAccessChain %22 %20 %21 %65 465 %178 = OpLoad %6 %177 466 OpStore %176 %178 467 OpBranch %179 468 %179 = OpLabel 469 OpLoopMerge %181 %182 None 470 OpBranch %183 471 %183 = OpLabel 472 %184 = OpLoad %6 %176 473 %185 = OpAccessChain %22 %20 %21 %50 474 %186 = OpLoad %6 %185 475 %187 = OpSLessThan %38 %184 %186 476 OpBranchConditional %187 %180 %181 477 %180 = OpLabel 478 %188 = OpLoad %6 %176 479 %189 = OpLoad %6 %27 480 %190 = OpAccessChain %26 %14 %188 481 OpStore %190 %189 482 OpBranch %182 483 %182 = OpLabel 484 %191 = OpLoad %6 %176 485 %192 = OpIAdd %6 %191 %65 486 OpStore %176 %192 487 OpBranch %179 488 %181 = OpLabel 489 OpBranch %47 490 %47 = OpLabel 491 %193 = OpLoad %6 %41 492 %194 = OpIAdd %6 %193 %65 493 OpStore %41 %194 494 OpBranch %44 495 %46 = OpLabel 496 OpBranch %34 497 %34 = OpLabel 498 %195 = OpLoad %6 %30 499 %196 = OpIAdd %6 %195 %65 500 OpStore %30 %196 501 OpBranch %31 502 %33 = OpLabel 503 %197 = OpLoad %7 %14 504 OpReturnValue %197 505 OpFunctionEnd 506 %11 = OpFunction %7 None %8 507 %12 = OpLabel 508 %200 = OpVariable %13 Function 509 %202 = OpVariable %26 Function 510 %203 = OpVariable %26 Function 511 %211 = OpVariable %26 Function 512 OpStore %200 %201 513 OpStore %202 %65 514 OpStore %203 %21 515 OpBranch %204 516 %204 = OpLabel 517 OpLoopMerge %206 %207 None 518 OpBranch %208 519 %208 = OpLabel 520 %209 = OpLoad %6 %203 521 %210 = OpSLessThan %38 %209 %37 522 OpBranchConditional %210 %205 %206 523 %205 = OpLabel 524 OpStore %211 %65 525 OpBranch %212 526 %212 = OpLabel 527 OpLoopMerge %214 %215 None 528 OpBranch %216 529 %216 = OpLabel 530 %217 = OpLoad %6 %211 531 %219 = OpSLessThan %38 %217 %218 532 OpBranchConditional %219 %213 %214 533 %213 = OpLabel 534 %220 = OpLoad %6 %202 535 %221 = OpLoad %6 %211 536 %222 = OpIAdd %6 %220 %221 537 %223 = OpIMul %6 %222 %37 538 OpStore %202 %223 539 OpBranch %215 540 %215 = OpLabel 541 %224 = OpLoad %6 %211 542 %225 = OpIAdd %6 %224 %65 543 OpStore %211 %225 544 OpBranch %212 545 %214 = OpLabel 546 OpBranch %207 547 %207 = OpLabel 548 %226 = OpLoad %6 %203 549 %227 = OpIAdd %6 %226 %65 550 OpStore %203 %227 551 OpBranch %204 552 %206 = OpLabel 553 %228 = OpLoad %6 %202 554 %229 = OpCompositeConstruct %7 %228 %228 %228 %228 555 OpReturnValue %229 556 OpFunctionEnd 557END 558 559# uniforms for variant 560 561# injectionSwitch 562BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA 563 0.0 1.0 564END 565# _GLF_uniform_int_values 566BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 567 1 0 2 4 568END 569# _GLF_uniform_float_values 570BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA 571 1.0 0.0 2.0 572END 573 574BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 575 576PIPELINE graphics variant_pipeline 577 ATTACH variant_vertex_shader 578 ATTACH variant_fragment_shader 579 FRAMEBUFFER_SIZE 32 32 580 BIND BUFFER variant_framebuffer AS color LOCATION 0 581 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 2 582 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1 583 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0 584END 585CLEAR_COLOR variant_pipeline 0 0 0 255 586 587CLEAR variant_pipeline 588RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32 589 590EXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255 591