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