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