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