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