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 BRW 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 _GLF_MAKE_IN_BOUNDS_INT(IDX, SZ) clamp(IDX, 0, SZ - 1) 30# #define _int_0 _GLF_uniform_int_values[0] 31# #define _int_2 _GLF_uniform_int_values[1] 32# #define _int_1 _GLF_uniform_int_values[2] 33# #define _int_4 _GLF_uniform_int_values[3] 34# #define _float_0_0 _GLF_uniform_float_values[0] 35# #define _float_1_0 _GLF_uniform_float_values[1] 36# #define _float_2_0 _GLF_uniform_float_values[2] 37# #define _float_3_0 _GLF_uniform_float_values[3] 38# #define _float_4_0 _GLF_uniform_float_values[4] 39# #define _float_5_0 _GLF_uniform_float_values[5] 40# #define _float_6_0 _GLF_uniform_float_values[6] 41# #define _float_7_0 _GLF_uniform_float_values[7] 42# #define _float_8_0 _GLF_uniform_float_values[8] 43# #define _float_9_0 _GLF_uniform_float_values[9] 44# #define _float_10_0 _GLF_uniform_float_values[10] 45# #define _float_11_0 _GLF_uniform_float_values[11] 46# #define _float_12_0 _GLF_uniform_float_values[12] 47# #define _float_13_0 _GLF_uniform_float_values[13] 48# #define _float_14_0 _GLF_uniform_float_values[14] 49# #define _float_15_0 _GLF_uniform_float_values[15] 50# #define _float_16_0 _GLF_uniform_float_values[16] 51# #define _float_27_0 _GLF_uniform_float_values[17] 52# 53# precision highp int; 54# precision highp float; 55# 56# // Contents of _GLF_uniform_int_values: [0, 2, 1, 4] 57# layout(set = 0, binding = 0) uniform buf0 58# { 59# int _GLF_uniform_int_values[4]; 60# }; 61# 62# // Contents of _GLF_uniform_float_values: 63# // [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 27.0] 64# layout(set = 0, binding = 1) uniform buf1 65# { 66# float _GLF_uniform_float_values[18]; 67# }; 68# 69# const int _GLF_global_loop_bound = 10; 70# int _GLF_global_loop_count = 0; 71# 72# // Contents of one: 1 73# layout(set = 0, binding = 2) uniform buf2 74# { 75# int one; 76# }; 77# 78# layout(location = 0) out vec4 _GLF_color; 79# 80# void main() 81# { 82# mat4 m = mat4(_float_1_0, _float_2_0, _float_3_0, _float_4_0, _float_5_0, _float_6_0, _float_7_0, _float_8_0, _float_9_0, _float_10_0, _float_11_0, _float_12_0, _float_13_0, _float_14_0, _float_15_0, _float_16_0); 83# vec4 v = vec4(_float_1_0, _float_2_0, _float_3_0, _float_4_0); 84# float f = _float_1_0; 85# 86# // Iterated once. 87# for(int a = _int_0; _GLF_global_loop_count < _GLF_global_loop_bound; a++) 88# { 89# _GLF_global_loop_count++; 90# 91# // v becomes (2, 2, 3, 4). 92# v[_GLF_MAKE_IN_BOUNDS_INT(a, 4)] += _float_1_0; 93# 94# // Iterated 9 times. 95# for(int b = _int_1; _GLF_global_loop_count < _GLF_global_loop_bound; b--) 96# { 97# _GLF_global_loop_count++; 98# // Iteration b = 1: f += 10. Iterations b = 0..-8: f += 2. 99# f += v[_GLF_MAKE_IN_BOUNDS_INT(b, 4)] * m[_GLF_MAKE_IN_BOUNDS_INT(b, 4)][a]; 100# } 101# 102# // This value is never used. 103# m[1][_GLF_MAKE_IN_BOUNDS_INT(a, 4)] = _float_1_0; 104# 105# // Always false. 106# if(one == _int_0) 107# { 108# discard; 109# } 110# // Always false. 111# if(one == _int_2) 112# { 113# discard; 114# } 115# } 116# 117# float zero = _float_0_0; 118# // Modify zero in case the result is not what's expected. 119# if(f != _float_27_0) 120# { 121# zero = _float_1_0; 122# } 123# 124# _GLF_color = vec4(f, zero, _int_0, f); 125# } 126SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 127; SPIR-V 128; Version: 1.0 129; Generator: Khronos Glslang Reference Front End; 10 130; Bound: 193 131; Schema: 0 132 OpCapability Shader 133 %1 = OpExtInstImport "GLSL.std.450" 134 OpMemoryModel Logical GLSL450 135 OpEntryPoint Fragment %4 "main" %185 136 OpExecutionMode %4 OriginUpperLeft 137 OpSource ESSL 320 138 OpName %4 "main" 139 OpName %8 "_GLF_global_loop_count" 140 OpName %14 "m" 141 OpName %18 "buf1" 142 OpMemberName %18 0 "_GLF_uniform_float_values" 143 OpName %20 "" 144 OpName %78 "v" 145 OpName %89 "f" 146 OpName %93 "a" 147 OpName %96 "buf0" 148 OpMemberName %96 0 "_GLF_uniform_int_values" 149 OpName %98 "" 150 OpName %120 "b" 151 OpName %151 "buf2" 152 OpMemberName %151 0 "one" 153 OpName %153 "" 154 OpName %172 "zero" 155 OpName %185 "_GLF_color" 156 OpDecorate %17 ArrayStride 16 157 OpMemberDecorate %18 0 Offset 0 158 OpDecorate %18 Block 159 OpDecorate %20 DescriptorSet 0 160 OpDecorate %20 Binding 1 161 OpDecorate %95 ArrayStride 16 162 OpMemberDecorate %96 0 Offset 0 163 OpDecorate %96 Block 164 OpDecorate %98 DescriptorSet 0 165 OpDecorate %98 Binding 0 166 OpMemberDecorate %151 0 Offset 0 167 OpDecorate %151 Block 168 OpDecorate %153 DescriptorSet 0 169 OpDecorate %153 Binding 2 170 OpDecorate %185 Location 0 171 %2 = OpTypeVoid 172 %3 = OpTypeFunction %2 173 %6 = OpTypeInt 32 1 174 %7 = OpTypePointer Private %6 175 %8 = OpVariable %7 Private 176 %9 = OpConstant %6 0 177 %10 = OpTypeFloat 32 178 %11 = OpTypeVector %10 4 179 %12 = OpTypeMatrix %11 4 180 %13 = OpTypePointer Function %12 181 %15 = OpTypeInt 32 0 182 %16 = OpConstant %15 18 183 %17 = OpTypeArray %10 %16 184 %18 = OpTypeStruct %17 185 %19 = OpTypePointer Uniform %18 186 %20 = OpVariable %19 Uniform 187 %21 = OpConstant %6 1 188 %22 = OpTypePointer Uniform %10 189 %25 = OpConstant %6 2 190 %28 = OpConstant %6 3 191 %31 = OpConstant %6 4 192 %34 = OpConstant %6 5 193 %37 = OpConstant %6 6 194 %40 = OpConstant %6 7 195 %43 = OpConstant %6 8 196 %46 = OpConstant %6 9 197 %49 = OpConstant %6 10 198 %52 = OpConstant %6 11 199 %55 = OpConstant %6 12 200 %58 = OpConstant %6 13 201 %61 = OpConstant %6 14 202 %64 = OpConstant %6 15 203 %67 = OpConstant %6 16 204 %70 = OpConstant %10 1 205 %71 = OpConstant %10 0 206 %77 = OpTypePointer Function %11 207 %88 = OpTypePointer Function %10 208 %92 = OpTypePointer Function %6 209 %94 = OpConstant %15 4 210 %95 = OpTypeArray %6 %94 211 %96 = OpTypeStruct %95 212 %97 = OpTypePointer Uniform %96 213 %98 = OpVariable %97 Uniform 214 %99 = OpTypePointer Uniform %6 215 %108 = OpTypeBool 216 %151 = OpTypeStruct %6 217 %152 = OpTypePointer Uniform %151 218 %153 = OpVariable %152 Uniform 219 %176 = OpConstant %6 17 220 %184 = OpTypePointer Output %11 221 %185 = OpVariable %184 Output 222 %4 = OpFunction %2 None %3 223 %5 = OpLabel 224 %14 = OpVariable %13 Function 225 %78 = OpVariable %77 Function 226 %89 = OpVariable %88 Function 227 %93 = OpVariable %92 Function 228 %120 = OpVariable %92 Function 229 %172 = OpVariable %88 Function 230 OpStore %8 %9 231 %23 = OpAccessChain %22 %20 %9 %21 232 %24 = OpLoad %10 %23 233 %26 = OpAccessChain %22 %20 %9 %25 234 %27 = OpLoad %10 %26 235 %29 = OpAccessChain %22 %20 %9 %28 236 %30 = OpLoad %10 %29 237 %32 = OpAccessChain %22 %20 %9 %31 238 %33 = OpLoad %10 %32 239 %35 = OpAccessChain %22 %20 %9 %34 240 %36 = OpLoad %10 %35 241 %38 = OpAccessChain %22 %20 %9 %37 242 %39 = OpLoad %10 %38 243 %41 = OpAccessChain %22 %20 %9 %40 244 %42 = OpLoad %10 %41 245 %44 = OpAccessChain %22 %20 %9 %43 246 %45 = OpLoad %10 %44 247 %47 = OpAccessChain %22 %20 %9 %46 248 %48 = OpLoad %10 %47 249 %50 = OpAccessChain %22 %20 %9 %49 250 %51 = OpLoad %10 %50 251 %53 = OpAccessChain %22 %20 %9 %52 252 %54 = OpLoad %10 %53 253 %56 = OpAccessChain %22 %20 %9 %55 254 %57 = OpLoad %10 %56 255 %59 = OpAccessChain %22 %20 %9 %58 256 %60 = OpLoad %10 %59 257 %62 = OpAccessChain %22 %20 %9 %61 258 %63 = OpLoad %10 %62 259 %65 = OpAccessChain %22 %20 %9 %64 260 %66 = OpLoad %10 %65 261 %68 = OpAccessChain %22 %20 %9 %67 262 %69 = OpLoad %10 %68 263 %72 = OpCompositeConstruct %11 %24 %27 %30 %33 264 %73 = OpCompositeConstruct %11 %36 %39 %42 %45 265 %74 = OpCompositeConstruct %11 %48 %51 %54 %57 266 %75 = OpCompositeConstruct %11 %60 %63 %66 %69 267 %76 = OpCompositeConstruct %12 %72 %73 %74 %75 268 OpStore %14 %76 269 %79 = OpAccessChain %22 %20 %9 %21 270 %80 = OpLoad %10 %79 271 %81 = OpAccessChain %22 %20 %9 %25 272 %82 = OpLoad %10 %81 273 %83 = OpAccessChain %22 %20 %9 %28 274 %84 = OpLoad %10 %83 275 %85 = OpAccessChain %22 %20 %9 %31 276 %86 = OpLoad %10 %85 277 %87 = OpCompositeConstruct %11 %80 %82 %84 %86 278 OpStore %78 %87 279 %90 = OpAccessChain %22 %20 %9 %21 280 %91 = OpLoad %10 %90 281 OpStore %89 %91 282 %100 = OpAccessChain %99 %98 %9 %9 283 %101 = OpLoad %6 %100 284 OpStore %93 %101 285 OpBranch %102 286 %102 = OpLabel 287 OpLoopMerge %104 %105 None 288 OpBranch %106 289 %106 = OpLabel 290 %107 = OpLoad %6 %8 291 %109 = OpSLessThan %108 %107 %49 292 OpBranchConditional %109 %103 %104 293 %103 = OpLabel 294 %110 = OpLoad %6 %8 295 %111 = OpIAdd %6 %110 %21 296 OpStore %8 %111 297 %112 = OpLoad %6 %93 298 %113 = OpExtInst %6 %1 SClamp %112 %9 %28 299 %114 = OpAccessChain %22 %20 %9 %21 300 %115 = OpLoad %10 %114 301 %116 = OpAccessChain %88 %78 %113 302 %117 = OpLoad %10 %116 303 %118 = OpFAdd %10 %117 %115 304 %119 = OpAccessChain %88 %78 %113 305 OpStore %119 %118 306 %121 = OpAccessChain %99 %98 %9 %25 307 %122 = OpLoad %6 %121 308 OpStore %120 %122 309 OpBranch %123 310 %123 = OpLabel 311 OpLoopMerge %125 %126 None 312 OpBranch %127 313 %127 = OpLabel 314 %128 = OpLoad %6 %8 315 %129 = OpSLessThan %108 %128 %49 316 OpBranchConditional %129 %124 %125 317 %124 = OpLabel 318 %130 = OpLoad %6 %8 319 %131 = OpIAdd %6 %130 %21 320 OpStore %8 %131 321 %132 = OpLoad %6 %120 322 %133 = OpExtInst %6 %1 SClamp %132 %9 %28 323 %134 = OpAccessChain %88 %78 %133 324 %135 = OpLoad %10 %134 325 %136 = OpLoad %6 %120 326 %137 = OpExtInst %6 %1 SClamp %136 %9 %28 327 %138 = OpLoad %6 %93 328 %139 = OpAccessChain %88 %14 %137 %138 329 %140 = OpLoad %10 %139 330 %141 = OpFMul %10 %135 %140 331 %142 = OpLoad %10 %89 332 %143 = OpFAdd %10 %142 %141 333 OpStore %89 %143 334 OpBranch %126 335 %126 = OpLabel 336 %144 = OpLoad %6 %120 337 %145 = OpISub %6 %144 %21 338 OpStore %120 %145 339 OpBranch %123 340 %125 = OpLabel 341 %146 = OpLoad %6 %93 342 %147 = OpExtInst %6 %1 SClamp %146 %9 %28 343 %148 = OpAccessChain %22 %20 %9 %21 344 %149 = OpLoad %10 %148 345 %150 = OpAccessChain %88 %14 %21 %147 346 OpStore %150 %149 347 %154 = OpAccessChain %99 %153 %9 348 %155 = OpLoad %6 %154 349 %156 = OpAccessChain %99 %98 %9 %9 350 %157 = OpLoad %6 %156 351 %158 = OpIEqual %108 %155 %157 352 OpSelectionMerge %160 None 353 OpBranchConditional %158 %159 %160 354 %159 = OpLabel 355 OpKill 356 %160 = OpLabel 357 %162 = OpAccessChain %99 %153 %9 358 %163 = OpLoad %6 %162 359 %164 = OpAccessChain %99 %98 %9 %21 360 %165 = OpLoad %6 %164 361 %166 = OpIEqual %108 %163 %165 362 OpSelectionMerge %168 None 363 OpBranchConditional %166 %167 %168 364 %167 = OpLabel 365 OpKill 366 %168 = OpLabel 367 OpBranch %105 368 %105 = OpLabel 369 %170 = OpLoad %6 %93 370 %171 = OpIAdd %6 %170 %21 371 OpStore %93 %171 372 OpBranch %102 373 %104 = OpLabel 374 %173 = OpAccessChain %22 %20 %9 %9 375 %174 = OpLoad %10 %173 376 OpStore %172 %174 377 %175 = OpLoad %10 %89 378 %177 = OpAccessChain %22 %20 %9 %176 379 %178 = OpLoad %10 %177 380 %179 = OpFUnordNotEqual %108 %175 %178 381 OpSelectionMerge %181 None 382 OpBranchConditional %179 %180 %181 383 %180 = OpLabel 384 %182 = OpAccessChain %22 %20 %9 %21 385 %183 = OpLoad %10 %182 386 OpStore %172 %183 387 OpBranch %181 388 %181 = OpLabel 389 %186 = OpLoad %10 %89 390 %187 = OpLoad %10 %172 391 %188 = OpAccessChain %99 %98 %9 %9 392 %189 = OpLoad %6 %188 393 %190 = OpConvertSToF %10 %189 394 %191 = OpLoad %10 %89 395 %192 = OpCompositeConstruct %11 %186 %187 %190 %191 396 OpStore %185 %192 397 OpReturn 398 OpFunctionEnd 399END 400 401# uniforms for variant 402 403# one 404BUFFER variant_one DATA_TYPE int32 STD140 DATA 405 1 406END 407# _GLF_uniform_float_values 408BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA 409 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 27.0 410END 411# _GLF_uniform_int_values 412BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 413 0 2 1 4 414END 415 416BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 417 418PIPELINE graphics variant_pipeline 419 ATTACH variant_vertex_shader 420 ATTACH variant_fragment_shader 421 FRAMEBUFFER_SIZE 256 256 422 BIND BUFFER variant_framebuffer AS color LOCATION 0 423 BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 2 424 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1 425 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0 426END 427CLEAR_COLOR variant_pipeline 0 0 0 255 428 429CLEAR variant_pipeline 430RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 431 432EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 433