1#!amber 2 3# Copyright 2021 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 specific LLVM code paths 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 320 es 28# 29# #define _int_1 _GLF_uniform_int_values[0] 30# #define _int_2 _GLF_uniform_int_values[1] 31# #define _int_0 _GLF_uniform_int_values[2] 32# #define _float_1_0 _GLF_uniform_float_values[0] 33# #define _float_0_0 _GLF_uniform_float_values[1] 34# 35# precision highp float; 36# precision highp int; 37# 38# // Contents of _GLF_uniform_float_values: [1.0, 0.0] 39# layout(set = 0, binding = 0) uniform buf0 40# { 41# float _GLF_uniform_float_values[2]; 42# }; 43# 44# // Contents of _GLF_uniform_int_values: [1, 2, 0] 45# layout(set = 0, binding = 1) uniform buf1 46# { 47# int _GLF_uniform_int_values[3]; 48# }; 49# 50# const int _GLF_global_loop_bound = 50; 51# int _GLF_global_loop_count = 0; 52# 53# layout(location = 0) out vec4 _GLF_color; 54# 55# // Contents of resolution: [256.0, 256.0] 56# layout(push_constant) uniform buf_push 57# { 58# vec2 resolution; 59# }; 60# 61# void main() 62# { 63# float arr[32] = float[32](_float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0); 64# int i = 1; 65# 66# while(_GLF_global_loop_count < _GLF_global_loop_bound) 67# { 68# _GLF_global_loop_count ++; 69# 70# // Always false. 71# if(gl_FragCoord.y < _float_0_0 && (true ? resolution : vec2(_int_1)).x >= _float_1_0) 72# { 73# break; 74# } 75# 76# if(i == 1) 77# { 78# // Executed once. Sets arr[1] to zero. 79# arr[i++] = _float_0_0; 80# } 81# } 82# 83# // Always true. Simplifies to arr[1] * resolution.y = 0.0 * 256.0 = 0.0. 84# if(arr[findMSB(_int_2)] * resolution.y == _float_0_0) 85# { 86# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1); 87# } 88# else 89# { 90# _GLF_color = vec4(_int_0); 91# } 92# } 93SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 94; SPIR-V 95; Version: 1.0 96; Generator: Khronos Glslang Reference Front End; 10 97; Bound: 191 98; Schema: 0 99 OpCapability Shader 100 %1 = OpExtInstImport "GLSL.std.450" 101 OpMemoryModel Logical GLSL450 102 OpEntryPoint Fragment %4 "main" %103 %171 103 OpExecutionMode %4 OriginUpperLeft 104 OpSource ESSL 320 105 OpName %4 "main" 106 OpName %8 "_GLF_global_loop_count" 107 OpName %15 "arr" 108 OpName %18 "buf0" 109 OpMemberName %18 0 "_GLF_uniform_float_values" 110 OpName %20 "" 111 OpName %88 "i" 112 OpName %103 "gl_FragCoord" 113 OpName %119 "buf_push" 114 OpMemberName %119 0 "resolution" 115 OpName %121 "" 116 OpName %128 "buf1" 117 OpMemberName %128 0 "_GLF_uniform_int_values" 118 OpName %130 "" 119 OpName %171 "_GLF_color" 120 OpDecorate %17 ArrayStride 16 121 OpMemberDecorate %18 0 Offset 0 122 OpDecorate %18 Block 123 OpDecorate %20 DescriptorSet 0 124 OpDecorate %20 Binding 0 125 OpDecorate %103 BuiltIn FragCoord 126 OpMemberDecorate %119 0 Offset 0 127 OpDecorate %119 Block 128 OpDecorate %127 ArrayStride 16 129 OpMemberDecorate %128 0 Offset 0 130 OpDecorate %128 Block 131 OpDecorate %130 DescriptorSet 0 132 OpDecorate %130 Binding 1 133 OpDecorate %171 Location 0 134 %2 = OpTypeVoid 135 %3 = OpTypeFunction %2 136 %6 = OpTypeInt 32 1 137 %7 = OpTypePointer Private %6 138 %8 = OpVariable %7 Private 139 %9 = OpConstant %6 0 140 %10 = OpTypeFloat 32 141 %11 = OpTypeInt 32 0 142 %12 = OpConstant %11 32 143 %13 = OpTypeArray %10 %12 144 %14 = OpTypePointer Function %13 145 %16 = OpConstant %11 2 146 %17 = OpTypeArray %10 %16 147 %18 = OpTypeStruct %17 148 %19 = OpTypePointer Uniform %18 149 %20 = OpVariable %19 Uniform 150 %21 = OpTypePointer Uniform %10 151 %87 = OpTypePointer Function %6 152 %89 = OpConstant %6 1 153 %96 = OpConstant %6 50 154 %97 = OpTypeBool 155 %101 = OpTypeVector %10 4 156 %102 = OpTypePointer Input %101 157 %103 = OpVariable %102 Input 158 %104 = OpConstant %11 1 159 %105 = OpTypePointer Input %10 160 %113 = OpConstantTrue %97 161 %114 = OpTypeVector %10 2 162 %115 = OpTypePointer Function %114 163 %119 = OpTypeStruct %114 164 %120 = OpTypePointer PushConstant %119 165 %121 = OpVariable %120 PushConstant 166 %122 = OpTypePointer PushConstant %114 167 %126 = OpConstant %11 3 168 %127 = OpTypeArray %6 %126 169 %128 = OpTypeStruct %127 170 %129 = OpTypePointer Uniform %128 171 %130 = OpVariable %129 Uniform 172 %131 = OpTypePointer Uniform %6 173 %136 = OpConstant %11 0 174 %137 = OpTypePointer Function %10 175 %161 = OpTypePointer PushConstant %10 176 %170 = OpTypePointer Output %101 177 %171 = OpVariable %170 Output 178 %175 = OpConstant %6 2 179 %4 = OpFunction %2 None %3 180 %5 = OpLabel 181 %15 = OpVariable %14 Function 182 %88 = OpVariable %87 Function 183 %116 = OpVariable %115 Function 184 OpStore %8 %9 185 %22 = OpAccessChain %21 %20 %9 %9 186 %23 = OpLoad %10 %22 187 %24 = OpAccessChain %21 %20 %9 %9 188 %25 = OpLoad %10 %24 189 %26 = OpAccessChain %21 %20 %9 %9 190 %27 = OpLoad %10 %26 191 %28 = OpAccessChain %21 %20 %9 %9 192 %29 = OpLoad %10 %28 193 %30 = OpAccessChain %21 %20 %9 %9 194 %31 = OpLoad %10 %30 195 %32 = OpAccessChain %21 %20 %9 %9 196 %33 = OpLoad %10 %32 197 %34 = OpAccessChain %21 %20 %9 %9 198 %35 = OpLoad %10 %34 199 %36 = OpAccessChain %21 %20 %9 %9 200 %37 = OpLoad %10 %36 201 %38 = OpAccessChain %21 %20 %9 %9 202 %39 = OpLoad %10 %38 203 %40 = OpAccessChain %21 %20 %9 %9 204 %41 = OpLoad %10 %40 205 %42 = OpAccessChain %21 %20 %9 %9 206 %43 = OpLoad %10 %42 207 %44 = OpAccessChain %21 %20 %9 %9 208 %45 = OpLoad %10 %44 209 %46 = OpAccessChain %21 %20 %9 %9 210 %47 = OpLoad %10 %46 211 %48 = OpAccessChain %21 %20 %9 %9 212 %49 = OpLoad %10 %48 213 %50 = OpAccessChain %21 %20 %9 %9 214 %51 = OpLoad %10 %50 215 %52 = OpAccessChain %21 %20 %9 %9 216 %53 = OpLoad %10 %52 217 %54 = OpAccessChain %21 %20 %9 %9 218 %55 = OpLoad %10 %54 219 %56 = OpAccessChain %21 %20 %9 %9 220 %57 = OpLoad %10 %56 221 %58 = OpAccessChain %21 %20 %9 %9 222 %59 = OpLoad %10 %58 223 %60 = OpAccessChain %21 %20 %9 %9 224 %61 = OpLoad %10 %60 225 %62 = OpAccessChain %21 %20 %9 %9 226 %63 = OpLoad %10 %62 227 %64 = OpAccessChain %21 %20 %9 %9 228 %65 = OpLoad %10 %64 229 %66 = OpAccessChain %21 %20 %9 %9 230 %67 = OpLoad %10 %66 231 %68 = OpAccessChain %21 %20 %9 %9 232 %69 = OpLoad %10 %68 233 %70 = OpAccessChain %21 %20 %9 %9 234 %71 = OpLoad %10 %70 235 %72 = OpAccessChain %21 %20 %9 %9 236 %73 = OpLoad %10 %72 237 %74 = OpAccessChain %21 %20 %9 %9 238 %75 = OpLoad %10 %74 239 %76 = OpAccessChain %21 %20 %9 %9 240 %77 = OpLoad %10 %76 241 %78 = OpAccessChain %21 %20 %9 %9 242 %79 = OpLoad %10 %78 243 %80 = OpAccessChain %21 %20 %9 %9 244 %81 = OpLoad %10 %80 245 %82 = OpAccessChain %21 %20 %9 %9 246 %83 = OpLoad %10 %82 247 %84 = OpAccessChain %21 %20 %9 %9 248 %85 = OpLoad %10 %84 249 %86 = OpCompositeConstruct %13 %23 %25 %27 %29 %31 %33 %35 %37 %39 %41 %43 %45 %47 %49 %51 %53 %55 %57 %59 %61 %63 %65 %67 %69 %71 %73 %75 %77 %79 %81 %83 %85 250 OpStore %15 %86 251 OpStore %88 %89 252 OpBranch %90 253 %90 = OpLabel 254 OpLoopMerge %92 %93 None 255 OpBranch %94 256 %94 = OpLabel 257 %95 = OpLoad %6 %8 258 %98 = OpSLessThan %97 %95 %96 259 OpBranchConditional %98 %91 %92 260 %91 = OpLabel 261 %99 = OpLoad %6 %8 262 %100 = OpIAdd %6 %99 %89 263 OpStore %8 %100 264 %106 = OpAccessChain %105 %103 %104 265 %107 = OpLoad %10 %106 266 %108 = OpAccessChain %21 %20 %9 %89 267 %109 = OpLoad %10 %108 268 %110 = OpFOrdLessThan %97 %107 %109 269 OpSelectionMerge %112 None 270 OpBranchConditional %110 %111 %112 271 %111 = OpLabel 272 OpSelectionMerge %118 None 273 OpBranchConditional %113 %117 %125 274 %117 = OpLabel 275 %123 = OpAccessChain %122 %121 %9 276 %124 = OpLoad %114 %123 277 OpStore %116 %124 278 OpBranch %118 279 %125 = OpLabel 280 %132 = OpAccessChain %131 %130 %9 %9 281 %133 = OpLoad %6 %132 282 %134 = OpConvertSToF %10 %133 283 %135 = OpCompositeConstruct %114 %134 %134 284 OpStore %116 %135 285 OpBranch %118 286 %118 = OpLabel 287 %138 = OpAccessChain %137 %116 %136 288 %139 = OpLoad %10 %138 289 %140 = OpAccessChain %21 %20 %9 %9 290 %141 = OpLoad %10 %140 291 %142 = OpFOrdGreaterThanEqual %97 %139 %141 292 OpBranch %112 293 %112 = OpLabel 294 %143 = OpPhi %97 %110 %91 %142 %118 295 OpSelectionMerge %145 None 296 OpBranchConditional %143 %144 %145 297 %144 = OpLabel 298 OpBranch %92 299 %145 = OpLabel 300 %147 = OpLoad %6 %88 301 %148 = OpIEqual %97 %147 %89 302 OpSelectionMerge %150 None 303 OpBranchConditional %148 %149 %150 304 %149 = OpLabel 305 %151 = OpLoad %6 %88 306 %152 = OpIAdd %6 %151 %89 307 OpStore %88 %152 308 %153 = OpAccessChain %21 %20 %9 %89 309 %154 = OpLoad %10 %153 310 %155 = OpAccessChain %137 %15 %151 311 OpStore %155 %154 312 OpBranch %150 313 %150 = OpLabel 314 OpBranch %93 315 %93 = OpLabel 316 OpBranch %90 317 %92 = OpLabel 318 %156 = OpAccessChain %131 %130 %9 %89 319 %157 = OpLoad %6 %156 320 %158 = OpExtInst %6 %1 FindSMsb %157 321 %159 = OpAccessChain %137 %15 %158 322 %160 = OpLoad %10 %159 323 %162 = OpAccessChain %161 %121 %9 %104 324 %163 = OpLoad %10 %162 325 %164 = OpFMul %10 %160 %163 326 %165 = OpAccessChain %21 %20 %9 %89 327 %166 = OpLoad %10 %165 328 %167 = OpFOrdEqual %97 %164 %166 329 OpSelectionMerge %169 None 330 OpBranchConditional %167 %168 %186 331 %168 = OpLabel 332 %172 = OpAccessChain %131 %130 %9 %9 333 %173 = OpLoad %6 %172 334 %174 = OpConvertSToF %10 %173 335 %176 = OpAccessChain %131 %130 %9 %175 336 %177 = OpLoad %6 %176 337 %178 = OpConvertSToF %10 %177 338 %179 = OpAccessChain %131 %130 %9 %175 339 %180 = OpLoad %6 %179 340 %181 = OpConvertSToF %10 %180 341 %182 = OpAccessChain %131 %130 %9 %9 342 %183 = OpLoad %6 %182 343 %184 = OpConvertSToF %10 %183 344 %185 = OpCompositeConstruct %101 %174 %178 %181 %184 345 OpStore %171 %185 346 OpBranch %169 347 %186 = OpLabel 348 %187 = OpAccessChain %131 %130 %9 %175 349 %188 = OpLoad %6 %187 350 %189 = OpConvertSToF %10 %188 351 %190 = OpCompositeConstruct %101 %189 %189 %189 %189 352 OpStore %171 %190 353 OpBranch %169 354 %169 = OpLabel 355 OpReturn 356 OpFunctionEnd 357END 358 359# uniforms for variant 360 361# resolution 362BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA 363 256.0 256.0 364END 365# _GLF_uniform_int_values 366BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 367 1 2 0 368END 369# _GLF_uniform_float_values 370BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA 371 1.0 0.0 372END 373 374BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 375 376PIPELINE graphics variant_pipeline 377 ATTACH variant_vertex_shader 378 ATTACH variant_fragment_shader 379 FRAMEBUFFER_SIZE 256 256 380 BIND BUFFER variant_framebuffer AS color LOCATION 0 381 BIND BUFFER variant_resolution AS push_constant 382 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1 383 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0 384END 385CLEAR_COLOR variant_pipeline 0 0 0 255 386 387CLEAR variant_pipeline 388RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 389 390EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 391