blob: 1199b8c4c599e2fcfd39f27542ac9e0f3f7d9398 [file] [log] [blame]
#!amber
# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# A test for a coverage-gap found by the GraphicsFuzz project.
# Short description: A fragment shader that covers specific BRW code paths
# The test passes because the shader always writes red.
# Optimized using spirv-opt with the following arguments:
# '-O'
# spirv-opt commit hash: a0370efd589be33d5d9a85cfde2f85841b3755af
SHADER vertex variant_vertex_shader PASSTHROUGH
# variant_fragment_shader is derived from the following GLSL:
# #version 320 es
#
# #define _GLF_MAKE_IN_BOUNDS_INT(IDX, SZ) clamp(IDX, 0, SZ - 1)
# #define LOOP for (int i = 0; i < 1; i++)
#
# precision highp float;
# precision highp int;
#
# const int _GLF_global_loop_bound = 100;
# int _GLF_global_loop_count = 0;
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
# float arr[10] = float[10](1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0);
# int index = 0;
#
# while(_GLF_global_loop_count < _GLF_global_loop_bound)
# {
# // The inner loop will be iterated just once.
# LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP {
# LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP {
# LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP { LOOP {
# LOOP { LOOP { LOOP { LOOP { LOOP
# {
# _GLF_global_loop_count ++;
# }
# } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }
#
# // In the end all elemenst of arr have a value of 2.0.
# arr[_GLF_MAKE_IN_BOUNDS_INT(index, 10)] = float[10](2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0)[_GLF_MAKE_IN_BOUNDS_INT(index, 10)];
# index++;
# }
#
# // The selected indices don't matter as all have the same data of 2.0.
# vec2 v = vec2(arr[_GLF_MAKE_IN_BOUNDS_INT(int(gl_FragCoord.x), 10)], arr[_GLF_MAKE_IN_BOUNDS_INT(int(gl_FragCoord.y), 10)]);
#
# // Always true.
# if (v.x == 2.0 && v.y == 2.0)
# _GLF_color = vec4(1, 0, 0, 1);
# else
# _GLF_color = vec4(0);
#
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 583
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %4 "main" %431 %460
OpExecutionMode %4 OriginUpperLeft
OpSource ESSL 320
OpName %4 "main"
OpName %15 "arr"
OpName %419 "indexable"
OpName %431 "gl_FragCoord"
OpName %460 "_GLF_color"
OpDecorate %431 BuiltIn FragCoord
OpDecorate %460 Location 0
%2 = OpTypeVoid
%3 = OpTypeFunction %2
%6 = OpTypeInt 32 1
%9 = OpConstant %6 0
%10 = OpTypeFloat 32
%11 = OpTypeInt 32 0
%12 = OpConstant %11 10
%13 = OpTypeArray %10 %12
%14 = OpTypePointer Function %13
%16 = OpConstant %10 1
%17 = OpConstantComposite %13 %16 %16 %16 %16 %16 %16 %16 %16 %16 %16
%26 = OpConstant %6 100
%27 = OpTypeBool
%36 = OpConstant %6 1
%413 = OpConstant %6 9
%415 = OpConstant %10 2
%416 = OpConstantComposite %13 %415 %415 %415 %415 %415 %415 %415 %415 %415 %415
%420 = OpTypePointer Function %10
%429 = OpTypeVector %10 4
%430 = OpTypePointer Input %429
%431 = OpVariable %430 Input
%432 = OpConstant %11 0
%433 = OpTypePointer Input %10
%440 = OpConstant %11 1
%459 = OpTypePointer Output %429
%460 = OpVariable %459 Output
%461 = OpConstant %10 0
%462 = OpConstantComposite %429 %16 %461 %461 %16
%464 = OpConstantComposite %429 %461 %461 %461 %461
%4 = OpFunction %2 None %3
%5 = OpLabel
%15 = OpVariable %14 Function
%419 = OpVariable %14 Function
OpStore %15 %17
OpBranch %20
%20 = OpLabel
%470 = OpPhi %6 %9 %5 %425 %23
%467 = OpPhi %6 %9 %5 %582 %23
%28 = OpSLessThan %27 %467 %26
OpLoopMerge %22 %23 None
OpBranchConditional %28 %21 %22
%21 = OpLabel
OpBranch %30
%30 = OpLabel
%468 = OpPhi %6 %9 %21 %411 %33
%582 = OpPhi %6 %467 %21 %581 %33
%37 = OpSLessThan %27 %468 %36
OpLoopMerge %32 %33 None
OpBranchConditional %37 %31 %32
%31 = OpLabel
OpBranch %39
%39 = OpLabel
%471 = OpPhi %6 %9 %31 %409 %42
%581 = OpPhi %6 %582 %31 %580 %42
%45 = OpSLessThan %27 %471 %36
OpLoopMerge %41 %42 None
OpBranchConditional %45 %40 %41
%40 = OpLabel
OpBranch %47
%47 = OpLabel
%473 = OpPhi %6 %9 %40 %407 %50
%580 = OpPhi %6 %581 %40 %579 %50
%53 = OpSLessThan %27 %473 %36
OpLoopMerge %49 %50 None
OpBranchConditional %53 %48 %49
%48 = OpLabel
OpBranch %55
%55 = OpLabel
%475 = OpPhi %6 %9 %48 %405 %58
%579 = OpPhi %6 %580 %48 %578 %58
%61 = OpSLessThan %27 %475 %36
OpLoopMerge %57 %58 None
OpBranchConditional %61 %56 %57
%56 = OpLabel
OpBranch %63
%63 = OpLabel
%477 = OpPhi %6 %9 %56 %403 %66
%578 = OpPhi %6 %579 %56 %577 %66
%69 = OpSLessThan %27 %477 %36
OpLoopMerge %65 %66 None
OpBranchConditional %69 %64 %65
%64 = OpLabel
OpBranch %71
%71 = OpLabel
%479 = OpPhi %6 %9 %64 %401 %74
%577 = OpPhi %6 %578 %64 %576 %74
%77 = OpSLessThan %27 %479 %36
OpLoopMerge %73 %74 None
OpBranchConditional %77 %72 %73
%72 = OpLabel
OpBranch %79
%79 = OpLabel
%481 = OpPhi %6 %9 %72 %399 %82
%576 = OpPhi %6 %577 %72 %575 %82
%85 = OpSLessThan %27 %481 %36
OpLoopMerge %81 %82 None
OpBranchConditional %85 %80 %81
%80 = OpLabel
OpBranch %87
%87 = OpLabel
%483 = OpPhi %6 %9 %80 %397 %90
%575 = OpPhi %6 %576 %80 %574 %90
%93 = OpSLessThan %27 %483 %36
OpLoopMerge %89 %90 None
OpBranchConditional %93 %88 %89
%88 = OpLabel
OpBranch %95
%95 = OpLabel
%485 = OpPhi %6 %9 %88 %395 %98
%574 = OpPhi %6 %575 %88 %573 %98
%101 = OpSLessThan %27 %485 %36
OpLoopMerge %97 %98 None
OpBranchConditional %101 %96 %97
%96 = OpLabel
OpBranch %103
%103 = OpLabel
%487 = OpPhi %6 %9 %96 %393 %106
%573 = OpPhi %6 %574 %96 %572 %106
%109 = OpSLessThan %27 %487 %36
OpLoopMerge %105 %106 None
OpBranchConditional %109 %104 %105
%104 = OpLabel
OpBranch %111
%111 = OpLabel
%489 = OpPhi %6 %9 %104 %391 %114
%572 = OpPhi %6 %573 %104 %571 %114
%117 = OpSLessThan %27 %489 %36
OpLoopMerge %113 %114 None
OpBranchConditional %117 %112 %113
%112 = OpLabel
OpBranch %119
%119 = OpLabel
%491 = OpPhi %6 %9 %112 %389 %122
%571 = OpPhi %6 %572 %112 %570 %122
%125 = OpSLessThan %27 %491 %36
OpLoopMerge %121 %122 None
OpBranchConditional %125 %120 %121
%120 = OpLabel
OpBranch %127
%127 = OpLabel
%493 = OpPhi %6 %9 %120 %387 %130
%570 = OpPhi %6 %571 %120 %569 %130
%133 = OpSLessThan %27 %493 %36
OpLoopMerge %129 %130 None
OpBranchConditional %133 %128 %129
%128 = OpLabel
OpBranch %135
%135 = OpLabel
%495 = OpPhi %6 %9 %128 %385 %138
%569 = OpPhi %6 %570 %128 %568 %138
%141 = OpSLessThan %27 %495 %36
OpLoopMerge %137 %138 None
OpBranchConditional %141 %136 %137
%136 = OpLabel
OpBranch %143
%143 = OpLabel
%497 = OpPhi %6 %9 %136 %383 %146
%568 = OpPhi %6 %569 %136 %567 %146
%149 = OpSLessThan %27 %497 %36
OpLoopMerge %145 %146 None
OpBranchConditional %149 %144 %145
%144 = OpLabel
OpBranch %151
%151 = OpLabel
%499 = OpPhi %6 %9 %144 %381 %154
%567 = OpPhi %6 %568 %144 %566 %154
%157 = OpSLessThan %27 %499 %36
OpLoopMerge %153 %154 None
OpBranchConditional %157 %152 %153
%152 = OpLabel
OpBranch %159
%159 = OpLabel
%501 = OpPhi %6 %9 %152 %379 %162
%566 = OpPhi %6 %567 %152 %565 %162
%165 = OpSLessThan %27 %501 %36
OpLoopMerge %161 %162 None
OpBranchConditional %165 %160 %161
%160 = OpLabel
OpBranch %167
%167 = OpLabel
%503 = OpPhi %6 %9 %160 %377 %170
%565 = OpPhi %6 %566 %160 %564 %170
%173 = OpSLessThan %27 %503 %36
OpLoopMerge %169 %170 None
OpBranchConditional %173 %168 %169
%168 = OpLabel
OpBranch %175
%175 = OpLabel
%505 = OpPhi %6 %9 %168 %375 %178
%564 = OpPhi %6 %565 %168 %563 %178
%181 = OpSLessThan %27 %505 %36
OpLoopMerge %177 %178 None
OpBranchConditional %181 %176 %177
%176 = OpLabel
OpBranch %183
%183 = OpLabel
%507 = OpPhi %6 %9 %176 %373 %186
%563 = OpPhi %6 %564 %176 %562 %186
%189 = OpSLessThan %27 %507 %36
OpLoopMerge %185 %186 None
OpBranchConditional %189 %184 %185
%184 = OpLabel
OpBranch %191
%191 = OpLabel
%509 = OpPhi %6 %9 %184 %371 %194
%562 = OpPhi %6 %563 %184 %561 %194
%197 = OpSLessThan %27 %509 %36
OpLoopMerge %193 %194 None
OpBranchConditional %197 %192 %193
%192 = OpLabel
OpBranch %199
%199 = OpLabel
%511 = OpPhi %6 %9 %192 %369 %202
%561 = OpPhi %6 %562 %192 %560 %202
%205 = OpSLessThan %27 %511 %36
OpLoopMerge %201 %202 None
OpBranchConditional %205 %200 %201
%200 = OpLabel
OpBranch %207
%207 = OpLabel
%513 = OpPhi %6 %9 %200 %367 %210
%560 = OpPhi %6 %561 %200 %559 %210
%213 = OpSLessThan %27 %513 %36
OpLoopMerge %209 %210 None
OpBranchConditional %213 %208 %209
%208 = OpLabel
OpBranch %215
%215 = OpLabel
%515 = OpPhi %6 %9 %208 %365 %218
%559 = OpPhi %6 %560 %208 %558 %218
%221 = OpSLessThan %27 %515 %36
OpLoopMerge %217 %218 None
OpBranchConditional %221 %216 %217
%216 = OpLabel
OpBranch %223
%223 = OpLabel
%517 = OpPhi %6 %9 %216 %363 %226
%558 = OpPhi %6 %559 %216 %557 %226
%229 = OpSLessThan %27 %517 %36
OpLoopMerge %225 %226 None
OpBranchConditional %229 %224 %225
%224 = OpLabel
OpBranch %231
%231 = OpLabel
%519 = OpPhi %6 %9 %224 %361 %234
%557 = OpPhi %6 %558 %224 %556 %234
%237 = OpSLessThan %27 %519 %36
OpLoopMerge %233 %234 None
OpBranchConditional %237 %232 %233
%232 = OpLabel
OpBranch %239
%239 = OpLabel
%521 = OpPhi %6 %9 %232 %359 %242
%556 = OpPhi %6 %557 %232 %555 %242
%245 = OpSLessThan %27 %521 %36
OpLoopMerge %241 %242 None
OpBranchConditional %245 %240 %241
%240 = OpLabel
OpBranch %247
%247 = OpLabel
%523 = OpPhi %6 %9 %240 %357 %250
%555 = OpPhi %6 %556 %240 %554 %250
%253 = OpSLessThan %27 %523 %36
OpLoopMerge %249 %250 None
OpBranchConditional %253 %248 %249
%248 = OpLabel
OpBranch %255
%255 = OpLabel
%525 = OpPhi %6 %9 %248 %355 %258
%554 = OpPhi %6 %555 %248 %553 %258
%261 = OpSLessThan %27 %525 %36
OpLoopMerge %257 %258 None
OpBranchConditional %261 %256 %257
%256 = OpLabel
OpBranch %263
%263 = OpLabel
%527 = OpPhi %6 %9 %256 %353 %266
%553 = OpPhi %6 %554 %256 %552 %266
%269 = OpSLessThan %27 %527 %36
OpLoopMerge %265 %266 None
OpBranchConditional %269 %264 %265
%264 = OpLabel
OpBranch %271
%271 = OpLabel
%529 = OpPhi %6 %9 %264 %351 %274
%552 = OpPhi %6 %553 %264 %551 %274
%277 = OpSLessThan %27 %529 %36
OpLoopMerge %273 %274 None
OpBranchConditional %277 %272 %273
%272 = OpLabel
OpBranch %279
%279 = OpLabel
%531 = OpPhi %6 %9 %272 %349 %282
%551 = OpPhi %6 %552 %272 %550 %282
%285 = OpSLessThan %27 %531 %36
OpLoopMerge %281 %282 None
OpBranchConditional %285 %280 %281
%280 = OpLabel
OpBranch %287
%287 = OpLabel
%533 = OpPhi %6 %9 %280 %347 %290
%550 = OpPhi %6 %551 %280 %549 %290
%293 = OpSLessThan %27 %533 %36
OpLoopMerge %289 %290 None
OpBranchConditional %293 %288 %289
%288 = OpLabel
OpBranch %295
%295 = OpLabel
%535 = OpPhi %6 %9 %288 %345 %298
%549 = OpPhi %6 %550 %288 %548 %298
%301 = OpSLessThan %27 %535 %36
OpLoopMerge %297 %298 None
OpBranchConditional %301 %296 %297
%296 = OpLabel
OpBranch %303
%303 = OpLabel
%537 = OpPhi %6 %9 %296 %343 %306
%548 = OpPhi %6 %549 %296 %547 %306
%309 = OpSLessThan %27 %537 %36
OpLoopMerge %305 %306 None
OpBranchConditional %309 %304 %305
%304 = OpLabel
OpBranch %311
%311 = OpLabel
%539 = OpPhi %6 %9 %304 %341 %314
%547 = OpPhi %6 %548 %304 %546 %314
%317 = OpSLessThan %27 %539 %36
OpLoopMerge %313 %314 None
OpBranchConditional %317 %312 %313
%312 = OpLabel
OpBranch %319
%319 = OpLabel
%541 = OpPhi %6 %9 %312 %339 %322
%546 = OpPhi %6 %547 %312 %545 %322
%325 = OpSLessThan %27 %541 %36
OpLoopMerge %321 %322 None
OpBranchConditional %325 %320 %321
%320 = OpLabel
OpBranch %327
%327 = OpLabel
%545 = OpPhi %6 %546 %320 %335 %328
%543 = OpPhi %6 %9 %320 %337 %328
%333 = OpSLessThan %27 %543 %36
OpLoopMerge %329 %328 None
OpBranchConditional %333 %328 %329
%328 = OpLabel
%335 = OpIAdd %6 %545 %36
%337 = OpIAdd %6 %543 %36
OpBranch %327
%329 = OpLabel
OpBranch %322
%322 = OpLabel
%339 = OpIAdd %6 %541 %36
OpBranch %319
%321 = OpLabel
OpBranch %314
%314 = OpLabel
%341 = OpIAdd %6 %539 %36
OpBranch %311
%313 = OpLabel
OpBranch %306
%306 = OpLabel
%343 = OpIAdd %6 %537 %36
OpBranch %303
%305 = OpLabel
OpBranch %298
%298 = OpLabel
%345 = OpIAdd %6 %535 %36
OpBranch %295
%297 = OpLabel
OpBranch %290
%290 = OpLabel
%347 = OpIAdd %6 %533 %36
OpBranch %287
%289 = OpLabel
OpBranch %282
%282 = OpLabel
%349 = OpIAdd %6 %531 %36
OpBranch %279
%281 = OpLabel
OpBranch %274
%274 = OpLabel
%351 = OpIAdd %6 %529 %36
OpBranch %271
%273 = OpLabel
OpBranch %266
%266 = OpLabel
%353 = OpIAdd %6 %527 %36
OpBranch %263
%265 = OpLabel
OpBranch %258
%258 = OpLabel
%355 = OpIAdd %6 %525 %36
OpBranch %255
%257 = OpLabel
OpBranch %250
%250 = OpLabel
%357 = OpIAdd %6 %523 %36
OpBranch %247
%249 = OpLabel
OpBranch %242
%242 = OpLabel
%359 = OpIAdd %6 %521 %36
OpBranch %239
%241 = OpLabel
OpBranch %234
%234 = OpLabel
%361 = OpIAdd %6 %519 %36
OpBranch %231
%233 = OpLabel
OpBranch %226
%226 = OpLabel
%363 = OpIAdd %6 %517 %36
OpBranch %223
%225 = OpLabel
OpBranch %218
%218 = OpLabel
%365 = OpIAdd %6 %515 %36
OpBranch %215
%217 = OpLabel
OpBranch %210
%210 = OpLabel
%367 = OpIAdd %6 %513 %36
OpBranch %207
%209 = OpLabel
OpBranch %202
%202 = OpLabel
%369 = OpIAdd %6 %511 %36
OpBranch %199
%201 = OpLabel
OpBranch %194
%194 = OpLabel
%371 = OpIAdd %6 %509 %36
OpBranch %191
%193 = OpLabel
OpBranch %186
%186 = OpLabel
%373 = OpIAdd %6 %507 %36
OpBranch %183
%185 = OpLabel
OpBranch %178
%178 = OpLabel
%375 = OpIAdd %6 %505 %36
OpBranch %175
%177 = OpLabel
OpBranch %170
%170 = OpLabel
%377 = OpIAdd %6 %503 %36
OpBranch %167
%169 = OpLabel
OpBranch %162
%162 = OpLabel
%379 = OpIAdd %6 %501 %36
OpBranch %159
%161 = OpLabel
OpBranch %154
%154 = OpLabel
%381 = OpIAdd %6 %499 %36
OpBranch %151
%153 = OpLabel
OpBranch %146
%146 = OpLabel
%383 = OpIAdd %6 %497 %36
OpBranch %143
%145 = OpLabel
OpBranch %138
%138 = OpLabel
%385 = OpIAdd %6 %495 %36
OpBranch %135
%137 = OpLabel
OpBranch %130
%130 = OpLabel
%387 = OpIAdd %6 %493 %36
OpBranch %127
%129 = OpLabel
OpBranch %122
%122 = OpLabel
%389 = OpIAdd %6 %491 %36
OpBranch %119
%121 = OpLabel
OpBranch %114
%114 = OpLabel
%391 = OpIAdd %6 %489 %36
OpBranch %111
%113 = OpLabel
OpBranch %106
%106 = OpLabel
%393 = OpIAdd %6 %487 %36
OpBranch %103
%105 = OpLabel
OpBranch %98
%98 = OpLabel
%395 = OpIAdd %6 %485 %36
OpBranch %95
%97 = OpLabel
OpBranch %90
%90 = OpLabel
%397 = OpIAdd %6 %483 %36
OpBranch %87
%89 = OpLabel
OpBranch %82
%82 = OpLabel
%399 = OpIAdd %6 %481 %36
OpBranch %79
%81 = OpLabel
OpBranch %74
%74 = OpLabel
%401 = OpIAdd %6 %479 %36
OpBranch %71
%73 = OpLabel
OpBranch %66
%66 = OpLabel
%403 = OpIAdd %6 %477 %36
OpBranch %63
%65 = OpLabel
OpBranch %58
%58 = OpLabel
%405 = OpIAdd %6 %475 %36
OpBranch %55
%57 = OpLabel
OpBranch %50
%50 = OpLabel
%407 = OpIAdd %6 %473 %36
OpBranch %47
%49 = OpLabel
OpBranch %42
%42 = OpLabel
%409 = OpIAdd %6 %471 %36
OpBranch %39
%41 = OpLabel
OpBranch %33
%33 = OpLabel
%411 = OpIAdd %6 %468 %36
OpBranch %30
%32 = OpLabel
%414 = OpExtInst %6 %1 SClamp %470 %9 %413
OpStore %419 %416
%421 = OpAccessChain %420 %419 %414
%422 = OpLoad %10 %421
%423 = OpAccessChain %420 %15 %414
OpStore %423 %422
%425 = OpIAdd %6 %470 %36
OpBranch %23
%23 = OpLabel
OpBranch %20
%22 = OpLabel
%434 = OpAccessChain %433 %431 %432
%435 = OpLoad %10 %434
%436 = OpConvertFToS %6 %435
%437 = OpExtInst %6 %1 SClamp %436 %9 %413
%438 = OpAccessChain %420 %15 %437
%439 = OpLoad %10 %438
%441 = OpAccessChain %433 %431 %440
%442 = OpLoad %10 %441
%443 = OpConvertFToS %6 %442
%444 = OpExtInst %6 %1 SClamp %443 %9 %413
%445 = OpAccessChain %420 %15 %444
%446 = OpLoad %10 %445
%450 = OpFOrdEqual %27 %439 %415
OpSelectionMerge %452 None
OpBranchConditional %450 %451 %452
%451 = OpLabel
%455 = OpFOrdEqual %27 %446 %415
OpBranch %452
%452 = OpLabel
%456 = OpPhi %27 %450 %22 %455 %451
OpSelectionMerge %458 None
OpBranchConditional %456 %457 %463
%457 = OpLabel
OpStore %460 %462
OpBranch %458
%463 = OpLabel
OpStore %460 %464
OpBranch %458
%458 = OpLabel
OpReturn
OpFunctionEnd
END
BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
PIPELINE graphics variant_pipeline
ATTACH variant_vertex_shader
ATTACH variant_fragment_shader
FRAMEBUFFER_SIZE 256 256
BIND BUFFER variant_framebuffer AS color LOCATION 0
END
CLEAR_COLOR variant_pipeline 0 0 0 255
CLEAR variant_pipeline
RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255