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