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