#!amber # Copyright 2019 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 bug found by GraphicsFuzz. # Short description: A fragment shader performing a search computation, then writing red regardless # The test passes because the uniform values used to run the shader guarantee # that red will be written at the end, regardless of what the prior computation # does. SHADER vertex variant_vertex_shader PASSTHROUGH # variant_fragment_shader is derived from the following GLSL: # #version 310 es # precision highp float; # # layout(location = 0) out vec4 _GLF_color; # # layout(set = 0, binding = 0) uniform buf0 { # vec2 injectionSwitch; # }; # struct BST { # int data; # int leftIndex; # int rightIndex; # } ; # # BST tree[10]; # # struct Obj { # float odd_numbers[10]; # float even_numbers[10]; # } ; # # void makeTreeNode(inout BST tree, int data) # { # tree.data = data; # tree.leftIndex = - 1; # tree.rightIndex = - 1; # } # void insert(int treeIndex, int data) # { # int baseIndex = 0; # while(baseIndex <= treeIndex) # { # if(data <= tree[baseIndex].data) # { # if(tree[baseIndex].leftIndex == - 1) # { # tree[baseIndex].leftIndex = treeIndex; # makeTreeNode(tree[treeIndex], data); # return; # } # else # { # baseIndex = tree[baseIndex].leftIndex; # continue; # } # } # else # { # if(tree[baseIndex].rightIndex == - 1) # { # tree[baseIndex].rightIndex = treeIndex; # makeTreeNode(tree[treeIndex], data); # return; # } # else # { # int GLF_live8i = 1; # float GLF_live8A[50]; # GLF_live8A[GLF_live8i >= 0 && GLF_live8i < 50 ? GLF_live8i : 0] += GLF_live8A[(1 - 1) >= 0 && (1 - 1) < 50 ? 1 - 1 : 0]; # do # { # baseIndex = tree[baseIndex].rightIndex; # } # while((injectionSwitch.x > injectionSwitch.y)); # continue; # } # } # } # } # int search(int target) # { # BST currentNode; # int index = 0; # while(index != - 1) # { # currentNode = tree[index]; # if(currentNode.data == target) # { # return target; # } # index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex; # } # return - 1; # } # vec3 hueColor(float angle) # { # float nodeData = float(search(15)); # return (30.0 + angle * vec3(1.0, 5.0, nodeData)) / 50.0; # } # float makeFrame(float v) # { # v *= 6.5; # if(v < 1.5) # { # return float(search(100)); # } # if(v < 4.0) # { # return 0.0; # } # if(v < float(search(6))) # { # return 1.0; # } # return 10.0 + float(search(30)); # } # void main() # { # int treeIndex = 0; # makeTreeNode(tree[0], 9); # treeIndex ++; # insert(treeIndex, 5); # treeIndex ++; # int GLF_live1_looplimiter2 = 0; # for( # int GLF_live1i = 0; # 1 < 4; # GLF_live1i ++ # ) # { # if(GLF_live1_looplimiter2 >= 7) # { # break; # } # GLF_live1_looplimiter2 ++; # } # insert(treeIndex, 12); # treeIndex ++; # insert(treeIndex, 15); # treeIndex ++; # insert(treeIndex, 7); # treeIndex ++; # insert(treeIndex, 8); # treeIndex ++; # insert(treeIndex, 2); # treeIndex ++; # insert(treeIndex, 6); # treeIndex ++; # Obj GLF_live4obj; # int GLF_live4_looplimiter3 = 0; # for( # int GLF_live4i = 0; # 1 < 9; # GLF_live4i ++ # ) # { # if(GLF_live4_looplimiter3 >= 3) # { # break; # } # GLF_live4_looplimiter3 ++; # int GLF_live4index = 1; # GLF_live4obj.even_numbers[GLF_live4index >= 0 && GLF_live4index < 10 ? GLF_live4index : 0] = GLF_live4obj.even_numbers[1 >= 0 && 1 < 10 ? 1 : 0]; # GLF_live4obj.even_numbers[GLF_live4i >= 0 && GLF_live4i < 10 ? GLF_live4i : 0] = 1.0; # } # insert(treeIndex, 17); # if((injectionSwitch.x > injectionSwitch.y)) # { # return; # } # treeIndex ++; # insert(treeIndex, 13); # vec2 z = (gl_FragCoord.yx / vec2(256.0, 256.0)); # float x = makeFrame(z.x); # float y = makeFrame(z.y); # int sum = - 100; # for( # int target = 0; # target < 20; # target ++ # ) # { # int result = search(target); # if(result > 0) # { # } # else # { # switch(result) # { # case - 1: # sum += 1; # break; # case 0: # return; # } # } # } # float a = x + y * float(sum); # _GLF_color = vec4(injectionSwitch.x < injectionSwitch.y ? vec3(1.0, 0.0, 0.0) : hueColor(a), 1.); # } SHADER fragment variant_fragment_shader SPIRV-ASM ; SPIR-V ; Version: 1.0 ; Generator: Khronos Glslang Reference Front End; 7 ; Bound: 456 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %381 %436 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 310 OpName %4 "main" OpName %7 "BST" OpMemberName %7 0 "data" OpMemberName %7 1 "leftIndex" OpMemberName %7 2 "rightIndex" OpName %13 "makeTreeNode(struct-BST-i1-i1-i11;i1;" OpName %11 "tree" OpName %12 "data" OpName %18 "insert(i1;i1;" OpName %16 "treeIndex" OpName %17 "data" OpName %22 "search(i1;" OpName %21 "target" OpName %29 "hueColor(f1;" OpName %28 "angle" OpName %33 "makeFrame(f1;" OpName %32 "v" OpName %43 "baseIndex" OpName %58 "tree" OpName %76 "param" OpName %80 "param" OpName %102 "param" OpName %105 "param" OpName %112 "GLF_live8i" OpName %116 "GLF_live8A" OpName %139 "buf0" OpMemberName %139 0 "injectionSwitch" OpName %141 "" OpName %151 "index" OpName %159 "currentNode" OpName %186 "nodeData" OpName %188 "param" OpName %214 "param" OpName %227 "param" OpName %236 "param" OpName %242 "treeIndex" OpName %244 "param" OpName %247 "param" OpName %254 "param" OpName %256 "param" OpName %260 "GLF_live1_looplimiter2" OpName %261 "GLF_live1i" OpName %279 "param" OpName %281 "param" OpName %285 "param" OpName %287 "param" OpName %291 "param" OpName %293 "param" OpName %298 "param" OpName %300 "param" OpName %304 "param" OpName %306 "param" OpName %310 "param" OpName %312 "param" OpName %316 "GLF_live4_looplimiter3" OpName %317 "GLF_live4i" OpName %331 "GLF_live4index" OpName %333 "Obj" OpMemberName %333 0 "odd_numbers" OpMemberName %333 1 "even_numbers" OpName %335 "GLF_live4obj" OpName %358 "param" OpName %360 "param" OpName %373 "param" OpName %375 "param" OpName %378 "z" OpName %381 "gl_FragCoord" OpName %387 "x" OpName %388 "param" OpName %392 "y" OpName %393 "param" OpName %397 "sum" OpName %399 "target" OpName %408 "result" OpName %409 "param" OpName %428 "a" OpName %436 "_GLF_color" OpName %448 "param" OpMemberDecorate %7 0 RelaxedPrecision OpMemberDecorate %7 1 RelaxedPrecision OpMemberDecorate %7 2 RelaxedPrecision OpDecorate %12 RelaxedPrecision OpDecorate %16 RelaxedPrecision OpDecorate %17 RelaxedPrecision OpDecorate %22 RelaxedPrecision OpDecorate %21 RelaxedPrecision OpDecorate %36 RelaxedPrecision OpDecorate %43 RelaxedPrecision OpDecorate %49 RelaxedPrecision OpDecorate %50 RelaxedPrecision OpDecorate %53 RelaxedPrecision OpDecorate %59 RelaxedPrecision OpDecorate %62 RelaxedPrecision OpDecorate %66 RelaxedPrecision OpDecorate %68 RelaxedPrecision OpDecorate %72 RelaxedPrecision OpDecorate %73 RelaxedPrecision OpDecorate %75 RelaxedPrecision OpDecorate %81 RelaxedPrecision OpDecorate %87 RelaxedPrecision OpDecorate %89 RelaxedPrecision OpDecorate %92 RelaxedPrecision OpDecorate %94 RelaxedPrecision OpDecorate %98 RelaxedPrecision OpDecorate %99 RelaxedPrecision OpDecorate %101 RelaxedPrecision OpDecorate %106 RelaxedPrecision OpDecorate %112 RelaxedPrecision OpDecorate %117 RelaxedPrecision OpDecorate %119 RelaxedPrecision OpDecorate %123 RelaxedPrecision OpDecorate %135 RelaxedPrecision OpDecorate %137 RelaxedPrecision OpMemberDecorate %139 0 Offset 0 OpDecorate %139 Block OpDecorate %141 DescriptorSet 0 OpDecorate %141 Binding 0 OpDecorate %151 RelaxedPrecision OpDecorate %157 RelaxedPrecision OpDecorate %160 RelaxedPrecision OpDecorate %164 RelaxedPrecision OpDecorate %165 RelaxedPrecision OpDecorate %169 RelaxedPrecision OpDecorate %171 RelaxedPrecision OpDecorate %173 RelaxedPrecision OpDecorate %179 RelaxedPrecision OpDecorate %182 RelaxedPrecision OpDecorate %183 RelaxedPrecision OpDecorate %189 RelaxedPrecision OpDecorate %215 RelaxedPrecision OpDecorate %228 RelaxedPrecision OpDecorate %237 RelaxedPrecision OpDecorate %242 RelaxedPrecision OpDecorate %251 RelaxedPrecision OpDecorate %252 RelaxedPrecision OpDecorate %255 RelaxedPrecision OpDecorate %258 RelaxedPrecision OpDecorate %259 RelaxedPrecision OpDecorate %260 RelaxedPrecision OpDecorate %261 RelaxedPrecision OpDecorate %268 RelaxedPrecision OpDecorate %274 RelaxedPrecision OpDecorate %275 RelaxedPrecision OpDecorate %276 RelaxedPrecision OpDecorate %277 RelaxedPrecision OpDecorate %280 RelaxedPrecision OpDecorate %283 RelaxedPrecision OpDecorate %284 RelaxedPrecision OpDecorate %286 RelaxedPrecision OpDecorate %289 RelaxedPrecision OpDecorate %290 RelaxedPrecision OpDecorate %292 RelaxedPrecision OpDecorate %295 RelaxedPrecision OpDecorate %296 RelaxedPrecision OpDecorate %299 RelaxedPrecision OpDecorate %302 RelaxedPrecision OpDecorate %303 RelaxedPrecision OpDecorate %305 RelaxedPrecision OpDecorate %308 RelaxedPrecision OpDecorate %309 RelaxedPrecision OpDecorate %311 RelaxedPrecision OpDecorate %314 RelaxedPrecision OpDecorate %315 RelaxedPrecision OpDecorate %316 RelaxedPrecision OpDecorate %317 RelaxedPrecision OpDecorate %323 RelaxedPrecision OpDecorate %329 RelaxedPrecision OpDecorate %330 RelaxedPrecision OpDecorate %331 RelaxedPrecision OpDecorate %336 RelaxedPrecision OpDecorate %338 RelaxedPrecision OpDecorate %342 RelaxedPrecision OpDecorate %347 RelaxedPrecision OpDecorate %349 RelaxedPrecision OpDecorate %352 RelaxedPrecision OpDecorate %355 RelaxedPrecision OpDecorate %356 RelaxedPrecision OpDecorate %359 RelaxedPrecision OpDecorate %370 RelaxedPrecision OpDecorate %371 RelaxedPrecision OpDecorate %374 RelaxedPrecision OpDecorate %381 BuiltIn FragCoord OpDecorate %397 RelaxedPrecision OpDecorate %399 RelaxedPrecision OpDecorate %405 RelaxedPrecision OpDecorate %408 RelaxedPrecision OpDecorate %410 RelaxedPrecision OpDecorate %411 RelaxedPrecision OpDecorate %412 RelaxedPrecision OpDecorate %417 RelaxedPrecision OpDecorate %421 RelaxedPrecision OpDecorate %422 RelaxedPrecision OpDecorate %426 RelaxedPrecision OpDecorate %427 RelaxedPrecision OpDecorate %431 RelaxedPrecision OpDecorate %436 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeInt 32 1 %7 = OpTypeStruct %6 %6 %6 %8 = OpTypePointer Function %7 %9 = OpTypePointer Function %6 %10 = OpTypeFunction %2 %8 %9 %15 = OpTypeFunction %2 %9 %9 %20 = OpTypeFunction %6 %9 %24 = OpTypeFloat 32 %25 = OpTypePointer Function %24 %26 = OpTypeVector %24 3 %27 = OpTypeFunction %26 %25 %31 = OpTypeFunction %24 %25 %35 = OpConstant %6 0 %38 = OpConstant %6 1 %39 = OpConstant %6 -1 %41 = OpConstant %6 2 %51 = OpTypeBool %54 = OpTypeInt 32 0 %55 = OpConstant %54 10 %56 = OpTypeArray %7 %55 %57 = OpTypePointer Private %56 %58 = OpVariable %57 Private %60 = OpTypePointer Private %6 %77 = OpTypePointer Private %7 %113 = OpConstant %54 50 %114 = OpTypeArray %24 %113 %115 = OpTypePointer Function %114 %120 = OpConstant %6 50 %138 = OpTypeVector %24 2 %139 = OpTypeStruct %138 %140 = OpTypePointer Uniform %139 %141 = OpVariable %140 Uniform %142 = OpConstant %54 0 %143 = OpTypePointer Uniform %24 %146 = OpConstant %54 1 %187 = OpConstant %6 15 %191 = OpConstant %24 30 %193 = OpConstant %24 1 %194 = OpConstant %24 5 %200 = OpConstant %24 50 %205 = OpConstant %24 6.5 %209 = OpConstant %24 1.5 %213 = OpConstant %6 100 %219 = OpConstant %24 4 %223 = OpConstant %24 0 %226 = OpConstant %6 6 %234 = OpConstant %24 10 %235 = OpConstant %6 30 %243 = OpConstant %6 9 %253 = OpConstant %6 5 %267 = OpConstantTrue %51 %269 = OpConstant %6 7 %278 = OpConstant %6 12 %297 = OpConstant %6 8 %324 = OpConstant %6 3 %332 = OpTypeArray %24 %55 %333 = OpTypeStruct %332 %332 %334 = OpTypePointer Function %333 %339 = OpConstant %6 10 %357 = OpConstant %6 17 %372 = OpConstant %6 13 %377 = OpTypePointer Function %138 %379 = OpTypeVector %24 4 %380 = OpTypePointer Input %379 %381 = OpVariable %380 Input %384 = OpConstant %24 256 %385 = OpConstantComposite %138 %384 %384 %398 = OpConstant %6 -100 %406 = OpConstant %6 20 %435 = OpTypePointer Output %379 %436 = OpVariable %435 Output %442 = OpTypePointer Function %26 %446 = OpConstantComposite %26 %193 %223 %223 %4 = OpFunction %2 None %3 %5 = OpLabel %242 = OpVariable %9 Function %244 = OpVariable %8 Function %247 = OpVariable %9 Function %254 = OpVariable %9 Function %256 = OpVariable %9 Function %260 = OpVariable %9 Function %261 = OpVariable %9 Function %279 = OpVariable %9 Function %281 = OpVariable %9 Function %285 = OpVariable %9 Function %287 = OpVariable %9 Function %291 = OpVariable %9 Function %293 = OpVariable %9 Function %298 = OpVariable %9 Function %300 = OpVariable %9 Function %304 = OpVariable %9 Function %306 = OpVariable %9 Function %310 = OpVariable %9 Function %312 = OpVariable %9 Function %316 = OpVariable %9 Function %317 = OpVariable %9 Function %331 = OpVariable %9 Function %335 = OpVariable %334 Function %358 = OpVariable %9 Function %360 = OpVariable %9 Function %373 = OpVariable %9 Function %375 = OpVariable %9 Function %378 = OpVariable %377 Function %387 = OpVariable %25 Function %388 = OpVariable %25 Function %392 = OpVariable %25 Function %393 = OpVariable %25 Function %397 = OpVariable %9 Function %399 = OpVariable %9 Function %408 = OpVariable %9 Function %409 = OpVariable %9 Function %428 = OpVariable %25 Function %443 = OpVariable %442 Function %448 = OpVariable %25 Function OpStore %242 %35 %245 = OpAccessChain %77 %58 %35 %246 = OpLoad %7 %245 OpStore %244 %246 OpStore %247 %243 %248 = OpFunctionCall %2 %13 %244 %247 %249 = OpLoad %7 %244 %250 = OpAccessChain %77 %58 %35 OpStore %250 %249 %251 = OpLoad %6 %242 %252 = OpIAdd %6 %251 %38 OpStore %242 %252 %255 = OpLoad %6 %242 OpStore %254 %255 OpStore %256 %253 %257 = OpFunctionCall %2 %18 %254 %256 %258 = OpLoad %6 %242 %259 = OpIAdd %6 %258 %38 OpStore %242 %259 OpStore %260 %35 OpStore %261 %35 OpBranch %262 %262 = OpLabel OpLoopMerge %264 %265 None OpBranch %266 %266 = OpLabel OpBranchConditional %267 %263 %264 %263 = OpLabel %268 = OpLoad %6 %260 %270 = OpSGreaterThanEqual %51 %268 %269 OpSelectionMerge %272 None OpBranchConditional %270 %271 %272 %271 = OpLabel OpBranch %264 %272 = OpLabel %274 = OpLoad %6 %260 %275 = OpIAdd %6 %274 %38 OpStore %260 %275 OpBranch %265 %265 = OpLabel %276 = OpLoad %6 %261 %277 = OpIAdd %6 %276 %38 OpStore %261 %277 OpBranch %262 %264 = OpLabel %280 = OpLoad %6 %242 OpStore %279 %280 OpStore %281 %278 %282 = OpFunctionCall %2 %18 %279 %281 %283 = OpLoad %6 %242 %284 = OpIAdd %6 %283 %38 OpStore %242 %284 %286 = OpLoad %6 %242 OpStore %285 %286 OpStore %287 %187 %288 = OpFunctionCall %2 %18 %285 %287 %289 = OpLoad %6 %242 %290 = OpIAdd %6 %289 %38 OpStore %242 %290 %292 = OpLoad %6 %242 OpStore %291 %292 OpStore %293 %269 %294 = OpFunctionCall %2 %18 %291 %293 %295 = OpLoad %6 %242 %296 = OpIAdd %6 %295 %38 OpStore %242 %296 %299 = OpLoad %6 %242 OpStore %298 %299 OpStore %300 %297 %301 = OpFunctionCall %2 %18 %298 %300 %302 = OpLoad %6 %242 %303 = OpIAdd %6 %302 %38 OpStore %242 %303 %305 = OpLoad %6 %242 OpStore %304 %305 OpStore %306 %41 %307 = OpFunctionCall %2 %18 %304 %306 %308 = OpLoad %6 %242 %309 = OpIAdd %6 %308 %38 OpStore %242 %309 %311 = OpLoad %6 %242 OpStore %310 %311 OpStore %312 %226 %313 = OpFunctionCall %2 %18 %310 %312 %314 = OpLoad %6 %242 %315 = OpIAdd %6 %314 %38 OpStore %242 %315 OpStore %316 %35 OpStore %317 %35 OpBranch %318 %318 = OpLabel OpLoopMerge %320 %321 None OpBranch %322 %322 = OpLabel OpBranchConditional %267 %319 %320 %319 = OpLabel %323 = OpLoad %6 %316 %325 = OpSGreaterThanEqual %51 %323 %324 OpSelectionMerge %327 None OpBranchConditional %325 %326 %327 %326 = OpLabel OpBranch %320 %327 = OpLabel %329 = OpLoad %6 %316 %330 = OpIAdd %6 %329 %38 OpStore %316 %330 OpStore %331 %38 %336 = OpLoad %6 %331 %337 = OpSGreaterThanEqual %51 %336 %35 %338 = OpLoad %6 %331 %340 = OpSLessThan %51 %338 %339 %341 = OpLogicalAnd %51 %337 %340 %342 = OpLoad %6 %331 %343 = OpSelect %6 %341 %342 %35 %344 = OpAccessChain %25 %335 %38 %38 %345 = OpLoad %24 %344 %346 = OpAccessChain %25 %335 %38 %343 OpStore %346 %345 %347 = OpLoad %6 %317 %348 = OpSGreaterThanEqual %51 %347 %35 %349 = OpLoad %6 %317 %350 = OpSLessThan %51 %349 %339 %351 = OpLogicalAnd %51 %348 %350 %352 = OpLoad %6 %317 %353 = OpSelect %6 %351 %352 %35 %354 = OpAccessChain %25 %335 %38 %353 OpStore %354 %193 OpBranch %321 %321 = OpLabel %355 = OpLoad %6 %317 %356 = OpIAdd %6 %355 %38 OpStore %317 %356 OpBranch %318 %320 = OpLabel %359 = OpLoad %6 %242 OpStore %358 %359 OpStore %360 %357 %361 = OpFunctionCall %2 %18 %358 %360 %362 = OpAccessChain %143 %141 %35 %142 %363 = OpLoad %24 %362 %364 = OpAccessChain %143 %141 %35 %146 %365 = OpLoad %24 %364 %366 = OpFOrdGreaterThan %51 %363 %365 OpSelectionMerge %368 None OpBranchConditional %366 %367 %368 %367 = OpLabel OpReturn %368 = OpLabel %370 = OpLoad %6 %242 %371 = OpIAdd %6 %370 %38 OpStore %242 %371 %374 = OpLoad %6 %242 OpStore %373 %374 OpStore %375 %372 %376 = OpFunctionCall %2 %18 %373 %375 %382 = OpLoad %379 %381 %383 = OpVectorShuffle %138 %382 %382 1 0 %386 = OpFDiv %138 %383 %385 OpStore %378 %386 %389 = OpAccessChain %25 %378 %142 %390 = OpLoad %24 %389 OpStore %388 %390 %391 = OpFunctionCall %24 %33 %388 OpStore %387 %391 %394 = OpAccessChain %25 %378 %146 %395 = OpLoad %24 %394 OpStore %393 %395 %396 = OpFunctionCall %24 %33 %393 OpStore %392 %396 OpStore %397 %398 OpStore %399 %35 OpBranch %400 %400 = OpLabel OpLoopMerge %402 %403 None OpBranch %404 %404 = OpLabel %405 = OpLoad %6 %399 %407 = OpSLessThan %51 %405 %406 OpBranchConditional %407 %401 %402 %401 = OpLabel %410 = OpLoad %6 %399 OpStore %409 %410 %411 = OpFunctionCall %6 %22 %409 OpStore %408 %411 %412 = OpLoad %6 %408 %413 = OpSGreaterThan %51 %412 %35 OpSelectionMerge %415 None OpBranchConditional %413 %414 %416 %414 = OpLabel OpBranch %415 %416 = OpLabel %417 = OpLoad %6 %408 OpSelectionMerge %420 None OpSwitch %417 %420 -1 %418 0 %419 %418 = OpLabel %421 = OpLoad %6 %397 %422 = OpIAdd %6 %421 %38 OpStore %397 %422 OpBranch %420 %419 = OpLabel OpReturn %420 = OpLabel OpBranch %415 %415 = OpLabel OpBranch %403 %403 = OpLabel %426 = OpLoad %6 %399 %427 = OpIAdd %6 %426 %38 OpStore %399 %427 OpBranch %400 %402 = OpLabel %429 = OpLoad %24 %387 %430 = OpLoad %24 %392 %431 = OpLoad %6 %397 %432 = OpConvertSToF %24 %431 %433 = OpFMul %24 %430 %432 %434 = OpFAdd %24 %429 %433 OpStore %428 %434 %437 = OpAccessChain %143 %141 %35 %142 %438 = OpLoad %24 %437 %439 = OpAccessChain %143 %141 %35 %146 %440 = OpLoad %24 %439 %441 = OpFOrdLessThan %51 %438 %440 OpSelectionMerge %445 None OpBranchConditional %441 %444 %447 %444 = OpLabel OpStore %443 %446 OpBranch %445 %447 = OpLabel %449 = OpLoad %24 %428 OpStore %448 %449 %450 = OpFunctionCall %26 %29 %448 OpStore %443 %450 OpBranch %445 %445 = OpLabel %451 = OpLoad %26 %443 %452 = OpCompositeExtract %24 %451 0 %453 = OpCompositeExtract %24 %451 1 %454 = OpCompositeExtract %24 %451 2 %455 = OpCompositeConstruct %379 %452 %453 %454 %193 OpStore %436 %455 OpReturn OpFunctionEnd %13 = OpFunction %2 None %10 %11 = OpFunctionParameter %8 %12 = OpFunctionParameter %9 %14 = OpLabel %36 = OpLoad %6 %12 %37 = OpAccessChain %9 %11 %35 OpStore %37 %36 %40 = OpAccessChain %9 %11 %38 OpStore %40 %39 %42 = OpAccessChain %9 %11 %41 OpStore %42 %39 OpReturn OpFunctionEnd %18 = OpFunction %2 None %15 %16 = OpFunctionParameter %9 %17 = OpFunctionParameter %9 %19 = OpLabel %43 = OpVariable %9 Function %76 = OpVariable %8 Function %80 = OpVariable %9 Function %102 = OpVariable %8 Function %105 = OpVariable %9 Function %112 = OpVariable %9 Function %116 = OpVariable %115 Function OpStore %43 %35 OpBranch %44 %44 = OpLabel OpLoopMerge %46 %47 None OpBranch %48 %48 = OpLabel %49 = OpLoad %6 %43 %50 = OpLoad %6 %16 %52 = OpSLessThanEqual %51 %49 %50 OpBranchConditional %52 %45 %46 %45 = OpLabel %53 = OpLoad %6 %17 %59 = OpLoad %6 %43 %61 = OpAccessChain %60 %58 %59 %35 %62 = OpLoad %6 %61 %63 = OpSLessThanEqual %51 %53 %62 OpSelectionMerge %65 None OpBranchConditional %63 %64 %91 %64 = OpLabel %66 = OpLoad %6 %43 %67 = OpAccessChain %60 %58 %66 %38 %68 = OpLoad %6 %67 %69 = OpIEqual %51 %68 %39 OpSelectionMerge %71 None OpBranchConditional %69 %70 %86 %70 = OpLabel %72 = OpLoad %6 %43 %73 = OpLoad %6 %16 %74 = OpAccessChain %60 %58 %72 %38 OpStore %74 %73 %75 = OpLoad %6 %16 %78 = OpAccessChain %77 %58 %75 %79 = OpLoad %7 %78 OpStore %76 %79 %81 = OpLoad %6 %17 OpStore %80 %81 %82 = OpFunctionCall %2 %13 %76 %80 %83 = OpLoad %7 %76 %84 = OpAccessChain %77 %58 %75 OpStore %84 %83 OpReturn %86 = OpLabel %87 = OpLoad %6 %43 %88 = OpAccessChain %60 %58 %87 %38 %89 = OpLoad %6 %88 OpStore %43 %89 OpBranch %47 %71 = OpLabel OpBranch %65 %91 = OpLabel %92 = OpLoad %6 %43 %93 = OpAccessChain %60 %58 %92 %41 %94 = OpLoad %6 %93 %95 = OpIEqual %51 %94 %39 OpSelectionMerge %97 None OpBranchConditional %95 %96 %111 %96 = OpLabel %98 = OpLoad %6 %43 %99 = OpLoad %6 %16 %100 = OpAccessChain %60 %58 %98 %41 OpStore %100 %99 %101 = OpLoad %6 %16 %103 = OpAccessChain %77 %58 %101 %104 = OpLoad %7 %103 OpStore %102 %104 %106 = OpLoad %6 %17 OpStore %105 %106 %107 = OpFunctionCall %2 %13 %102 %105 %108 = OpLoad %7 %102 %109 = OpAccessChain %77 %58 %101 OpStore %109 %108 OpReturn %111 = OpLabel OpStore %112 %38 %117 = OpLoad %6 %112 %118 = OpSGreaterThanEqual %51 %117 %35 %119 = OpLoad %6 %112 %121 = OpSLessThan %51 %119 %120 %122 = OpLogicalAnd %51 %118 %121 %123 = OpLoad %6 %112 %124 = OpSelect %6 %122 %123 %35 %125 = OpAccessChain %25 %116 %35 %126 = OpLoad %24 %125 %127 = OpAccessChain %25 %116 %124 %128 = OpLoad %24 %127 %129 = OpFAdd %24 %128 %126 %130 = OpAccessChain %25 %116 %124 OpStore %130 %129 OpBranch %131 %131 = OpLabel OpLoopMerge %133 %134 None OpBranch %132 %132 = OpLabel %135 = OpLoad %6 %43 %136 = OpAccessChain %60 %58 %135 %41 %137 = OpLoad %6 %136 OpStore %43 %137 OpBranch %134 %134 = OpLabel %144 = OpAccessChain %143 %141 %35 %142 %145 = OpLoad %24 %144 %147 = OpAccessChain %143 %141 %35 %146 %148 = OpLoad %24 %147 %149 = OpFOrdGreaterThan %51 %145 %148 OpBranchConditional %149 %131 %133 %133 = OpLabel OpBranch %47 %97 = OpLabel OpBranch %65 %65 = OpLabel OpBranch %47 %47 = OpLabel OpBranch %44 %46 = OpLabel OpReturn OpFunctionEnd %22 = OpFunction %6 None %20 %21 = OpFunctionParameter %9 %23 = OpLabel %151 = OpVariable %9 Function %159 = OpVariable %8 Function %175 = OpVariable %9 Function OpStore %151 %35 OpBranch %152 %152 = OpLabel OpLoopMerge %154 %155 None OpBranch %156 %156 = OpLabel %157 = OpLoad %6 %151 %158 = OpINotEqual %51 %157 %39 OpBranchConditional %158 %153 %154 %153 = OpLabel %160 = OpLoad %6 %151 %161 = OpAccessChain %77 %58 %160 %162 = OpLoad %7 %161 OpStore %159 %162 %163 = OpAccessChain %9 %159 %35 %164 = OpLoad %6 %163 %165 = OpLoad %6 %21 %166 = OpIEqual %51 %164 %165 OpSelectionMerge %168 None OpBranchConditional %166 %167 %168 %167 = OpLabel %169 = OpLoad %6 %21 OpReturnValue %169 %168 = OpLabel %171 = OpLoad %6 %21 %172 = OpAccessChain %9 %159 %35 %173 = OpLoad %6 %172 %174 = OpSGreaterThan %51 %171 %173 OpSelectionMerge %177 None OpBranchConditional %174 %176 %180 %176 = OpLabel %178 = OpAccessChain %9 %159 %41 %179 = OpLoad %6 %178 OpStore %175 %179 OpBranch %177 %180 = OpLabel %181 = OpAccessChain %9 %159 %38 %182 = OpLoad %6 %181 OpStore %175 %182 OpBranch %177 %177 = OpLabel %183 = OpLoad %6 %175 OpStore %151 %183 OpBranch %155 %155 = OpLabel OpBranch %152 %154 = OpLabel OpReturnValue %39 OpFunctionEnd %29 = OpFunction %26 None %27 %28 = OpFunctionParameter %25 %30 = OpLabel %186 = OpVariable %25 Function %188 = OpVariable %9 Function OpStore %188 %187 %189 = OpFunctionCall %6 %22 %188 %190 = OpConvertSToF %24 %189 OpStore %186 %190 %192 = OpLoad %24 %28 %195 = OpLoad %24 %186 %196 = OpCompositeConstruct %26 %193 %194 %195 %197 = OpVectorTimesScalar %26 %196 %192 %198 = OpCompositeConstruct %26 %191 %191 %191 %199 = OpFAdd %26 %198 %197 %201 = OpCompositeConstruct %26 %200 %200 %200 %202 = OpFDiv %26 %199 %201 OpReturnValue %202 OpFunctionEnd %33 = OpFunction %24 None %31 %32 = OpFunctionParameter %25 %34 = OpLabel %214 = OpVariable %9 Function %227 = OpVariable %9 Function %236 = OpVariable %9 Function %206 = OpLoad %24 %32 %207 = OpFMul %24 %206 %205 OpStore %32 %207 %208 = OpLoad %24 %32 %210 = OpFOrdLessThan %51 %208 %209 OpSelectionMerge %212 None OpBranchConditional %210 %211 %212 %211 = OpLabel OpStore %214 %213 %215 = OpFunctionCall %6 %22 %214 %216 = OpConvertSToF %24 %215 OpReturnValue %216 %212 = OpLabel %218 = OpLoad %24 %32 %220 = OpFOrdLessThan %51 %218 %219 OpSelectionMerge %222 None OpBranchConditional %220 %221 %222 %221 = OpLabel OpReturnValue %223 %222 = OpLabel %225 = OpLoad %24 %32 OpStore %227 %226 %228 = OpFunctionCall %6 %22 %227 %229 = OpConvertSToF %24 %228 %230 = OpFOrdLessThan %51 %225 %229 OpSelectionMerge %232 None OpBranchConditional %230 %231 %232 %231 = OpLabel OpReturnValue %193 %232 = OpLabel OpStore %236 %235 %237 = OpFunctionCall %6 %22 %236 %238 = OpConvertSToF %24 %237 %239 = OpFAdd %24 %234 %238 OpReturnValue %239 OpFunctionEnd END # uniforms for variant # injectionSwitch BUFFER variant_injectionSwitch DATA_TYPE vec2 DATA 0.0 1.0 END BUFFER framebuffer FORMAT B8G8R8A8_UNORM PIPELINE graphics gfz_pipeline ATTACH variant_vertex_shader ATTACH variant_fragment_shader FRAMEBUFFER_SIZE 256 256 BIND BUFFER framebuffer AS color LOCATION 0 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0 END CLEAR_COLOR gfz_pipeline 0 0 0 255 CLEAR gfz_pipeline RUN gfz_pipeline DRAW_RECT POS 0 0 SIZE 256 256 EXPECT framebuffer IDX 0 0 SIZE 256 256 EQ_RGB 255 0 0