1e5c31af7Sopenharmony_ci#!amber 2e5c31af7Sopenharmony_ci 3e5c31af7Sopenharmony_ci# Copyright 2019 Google LLC 4e5c31af7Sopenharmony_ci# 5e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 6e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License. 7e5c31af7Sopenharmony_ci# You may obtain a copy of the License at 8e5c31af7Sopenharmony_ci# 9e5c31af7Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 10e5c31af7Sopenharmony_ci# 11e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software 12e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 13e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and 15e5c31af7Sopenharmony_ci# limitations under the License. 16e5c31af7Sopenharmony_ci 17e5c31af7Sopenharmony_ci 18e5c31af7Sopenharmony_ci# A test for a bug found by GraphicsFuzz. 19e5c31af7Sopenharmony_ci 20e5c31af7Sopenharmony_ci# Short description: A fragment shader with nested loops and a switch 21e5c31af7Sopenharmony_ci 22e5c31af7Sopenharmony_ci# The test passes because the fragment shader enters the outer loop, immediately breaks, and 23e5c31af7Sopenharmony_ci# writes the color red. 24e5c31af7Sopenharmony_ci 25e5c31af7Sopenharmony_ciSHADER vertex variant_vertex_shader PASSTHROUGH 26e5c31af7Sopenharmony_ci 27e5c31af7Sopenharmony_ci# variant_fragment_shader is derived from the following GLSL: 28e5c31af7Sopenharmony_ci# #version 310 es 29e5c31af7Sopenharmony_ci# precision highp float; 30e5c31af7Sopenharmony_ci# precision highp int; 31e5c31af7Sopenharmony_ci# 32e5c31af7Sopenharmony_ci# layout(location = 0) out vec4 _GLF_color; 33e5c31af7Sopenharmony_ci# 34e5c31af7Sopenharmony_ci# layout(set = 0, binding = 0) uniform buf0 35e5c31af7Sopenharmony_ci# { 36e5c31af7Sopenharmony_ci# vec2 injectionSwitch; 37e5c31af7Sopenharmony_ci# }; 38e5c31af7Sopenharmony_ci# void main() 39e5c31af7Sopenharmony_ci# { 40e5c31af7Sopenharmony_ci# int msb10; 41e5c31af7Sopenharmony_ci# int i = 0; 42e5c31af7Sopenharmony_ci# do 43e5c31af7Sopenharmony_ci# { 44e5c31af7Sopenharmony_ci# if (i >= int(injectionSwitch.x)) // always true 45e5c31af7Sopenharmony_ci# { 46e5c31af7Sopenharmony_ci# break; 47e5c31af7Sopenharmony_ci# } 48e5c31af7Sopenharmony_ci# if (0.0 > injectionSwitch.y) 49e5c31af7Sopenharmony_ci# { 50e5c31af7Sopenharmony_ci# float donor_replacementGLF_dead5sums[9]; 51e5c31af7Sopenharmony_ci# for ( 52e5c31af7Sopenharmony_ci# int GLF_dead5cols = 2; 53e5c31af7Sopenharmony_ci# GLF_dead5cols <= 4; 54e5c31af7Sopenharmony_ci# GLF_dead5cols++) 55e5c31af7Sopenharmony_ci# { 56e5c31af7Sopenharmony_ci# for ( 57e5c31af7Sopenharmony_ci# int GLF_dead5rows = 2; 58e5c31af7Sopenharmony_ci# GLF_dead5rows <= 4; 59e5c31af7Sopenharmony_ci# GLF_dead5rows++) 60e5c31af7Sopenharmony_ci# { 61e5c31af7Sopenharmony_ci# for ( 62e5c31af7Sopenharmony_ci# int GLF_dead5c = 0; 63e5c31af7Sopenharmony_ci# GLF_dead5c < GLF_dead5cols; 64e5c31af7Sopenharmony_ci# GLF_dead5c++) 65e5c31af7Sopenharmony_ci# { 66e5c31af7Sopenharmony_ci# for ( 67e5c31af7Sopenharmony_ci# int GLF_dead5r = 0; 68e5c31af7Sopenharmony_ci# GLF_dead5r < GLF_dead5rows; 69e5c31af7Sopenharmony_ci# GLF_dead5r++) 70e5c31af7Sopenharmony_ci# { 71e5c31af7Sopenharmony_ci# switch (msb10) 72e5c31af7Sopenharmony_ci# { 73e5c31af7Sopenharmony_ci# case 1: 74e5c31af7Sopenharmony_ci# case 8: 75e5c31af7Sopenharmony_ci# donor_replacementGLF_dead5sums[msb10 >= 0 && msb10 < 9 ? msb10 : 0] += 1.0; 76e5c31af7Sopenharmony_ci# } 77e5c31af7Sopenharmony_ci# } 78e5c31af7Sopenharmony_ci# } 79e5c31af7Sopenharmony_ci# msb10++; 80e5c31af7Sopenharmony_ci# } 81e5c31af7Sopenharmony_ci# } 82e5c31af7Sopenharmony_ci# } 83e5c31af7Sopenharmony_ci# i++; 84e5c31af7Sopenharmony_ci# } while (i < 200); 85e5c31af7Sopenharmony_ci# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); 86e5c31af7Sopenharmony_ci# } 87e5c31af7Sopenharmony_ciSHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 88e5c31af7Sopenharmony_ci; SPIR-V 89e5c31af7Sopenharmony_ci; Version: 1.0 90e5c31af7Sopenharmony_ci; Generator: Khronos Glslang Reference Front End; 7 91e5c31af7Sopenharmony_ci; Bound: 117 92e5c31af7Sopenharmony_ci; Schema: 0 93e5c31af7Sopenharmony_ci OpCapability Shader 94e5c31af7Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 95e5c31af7Sopenharmony_ci OpMemoryModel Logical GLSL450 96e5c31af7Sopenharmony_ci OpEntryPoint Fragment %4 "main" %115 97e5c31af7Sopenharmony_ci OpExecutionMode %4 OriginUpperLeft 98e5c31af7Sopenharmony_ci OpSource ESSL 310 99e5c31af7Sopenharmony_ci OpName %4 "main" 100e5c31af7Sopenharmony_ci OpName %8 "i" 101e5c31af7Sopenharmony_ci OpName %17 "buf0" 102e5c31af7Sopenharmony_ci OpMemberName %17 0 "injectionSwitch" 103e5c31af7Sopenharmony_ci OpName %19 "" 104e5c31af7Sopenharmony_ci OpName %38 "GLF_dead5cols" 105e5c31af7Sopenharmony_ci OpName %48 "GLF_dead5rows" 106e5c31af7Sopenharmony_ci OpName %56 "GLF_dead5c" 107e5c31af7Sopenharmony_ci OpName %65 "GLF_dead5r" 108e5c31af7Sopenharmony_ci OpName %74 "msb10" 109e5c31af7Sopenharmony_ci OpName %81 "donor_replacementGLF_dead5sums" 110e5c31af7Sopenharmony_ci OpName %115 "_GLF_color" 111e5c31af7Sopenharmony_ci OpMemberDecorate %17 0 Offset 0 112e5c31af7Sopenharmony_ci OpDecorate %17 Block 113e5c31af7Sopenharmony_ci OpDecorate %19 DescriptorSet 0 114e5c31af7Sopenharmony_ci OpDecorate %19 Binding 0 115e5c31af7Sopenharmony_ci OpDecorate %115 Location 0 116e5c31af7Sopenharmony_ci %2 = OpTypeVoid 117e5c31af7Sopenharmony_ci %3 = OpTypeFunction %2 118e5c31af7Sopenharmony_ci %6 = OpTypeInt 32 1 119e5c31af7Sopenharmony_ci %7 = OpTypePointer Function %6 120e5c31af7Sopenharmony_ci %9 = OpConstant %6 0 121e5c31af7Sopenharmony_ci %15 = OpTypeFloat 32 122e5c31af7Sopenharmony_ci %16 = OpTypeVector %15 2 123e5c31af7Sopenharmony_ci %17 = OpTypeStruct %16 124e5c31af7Sopenharmony_ci %18 = OpTypePointer Uniform %17 125e5c31af7Sopenharmony_ci %19 = OpVariable %18 Uniform 126e5c31af7Sopenharmony_ci %20 = OpTypeInt 32 0 127e5c31af7Sopenharmony_ci %21 = OpConstant %20 0 128e5c31af7Sopenharmony_ci %22 = OpTypePointer Uniform %15 129e5c31af7Sopenharmony_ci %26 = OpTypeBool 130e5c31af7Sopenharmony_ci %31 = OpConstant %15 0 131e5c31af7Sopenharmony_ci %32 = OpConstant %20 1 132e5c31af7Sopenharmony_ci %39 = OpConstant %6 2 133e5c31af7Sopenharmony_ci %46 = OpConstant %6 4 134e5c31af7Sopenharmony_ci %78 = OpConstant %20 9 135e5c31af7Sopenharmony_ci %79 = OpTypeArray %15 %78 136e5c31af7Sopenharmony_ci %80 = OpTypePointer Function %79 137e5c31af7Sopenharmony_ci %85 = OpConstant %6 9 138e5c31af7Sopenharmony_ci %90 = OpConstant %15 1 139e5c31af7Sopenharmony_ci %91 = OpTypePointer Function %15 140e5c31af7Sopenharmony_ci %98 = OpConstant %6 1 141e5c31af7Sopenharmony_ci %111 = OpConstant %6 200 142e5c31af7Sopenharmony_ci %113 = OpTypeVector %15 4 143e5c31af7Sopenharmony_ci %114 = OpTypePointer Output %113 144e5c31af7Sopenharmony_ci %115 = OpVariable %114 Output 145e5c31af7Sopenharmony_ci %116 = OpConstantComposite %113 %90 %31 %31 %90 146e5c31af7Sopenharmony_ci %4 = OpFunction %2 None %3 147e5c31af7Sopenharmony_ci %5 = OpLabel 148e5c31af7Sopenharmony_ci %8 = OpVariable %7 Function 149e5c31af7Sopenharmony_ci %38 = OpVariable %7 Function 150e5c31af7Sopenharmony_ci %48 = OpVariable %7 Function 151e5c31af7Sopenharmony_ci %56 = OpVariable %7 Function 152e5c31af7Sopenharmony_ci %65 = OpVariable %7 Function 153e5c31af7Sopenharmony_ci %74 = OpVariable %7 Function 154e5c31af7Sopenharmony_ci %81 = OpVariable %80 Function 155e5c31af7Sopenharmony_ci OpStore %8 %9 156e5c31af7Sopenharmony_ci OpBranch %10 157e5c31af7Sopenharmony_ci %10 = OpLabel 158e5c31af7Sopenharmony_ci OpLoopMerge %12 %13 None 159e5c31af7Sopenharmony_ci OpBranch %11 160e5c31af7Sopenharmony_ci %11 = OpLabel 161e5c31af7Sopenharmony_ci %14 = OpLoad %6 %8 162e5c31af7Sopenharmony_ci %23 = OpAccessChain %22 %19 %9 %21 163e5c31af7Sopenharmony_ci %24 = OpLoad %15 %23 164e5c31af7Sopenharmony_ci %25 = OpConvertFToS %6 %24 165e5c31af7Sopenharmony_ci %27 = OpSGreaterThanEqual %26 %14 %25 166e5c31af7Sopenharmony_ci OpSelectionMerge %29 None 167e5c31af7Sopenharmony_ci OpBranchConditional %27 %28 %29 168e5c31af7Sopenharmony_ci %28 = OpLabel 169e5c31af7Sopenharmony_ci OpBranch %12 170e5c31af7Sopenharmony_ci %29 = OpLabel 171e5c31af7Sopenharmony_ci %33 = OpAccessChain %22 %19 %9 %32 172e5c31af7Sopenharmony_ci %34 = OpLoad %15 %33 173e5c31af7Sopenharmony_ci %35 = OpFOrdGreaterThan %26 %31 %34 174e5c31af7Sopenharmony_ci OpSelectionMerge %37 None 175e5c31af7Sopenharmony_ci OpBranchConditional %35 %36 %37 176e5c31af7Sopenharmony_ci %36 = OpLabel 177e5c31af7Sopenharmony_ci OpStore %38 %39 178e5c31af7Sopenharmony_ci OpBranch %40 179e5c31af7Sopenharmony_ci %40 = OpLabel 180e5c31af7Sopenharmony_ci OpLoopMerge %42 %43 None 181e5c31af7Sopenharmony_ci OpBranch %44 182e5c31af7Sopenharmony_ci %44 = OpLabel 183e5c31af7Sopenharmony_ci %45 = OpLoad %6 %38 184e5c31af7Sopenharmony_ci %47 = OpSLessThanEqual %26 %45 %46 185e5c31af7Sopenharmony_ci OpBranchConditional %47 %41 %42 186e5c31af7Sopenharmony_ci %41 = OpLabel 187e5c31af7Sopenharmony_ci OpStore %48 %39 188e5c31af7Sopenharmony_ci OpBranch %49 189e5c31af7Sopenharmony_ci %49 = OpLabel 190e5c31af7Sopenharmony_ci OpLoopMerge %51 %52 None 191e5c31af7Sopenharmony_ci OpBranch %53 192e5c31af7Sopenharmony_ci %53 = OpLabel 193e5c31af7Sopenharmony_ci %54 = OpLoad %6 %48 194e5c31af7Sopenharmony_ci %55 = OpSLessThanEqual %26 %54 %46 195e5c31af7Sopenharmony_ci OpBranchConditional %55 %50 %51 196e5c31af7Sopenharmony_ci %50 = OpLabel 197e5c31af7Sopenharmony_ci OpStore %56 %9 198e5c31af7Sopenharmony_ci OpBranch %57 199e5c31af7Sopenharmony_ci %57 = OpLabel 200e5c31af7Sopenharmony_ci OpLoopMerge %59 %60 None 201e5c31af7Sopenharmony_ci OpBranch %61 202e5c31af7Sopenharmony_ci %61 = OpLabel 203e5c31af7Sopenharmony_ci %62 = OpLoad %6 %56 204e5c31af7Sopenharmony_ci %63 = OpLoad %6 %38 205e5c31af7Sopenharmony_ci %64 = OpSLessThan %26 %62 %63 206e5c31af7Sopenharmony_ci OpBranchConditional %64 %58 %59 207e5c31af7Sopenharmony_ci %58 = OpLabel 208e5c31af7Sopenharmony_ci OpStore %65 %9 209e5c31af7Sopenharmony_ci OpBranch %66 210e5c31af7Sopenharmony_ci %66 = OpLabel 211e5c31af7Sopenharmony_ci OpLoopMerge %68 %69 None 212e5c31af7Sopenharmony_ci OpBranch %70 213e5c31af7Sopenharmony_ci %70 = OpLabel 214e5c31af7Sopenharmony_ci %71 = OpLoad %6 %65 215e5c31af7Sopenharmony_ci %72 = OpLoad %6 %48 216e5c31af7Sopenharmony_ci %73 = OpSLessThan %26 %71 %72 217e5c31af7Sopenharmony_ci OpBranchConditional %73 %67 %68 218e5c31af7Sopenharmony_ci %67 = OpLabel 219e5c31af7Sopenharmony_ci %75 = OpLoad %6 %74 220e5c31af7Sopenharmony_ci OpSelectionMerge %77 None 221e5c31af7Sopenharmony_ci OpSwitch %75 %77 1 %76 8 %76 222e5c31af7Sopenharmony_ci %76 = OpLabel 223e5c31af7Sopenharmony_ci %82 = OpLoad %6 %74 224e5c31af7Sopenharmony_ci %83 = OpSGreaterThanEqual %26 %82 %9 225e5c31af7Sopenharmony_ci %84 = OpLoad %6 %74 226e5c31af7Sopenharmony_ci %86 = OpSLessThan %26 %84 %85 227e5c31af7Sopenharmony_ci %87 = OpLogicalAnd %26 %83 %86 228e5c31af7Sopenharmony_ci %88 = OpLoad %6 %74 229e5c31af7Sopenharmony_ci %89 = OpSelect %6 %87 %88 %9 230e5c31af7Sopenharmony_ci %92 = OpAccessChain %91 %81 %89 231e5c31af7Sopenharmony_ci %93 = OpLoad %15 %92 232e5c31af7Sopenharmony_ci %94 = OpFAdd %15 %93 %90 233e5c31af7Sopenharmony_ci %95 = OpAccessChain %91 %81 %89 234e5c31af7Sopenharmony_ci OpStore %95 %94 235e5c31af7Sopenharmony_ci OpBranch %77 236e5c31af7Sopenharmony_ci %77 = OpLabel 237e5c31af7Sopenharmony_ci OpBranch %69 238e5c31af7Sopenharmony_ci %69 = OpLabel 239e5c31af7Sopenharmony_ci %97 = OpLoad %6 %65 240e5c31af7Sopenharmony_ci %99 = OpIAdd %6 %97 %98 241e5c31af7Sopenharmony_ci OpStore %65 %99 242e5c31af7Sopenharmony_ci OpBranch %66 243e5c31af7Sopenharmony_ci %68 = OpLabel 244e5c31af7Sopenharmony_ci OpBranch %60 245e5c31af7Sopenharmony_ci %60 = OpLabel 246e5c31af7Sopenharmony_ci %100 = OpLoad %6 %56 247e5c31af7Sopenharmony_ci %101 = OpIAdd %6 %100 %98 248e5c31af7Sopenharmony_ci OpStore %56 %101 249e5c31af7Sopenharmony_ci OpBranch %57 250e5c31af7Sopenharmony_ci %59 = OpLabel 251e5c31af7Sopenharmony_ci %102 = OpLoad %6 %74 252e5c31af7Sopenharmony_ci %103 = OpIAdd %6 %102 %98 253e5c31af7Sopenharmony_ci OpStore %74 %103 254e5c31af7Sopenharmony_ci OpBranch %52 255e5c31af7Sopenharmony_ci %52 = OpLabel 256e5c31af7Sopenharmony_ci %104 = OpLoad %6 %48 257e5c31af7Sopenharmony_ci %105 = OpIAdd %6 %104 %98 258e5c31af7Sopenharmony_ci OpStore %48 %105 259e5c31af7Sopenharmony_ci OpBranch %49 260e5c31af7Sopenharmony_ci %51 = OpLabel 261e5c31af7Sopenharmony_ci OpBranch %43 262e5c31af7Sopenharmony_ci %43 = OpLabel 263e5c31af7Sopenharmony_ci %106 = OpLoad %6 %38 264e5c31af7Sopenharmony_ci %107 = OpIAdd %6 %106 %98 265e5c31af7Sopenharmony_ci OpStore %38 %107 266e5c31af7Sopenharmony_ci OpBranch %40 267e5c31af7Sopenharmony_ci %42 = OpLabel 268e5c31af7Sopenharmony_ci OpBranch %37 269e5c31af7Sopenharmony_ci %37 = OpLabel 270e5c31af7Sopenharmony_ci %108 = OpLoad %6 %8 271e5c31af7Sopenharmony_ci %109 = OpIAdd %6 %108 %98 272e5c31af7Sopenharmony_ci OpStore %8 %109 273e5c31af7Sopenharmony_ci OpBranch %13 274e5c31af7Sopenharmony_ci %13 = OpLabel 275e5c31af7Sopenharmony_ci %110 = OpLoad %6 %8 276e5c31af7Sopenharmony_ci %112 = OpSLessThan %26 %110 %111 277e5c31af7Sopenharmony_ci OpBranchConditional %112 %10 %12 278e5c31af7Sopenharmony_ci %12 = OpLabel 279e5c31af7Sopenharmony_ci OpStore %115 %116 280e5c31af7Sopenharmony_ci OpReturn 281e5c31af7Sopenharmony_ci OpFunctionEnd 282e5c31af7Sopenharmony_ciEND 283e5c31af7Sopenharmony_ci 284e5c31af7Sopenharmony_ci# uniforms for variant 285e5c31af7Sopenharmony_ci 286e5c31af7Sopenharmony_ci# injectionSwitch 287e5c31af7Sopenharmony_ciBUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA 288e5c31af7Sopenharmony_ci 0.0 1.0 289e5c31af7Sopenharmony_ciEND 290e5c31af7Sopenharmony_ci 291e5c31af7Sopenharmony_ciBUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 292e5c31af7Sopenharmony_ci 293e5c31af7Sopenharmony_ciPIPELINE graphics variant_pipeline 294e5c31af7Sopenharmony_ci ATTACH variant_vertex_shader 295e5c31af7Sopenharmony_ci ATTACH variant_fragment_shader 296e5c31af7Sopenharmony_ci FRAMEBUFFER_SIZE 256 256 297e5c31af7Sopenharmony_ci BIND BUFFER variant_framebuffer AS color LOCATION 0 298e5c31af7Sopenharmony_ci BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0 299e5c31af7Sopenharmony_ciEND 300e5c31af7Sopenharmony_ciCLEAR_COLOR variant_pipeline 0 0 0 255 301e5c31af7Sopenharmony_ci 302e5c31af7Sopenharmony_ciCLEAR variant_pipeline 303e5c31af7Sopenharmony_ciRUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 304e5c31af7Sopenharmony_ci 305e5c31af7Sopenharmony_ciEXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 306