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 function call 21e5c31af7Sopenharmony_ci 22e5c31af7Sopenharmony_ci# The test passes because the fragment shader enters the first loop, immediately breaks, and then 23e5c31af7Sopenharmony_ci# writes the color red. 24e5c31af7Sopenharmony_ci 25e5c31af7Sopenharmony_ci# Optimized using spirv-opt with the following arguments: 26e5c31af7Sopenharmony_ci# '-O' 27e5c31af7Sopenharmony_ci# spirv-opt commit hash: 06407250a169c6a03b3765e86619075af1a8c187 28e5c31af7Sopenharmony_ci 29e5c31af7Sopenharmony_ci 30e5c31af7Sopenharmony_ci 31e5c31af7Sopenharmony_ciSHADER vertex variant_vertex_shader PASSTHROUGH 32e5c31af7Sopenharmony_ci 33e5c31af7Sopenharmony_ci# variant_fragment_shader is derived from the following GLSL: 34e5c31af7Sopenharmony_ci# #version 310 es 35e5c31af7Sopenharmony_ci# precision highp float; 36e5c31af7Sopenharmony_ci# 37e5c31af7Sopenharmony_ci# layout(set = 0, binding = 0) uniform buf0 38e5c31af7Sopenharmony_ci# { 39e5c31af7Sopenharmony_ci# vec2 injectionSwitch; 40e5c31af7Sopenharmony_ci# }; 41e5c31af7Sopenharmony_ci# layout(location = 0) out vec4 _GLF_color; 42e5c31af7Sopenharmony_ci# 43e5c31af7Sopenharmony_ci# vec3 mand() 44e5c31af7Sopenharmony_ci# { 45e5c31af7Sopenharmony_ci# float x, y; 46e5c31af7Sopenharmony_ci# int iteration; 47e5c31af7Sopenharmony_ci# iteration = 0; 48e5c31af7Sopenharmony_ci# if (gl_FragCoord.y < 0.0) 49e5c31af7Sopenharmony_ci# { 50e5c31af7Sopenharmony_ci# return vec3(1.0); 51e5c31af7Sopenharmony_ci# } 52e5c31af7Sopenharmony_ci# for ( 53e5c31af7Sopenharmony_ci# int k = 0; 54e5c31af7Sopenharmony_ci# k < 50; 55e5c31af7Sopenharmony_ci# k++) 56e5c31af7Sopenharmony_ci# { 57e5c31af7Sopenharmony_ci# if (x * x + y * y > 4.0) 58e5c31af7Sopenharmony_ci# { 59e5c31af7Sopenharmony_ci# if (injectionSwitch.x > injectionSwitch.y) 60e5c31af7Sopenharmony_ci# { 61e5c31af7Sopenharmony_ci# discard; 62e5c31af7Sopenharmony_ci# } 63e5c31af7Sopenharmony_ci# break; 64e5c31af7Sopenharmony_ci# } 65e5c31af7Sopenharmony_ci# float x_new; 66e5c31af7Sopenharmony_ci# x_new = 1.0 - y; 67e5c31af7Sopenharmony_ci# if (gl_FragCoord.x < 0.0) 68e5c31af7Sopenharmony_ci# { 69e5c31af7Sopenharmony_ci# discard; 70e5c31af7Sopenharmony_ci# } 71e5c31af7Sopenharmony_ci# y = 2.0 * y + 1.0; 72e5c31af7Sopenharmony_ci# x = x_new; 73e5c31af7Sopenharmony_ci# iteration++; 74e5c31af7Sopenharmony_ci# } 75e5c31af7Sopenharmony_ci# vec3 pickColor_inline_return_value_0; 76e5c31af7Sopenharmony_ci# int i; 77e5c31af7Sopenharmony_ci# i = iteration; 78e5c31af7Sopenharmony_ci# pickColor_inline_return_value_0 = vec3(1.0, 1.0, float(i)); 79e5c31af7Sopenharmony_ci# return pickColor_inline_return_value_0; 80e5c31af7Sopenharmony_ci# } 81e5c31af7Sopenharmony_ci# 82e5c31af7Sopenharmony_ci# void main() 83e5c31af7Sopenharmony_ci# { 84e5c31af7Sopenharmony_ci# vec3 data[16]; 85e5c31af7Sopenharmony_ci# data[1] = vec3(0.0); 86e5c31af7Sopenharmony_ci# for ( 87e5c31af7Sopenharmony_ci# int i = 0; 88e5c31af7Sopenharmony_ci# i < 4; 89e5c31af7Sopenharmony_ci# i++) 90e5c31af7Sopenharmony_ci# { 91e5c31af7Sopenharmony_ci# if (injectionSwitch.x < 1.0) // always true 92e5c31af7Sopenharmony_ci# { 93e5c31af7Sopenharmony_ci# break; 94e5c31af7Sopenharmony_ci# } 95e5c31af7Sopenharmony_ci# for ( 96e5c31af7Sopenharmony_ci# int j = 0; 97e5c31af7Sopenharmony_ci# j < 4; 98e5c31af7Sopenharmony_ci# j++) 99e5c31af7Sopenharmony_ci# { 100e5c31af7Sopenharmony_ci# data[4 * j + i] = mand(); 101e5c31af7Sopenharmony_ci# if (injectionSwitch.x > injectionSwitch.y) 102e5c31af7Sopenharmony_ci# { 103e5c31af7Sopenharmony_ci# discard; 104e5c31af7Sopenharmony_ci# } 105e5c31af7Sopenharmony_ci# } 106e5c31af7Sopenharmony_ci# } 107e5c31af7Sopenharmony_ci# vec4 sum; 108e5c31af7Sopenharmony_ci# sum = vec4(1.0, 0.0, 0.0, 1.0); // red 109e5c31af7Sopenharmony_ci# sum += data[1].xxyz; // sum is unchanged 110e5c31af7Sopenharmony_ci# _GLF_color = sum; // red 111e5c31af7Sopenharmony_ci# } 112e5c31af7Sopenharmony_ciSHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 113e5c31af7Sopenharmony_ci; SPIR-V 114e5c31af7Sopenharmony_ci; Version: 1.0 115e5c31af7Sopenharmony_ci; Generator: Khronos Glslang Reference Front End; 7 116e5c31af7Sopenharmony_ci; Bound: 270 117e5c31af7Sopenharmony_ci; Schema: 0 118e5c31af7Sopenharmony_ci OpCapability Shader 119e5c31af7Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 120e5c31af7Sopenharmony_ci OpMemoryModel Logical GLSL450 121e5c31af7Sopenharmony_ci OpEntryPoint Fragment %4 "main" %17 %154 122e5c31af7Sopenharmony_ci OpExecutionMode %4 OriginUpperLeft 123e5c31af7Sopenharmony_ci OpSource ESSL 310 124e5c31af7Sopenharmony_ci OpName %4 "main" 125e5c31af7Sopenharmony_ci OpName %17 "gl_FragCoord" 126e5c31af7Sopenharmony_ci OpName %55 "buf0" 127e5c31af7Sopenharmony_ci OpMemberName %55 0 "injectionSwitch" 128e5c31af7Sopenharmony_ci OpName %57 "" 129e5c31af7Sopenharmony_ci OpName %101 "data" 130e5c31af7Sopenharmony_ci OpName %154 "_GLF_color" 131e5c31af7Sopenharmony_ci OpDecorate %17 BuiltIn FragCoord 132e5c31af7Sopenharmony_ci OpMemberDecorate %55 0 Offset 0 133e5c31af7Sopenharmony_ci OpDecorate %55 Block 134e5c31af7Sopenharmony_ci OpDecorate %57 DescriptorSet 0 135e5c31af7Sopenharmony_ci OpDecorate %57 Binding 0 136e5c31af7Sopenharmony_ci OpDecorate %128 RelaxedPrecision 137e5c31af7Sopenharmony_ci OpDecorate %130 RelaxedPrecision 138e5c31af7Sopenharmony_ci OpDecorate %142 RelaxedPrecision 139e5c31af7Sopenharmony_ci OpDecorate %144 RelaxedPrecision 140e5c31af7Sopenharmony_ci OpDecorate %154 Location 0 141e5c31af7Sopenharmony_ci OpDecorate %228 RelaxedPrecision 142e5c31af7Sopenharmony_ci OpDecorate %230 RelaxedPrecision 143e5c31af7Sopenharmony_ci OpDecorate %240 RelaxedPrecision 144e5c31af7Sopenharmony_ci OpDecorate %241 RelaxedPrecision 145e5c31af7Sopenharmony_ci OpDecorate %243 RelaxedPrecision 146e5c31af7Sopenharmony_ci OpDecorate %253 RelaxedPrecision 147e5c31af7Sopenharmony_ci OpDecorate %241 RelaxedPrecision 148e5c31af7Sopenharmony_ci %2 = OpTypeVoid 149e5c31af7Sopenharmony_ci %3 = OpTypeFunction %2 150e5c31af7Sopenharmony_ci %6 = OpTypeFloat 32 151e5c31af7Sopenharmony_ci %7 = OpTypeVector %6 3 152e5c31af7Sopenharmony_ci %11 = OpTypeInt 32 1 153e5c31af7Sopenharmony_ci %14 = OpConstant %11 0 154e5c31af7Sopenharmony_ci %15 = OpTypeVector %6 4 155e5c31af7Sopenharmony_ci %16 = OpTypePointer Input %15 156e5c31af7Sopenharmony_ci %17 = OpVariable %16 Input 157e5c31af7Sopenharmony_ci %18 = OpTypeInt 32 0 158e5c31af7Sopenharmony_ci %19 = OpConstant %18 1 159e5c31af7Sopenharmony_ci %20 = OpTypePointer Input %6 160e5c31af7Sopenharmony_ci %23 = OpConstant %6 0 161e5c31af7Sopenharmony_ci %24 = OpTypeBool 162e5c31af7Sopenharmony_ci %28 = OpConstant %6 1 163e5c31af7Sopenharmony_ci %29 = OpConstantComposite %7 %28 %28 %28 164e5c31af7Sopenharmony_ci %38 = OpConstant %11 50 165e5c31af7Sopenharmony_ci %50 = OpConstant %6 4 166e5c31af7Sopenharmony_ci %54 = OpTypeVector %6 2 167e5c31af7Sopenharmony_ci %55 = OpTypeStruct %54 168e5c31af7Sopenharmony_ci %56 = OpTypePointer Uniform %55 169e5c31af7Sopenharmony_ci %57 = OpVariable %56 Uniform 170e5c31af7Sopenharmony_ci %58 = OpConstant %18 0 171e5c31af7Sopenharmony_ci %59 = OpTypePointer Uniform %6 172e5c31af7Sopenharmony_ci %78 = OpConstant %6 2 173e5c31af7Sopenharmony_ci %84 = OpConstant %11 1 174e5c31af7Sopenharmony_ci %90 = OpTypePointer Function %7 175e5c31af7Sopenharmony_ci %98 = OpConstant %18 16 176e5c31af7Sopenharmony_ci %99 = OpTypeArray %7 %98 177e5c31af7Sopenharmony_ci %100 = OpTypePointer Function %99 178e5c31af7Sopenharmony_ci %102 = OpConstantComposite %7 %23 %23 %23 179e5c31af7Sopenharmony_ci %111 = OpConstant %11 4 180e5c31af7Sopenharmony_ci %147 = OpConstantComposite %15 %28 %23 %23 %28 181e5c31af7Sopenharmony_ci %153 = OpTypePointer Output %15 182e5c31af7Sopenharmony_ci %154 = OpVariable %153 Output 183e5c31af7Sopenharmony_ci %248 = OpUndef %6 184e5c31af7Sopenharmony_ci %4 = OpFunction %2 None %3 185e5c31af7Sopenharmony_ci %5 = OpLabel 186e5c31af7Sopenharmony_ci %101 = OpVariable %100 Function 187e5c31af7Sopenharmony_ci %103 = OpAccessChain %90 %101 %84 188e5c31af7Sopenharmony_ci OpStore %103 %102 189e5c31af7Sopenharmony_ci OpBranch %105 190e5c31af7Sopenharmony_ci %105 = OpLabel 191e5c31af7Sopenharmony_ci %240 = OpPhi %11 %14 %5 %144 %122 192e5c31af7Sopenharmony_ci %252 = OpPhi %6 %248 %5 %251 %122 193e5c31af7Sopenharmony_ci %247 = OpPhi %6 %248 %5 %246 %122 194e5c31af7Sopenharmony_ci %112 = OpSLessThan %24 %240 %111 195e5c31af7Sopenharmony_ci OpLoopMerge %107 %122 None 196e5c31af7Sopenharmony_ci OpBranchConditional %112 %106 %107 197e5c31af7Sopenharmony_ci %106 = OpLabel 198e5c31af7Sopenharmony_ci %113 = OpAccessChain %59 %57 %14 %58 199e5c31af7Sopenharmony_ci %114 = OpLoad %6 %113 200e5c31af7Sopenharmony_ci %115 = OpFOrdLessThan %24 %114 %28 201e5c31af7Sopenharmony_ci OpSelectionMerge %117 None 202e5c31af7Sopenharmony_ci OpBranchConditional %115 %116 %117 203e5c31af7Sopenharmony_ci %116 = OpLabel 204e5c31af7Sopenharmony_ci OpBranch %107 205e5c31af7Sopenharmony_ci %117 = OpLabel 206e5c31af7Sopenharmony_ci OpBranch %120 207e5c31af7Sopenharmony_ci %120 = OpLabel 208e5c31af7Sopenharmony_ci %251 = OpPhi %6 %252 %117 %266 %139 209e5c31af7Sopenharmony_ci %246 = OpPhi %6 %247 %117 %264 %139 210e5c31af7Sopenharmony_ci %241 = OpPhi %11 %14 %117 %142 %139 211e5c31af7Sopenharmony_ci %126 = OpSLessThan %24 %241 %111 212e5c31af7Sopenharmony_ci OpLoopMerge %267 %139 None 213e5c31af7Sopenharmony_ci OpBranchConditional %126 %121 %267 214e5c31af7Sopenharmony_ci %121 = OpLabel 215e5c31af7Sopenharmony_ci %128 = OpIMul %11 %111 %241 216e5c31af7Sopenharmony_ci %130 = OpIAdd %11 %128 %240 217e5c31af7Sopenharmony_ci OpBranch %181 218e5c31af7Sopenharmony_ci %181 = OpLabel 219e5c31af7Sopenharmony_ci OpLoopMerge %182 %183 None 220e5c31af7Sopenharmony_ci OpBranch %184 221e5c31af7Sopenharmony_ci %184 = OpLabel 222e5c31af7Sopenharmony_ci %185 = OpAccessChain %20 %17 %19 223e5c31af7Sopenharmony_ci %186 = OpLoad %6 %185 224e5c31af7Sopenharmony_ci %187 = OpFOrdLessThan %24 %186 %23 225e5c31af7Sopenharmony_ci OpSelectionMerge %188 None 226e5c31af7Sopenharmony_ci OpBranchConditional %187 %189 %188 227e5c31af7Sopenharmony_ci %189 = OpLabel 228e5c31af7Sopenharmony_ci OpBranch %182 229e5c31af7Sopenharmony_ci %188 = OpLabel 230e5c31af7Sopenharmony_ci OpBranch %190 231e5c31af7Sopenharmony_ci %190 = OpLabel 232e5c31af7Sopenharmony_ci %253 = OpPhi %11 %14 %188 %228 %220 233e5c31af7Sopenharmony_ci %249 = OpPhi %6 %251 %188 %225 %220 234e5c31af7Sopenharmony_ci %244 = OpPhi %6 %246 %188 %216 %220 235e5c31af7Sopenharmony_ci %243 = OpPhi %11 %14 %188 %230 %220 236e5c31af7Sopenharmony_ci %195 = OpSLessThan %24 %243 %38 237e5c31af7Sopenharmony_ci OpLoopMerge %191 %220 None 238e5c31af7Sopenharmony_ci OpBranchConditional %195 %196 %191 239e5c31af7Sopenharmony_ci %196 = OpLabel 240e5c31af7Sopenharmony_ci %199 = OpFMul %6 %244 %244 241e5c31af7Sopenharmony_ci %202 = OpFMul %6 %249 %249 242e5c31af7Sopenharmony_ci %203 = OpFAdd %6 %199 %202 243e5c31af7Sopenharmony_ci %204 = OpFOrdGreaterThan %24 %203 %50 244e5c31af7Sopenharmony_ci OpSelectionMerge %205 None 245e5c31af7Sopenharmony_ci OpBranchConditional %204 %206 %205 246e5c31af7Sopenharmony_ci %206 = OpLabel 247e5c31af7Sopenharmony_ci %209 = OpAccessChain %59 %57 %14 %19 248e5c31af7Sopenharmony_ci %210 = OpLoad %6 %209 249e5c31af7Sopenharmony_ci %211 = OpFOrdGreaterThan %24 %114 %210 250e5c31af7Sopenharmony_ci OpSelectionMerge %212 None 251e5c31af7Sopenharmony_ci OpBranchConditional %211 %213 %212 252e5c31af7Sopenharmony_ci %213 = OpLabel 253e5c31af7Sopenharmony_ci OpKill 254e5c31af7Sopenharmony_ci %212 = OpLabel 255e5c31af7Sopenharmony_ci OpBranch %191 256e5c31af7Sopenharmony_ci %205 = OpLabel 257e5c31af7Sopenharmony_ci %216 = OpFSub %6 %28 %249 258e5c31af7Sopenharmony_ci %217 = OpAccessChain %20 %17 %58 259e5c31af7Sopenharmony_ci %218 = OpLoad %6 %217 260e5c31af7Sopenharmony_ci %219 = OpFOrdLessThan %24 %218 %23 261e5c31af7Sopenharmony_ci OpSelectionMerge %269 None 262e5c31af7Sopenharmony_ci OpBranchConditional %219 %221 %220 263e5c31af7Sopenharmony_ci %221 = OpLabel 264e5c31af7Sopenharmony_ci OpKill 265e5c31af7Sopenharmony_ci %269 = OpLabel 266e5c31af7Sopenharmony_ci OpBranch %220 267e5c31af7Sopenharmony_ci %220 = OpLabel 268e5c31af7Sopenharmony_ci %224 = OpFMul %6 %78 %249 269e5c31af7Sopenharmony_ci %225 = OpFAdd %6 %224 %28 270e5c31af7Sopenharmony_ci %228 = OpIAdd %11 %253 %84 271e5c31af7Sopenharmony_ci %230 = OpIAdd %11 %243 %84 272e5c31af7Sopenharmony_ci OpBranch %190 273e5c31af7Sopenharmony_ci %191 = OpLabel 274e5c31af7Sopenharmony_ci %233 = OpConvertSToF %6 %253 275e5c31af7Sopenharmony_ci %234 = OpCompositeConstruct %7 %28 %28 %233 276e5c31af7Sopenharmony_ci OpBranch %182 277e5c31af7Sopenharmony_ci %183 = OpLabel 278e5c31af7Sopenharmony_ci OpBranch %181 279e5c31af7Sopenharmony_ci %182 = OpLabel 280e5c31af7Sopenharmony_ci %266 = OpPhi %6 %251 %189 %249 %191 281e5c31af7Sopenharmony_ci %264 = OpPhi %6 %246 %189 %244 %191 282e5c31af7Sopenharmony_ci %255 = OpPhi %7 %29 %189 %234 %191 283e5c31af7Sopenharmony_ci %132 = OpAccessChain %90 %101 %130 284e5c31af7Sopenharmony_ci OpStore %132 %255 285e5c31af7Sopenharmony_ci %135 = OpAccessChain %59 %57 %14 %19 286e5c31af7Sopenharmony_ci %136 = OpLoad %6 %135 287e5c31af7Sopenharmony_ci %137 = OpFOrdGreaterThan %24 %114 %136 288e5c31af7Sopenharmony_ci OpSelectionMerge %268 None 289e5c31af7Sopenharmony_ci OpBranchConditional %137 %138 %139 290e5c31af7Sopenharmony_ci %138 = OpLabel 291e5c31af7Sopenharmony_ci OpKill 292e5c31af7Sopenharmony_ci %268 = OpLabel 293e5c31af7Sopenharmony_ci OpBranch %139 294e5c31af7Sopenharmony_ci %139 = OpLabel 295e5c31af7Sopenharmony_ci %142 = OpIAdd %11 %241 %84 296e5c31af7Sopenharmony_ci OpBranch %120 297e5c31af7Sopenharmony_ci %267 = OpLabel 298e5c31af7Sopenharmony_ci OpBranch %122 299e5c31af7Sopenharmony_ci %122 = OpLabel 300e5c31af7Sopenharmony_ci %144 = OpIAdd %11 %240 %84 301e5c31af7Sopenharmony_ci OpBranch %105 302e5c31af7Sopenharmony_ci %107 = OpLabel 303e5c31af7Sopenharmony_ci %149 = OpLoad %7 %103 304e5c31af7Sopenharmony_ci %150 = OpVectorShuffle %15 %149 %149 0 0 1 2 305e5c31af7Sopenharmony_ci %152 = OpFAdd %15 %147 %150 306e5c31af7Sopenharmony_ci OpStore %154 %152 307e5c31af7Sopenharmony_ci OpReturn 308e5c31af7Sopenharmony_ci OpFunctionEnd 309e5c31af7Sopenharmony_ciEND 310e5c31af7Sopenharmony_ci 311e5c31af7Sopenharmony_ci# uniforms for variant 312e5c31af7Sopenharmony_ci 313e5c31af7Sopenharmony_ci# injectionSwitch 314e5c31af7Sopenharmony_ciBUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA 315e5c31af7Sopenharmony_ci 0.0 1.0 316e5c31af7Sopenharmony_ciEND 317e5c31af7Sopenharmony_ci 318e5c31af7Sopenharmony_ciBUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 319e5c31af7Sopenharmony_ci 320e5c31af7Sopenharmony_ciPIPELINE graphics variant_pipeline 321e5c31af7Sopenharmony_ci ATTACH variant_vertex_shader 322e5c31af7Sopenharmony_ci ATTACH variant_fragment_shader 323e5c31af7Sopenharmony_ci FRAMEBUFFER_SIZE 256 256 324e5c31af7Sopenharmony_ci BIND BUFFER variant_framebuffer AS color LOCATION 0 325e5c31af7Sopenharmony_ci BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0 326e5c31af7Sopenharmony_ciEND 327e5c31af7Sopenharmony_ciCLEAR_COLOR variant_pipeline 0 0 0 255 328e5c31af7Sopenharmony_ci 329e5c31af7Sopenharmony_ciCLEAR variant_pipeline 330e5c31af7Sopenharmony_ciRUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 331e5c31af7Sopenharmony_ci 332e5c31af7Sopenharmony_ciEXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 333