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