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