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 GraphicsFuzz. 19 20# Short description: A fragment shader that covers a specific interval map code path. 21 22# The test passes because 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# precision highp float; 29# precision highp int; 30# 31# layout(location = 0) out vec4 _GLF_color; 32# 33# vec3 func() 34# { 35# vec2 v = vec2(1); 36# int i = 0; 37# for(int k = 0; k < 2; k++) 38# { 39# if(v.y + 1.0 > 4.0) // Always false. 40# break; 41# 42# v.y = 1.0; 43# i++; 44# } 45# 46# if(i < 10) // Always true. 47# return vec3(1, 0, 0); 48# else 49# return vec3(0, 0, 1); 50# } 51# 52# void main() 53# { 54# vec3 data[2]; 55# 56# // Writes data[0] = (1, 0, 0). 57# for(int j = 0; j < 1; j++) 58# data[j] = func(); 59# 60# // Writes data[1] = (1, 0, 0). 61# for(int j = 0; j < 1; j++) 62# data[4*j + 1] = func(); 63# 64# if (data[0] == vec3(1, 0, 0) && data[1] == vec3(1, 0, 0)) // Always true. 65# _GLF_color = vec4(1, 0, 0, 1); 66# else 67# _GLF_color = vec4(0); 68# } 69SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 70; SPIR-V 71; Version: 1.0 72; Generator: Khronos Glslang Reference Front End; 8 73; Bound: 113 74; Schema: 0 75 OpCapability Shader 76 %1 = OpExtInstImport "GLSL.std.450" 77 OpMemoryModel Logical GLSL450 78 OpEntryPoint Fragment %4 "main" %109 79 OpExecutionMode %4 OriginUpperLeft 80 OpSource ESSL 310 81 OpName %4 "main" 82 OpName %9 "func(" 83 OpName %13 "v" 84 OpName %18 "i" 85 OpName %20 "k" 86 OpName %59 "j" 87 OpName %70 "data" 88 OpName %77 "j" 89 OpName %109 "_GLF_color" 90 OpDecorate %109 Location 0 91 %2 = OpTypeVoid 92 %3 = OpTypeFunction %2 93 %6 = OpTypeFloat 32 94 %7 = OpTypeVector %6 3 95 %8 = OpTypeFunction %7 96 %11 = OpTypeVector %6 2 97 %12 = OpTypePointer Function %11 98 %14 = OpConstant %6 1 99 %15 = OpConstantComposite %11 %14 %14 100 %16 = OpTypeInt 32 1 101 %17 = OpTypePointer Function %16 102 %19 = OpConstant %16 0 103 %27 = OpConstant %16 2 104 %28 = OpTypeBool 105 %30 = OpTypeInt 32 0 106 %31 = OpConstant %30 1 107 %32 = OpTypePointer Function %6 108 %36 = OpConstant %6 4 109 %43 = OpConstant %16 1 110 %48 = OpConstant %16 10 111 %52 = OpConstant %6 0 112 %53 = OpConstantComposite %7 %14 %52 %52 113 %56 = OpConstantComposite %7 %52 %52 %14 114 %67 = OpConstant %30 2 115 %68 = OpTypeArray %7 %67 116 %69 = OpTypePointer Function %68 117 %73 = OpTypePointer Function %7 118 %85 = OpConstant %16 4 119 %95 = OpTypeVector %28 3 120 %107 = OpTypeVector %6 4 121 %108 = OpTypePointer Output %107 122 %109 = OpVariable %108 Output 123 %110 = OpConstantComposite %107 %14 %52 %52 %14 124 %112 = OpConstantComposite %107 %52 %52 %52 %52 125 %4 = OpFunction %2 None %3 126 %5 = OpLabel 127 %59 = OpVariable %17 Function 128 %70 = OpVariable %69 Function 129 %77 = OpVariable %17 Function 130 OpStore %59 %19 131 OpBranch %60 132 %60 = OpLabel 133 OpLoopMerge %62 %63 None 134 OpBranch %64 135 %64 = OpLabel 136 %65 = OpLoad %16 %59 137 %66 = OpSLessThan %28 %65 %43 138 OpBranchConditional %66 %61 %62 139 %61 = OpLabel 140 %71 = OpLoad %16 %59 141 %72 = OpFunctionCall %7 %9 142 %74 = OpAccessChain %73 %70 %71 143 OpStore %74 %72 144 OpBranch %63 145 %63 = OpLabel 146 %75 = OpLoad %16 %59 147 %76 = OpIAdd %16 %75 %43 148 OpStore %59 %76 149 OpBranch %60 150 %62 = OpLabel 151 OpStore %77 %19 152 OpBranch %78 153 %78 = OpLabel 154 OpLoopMerge %80 %81 None 155 OpBranch %82 156 %82 = OpLabel 157 %83 = OpLoad %16 %77 158 %84 = OpSLessThan %28 %83 %43 159 OpBranchConditional %84 %79 %80 160 %79 = OpLabel 161 %86 = OpLoad %16 %77 162 %87 = OpIMul %16 %85 %86 163 %88 = OpIAdd %16 %87 %43 164 %89 = OpFunctionCall %7 %9 165 %90 = OpAccessChain %73 %70 %88 166 OpStore %90 %89 167 OpBranch %81 168 %81 = OpLabel 169 %91 = OpLoad %16 %77 170 %92 = OpIAdd %16 %91 %43 171 OpStore %77 %92 172 OpBranch %78 173 %80 = OpLabel 174 %93 = OpAccessChain %73 %70 %19 175 %94 = OpLoad %7 %93 176 %96 = OpFOrdEqual %95 %94 %53 177 %97 = OpAll %28 %96 178 OpSelectionMerge %99 None 179 OpBranchConditional %97 %98 %99 180 %98 = OpLabel 181 %100 = OpAccessChain %73 %70 %43 182 %101 = OpLoad %7 %100 183 %102 = OpFOrdEqual %95 %101 %53 184 %103 = OpAll %28 %102 185 OpBranch %99 186 %99 = OpLabel 187 %104 = OpPhi %28 %97 %80 %103 %98 188 OpSelectionMerge %106 None 189 OpBranchConditional %104 %105 %111 190 %105 = OpLabel 191 OpStore %109 %110 192 OpBranch %106 193 %111 = OpLabel 194 OpStore %109 %112 195 OpBranch %106 196 %106 = OpLabel 197 OpReturn 198 OpFunctionEnd 199 %9 = OpFunction %7 None %8 200 %10 = OpLabel 201 %13 = OpVariable %12 Function 202 %18 = OpVariable %17 Function 203 %20 = OpVariable %17 Function 204 OpStore %13 %15 205 OpStore %18 %19 206 OpStore %20 %19 207 OpBranch %21 208 %21 = OpLabel 209 OpLoopMerge %23 %24 None 210 OpBranch %25 211 %25 = OpLabel 212 %26 = OpLoad %16 %20 213 %29 = OpSLessThan %28 %26 %27 214 OpBranchConditional %29 %22 %23 215 %22 = OpLabel 216 %33 = OpAccessChain %32 %13 %31 217 %34 = OpLoad %6 %33 218 %35 = OpFAdd %6 %34 %14 219 %37 = OpFOrdGreaterThan %28 %35 %36 220 OpSelectionMerge %39 None 221 OpBranchConditional %37 %38 %39 222 %38 = OpLabel 223 OpBranch %23 224 %39 = OpLabel 225 %41 = OpAccessChain %32 %13 %31 226 OpStore %41 %14 227 %42 = OpLoad %16 %18 228 %44 = OpIAdd %16 %42 %43 229 OpStore %18 %44 230 OpBranch %24 231 %24 = OpLabel 232 %45 = OpLoad %16 %20 233 %46 = OpIAdd %16 %45 %43 234 OpStore %20 %46 235 OpBranch %21 236 %23 = OpLabel 237 %47 = OpLoad %16 %18 238 %49 = OpSLessThan %28 %47 %48 239 OpSelectionMerge %51 None 240 OpBranchConditional %49 %50 %55 241 %50 = OpLabel 242 OpReturnValue %53 243 %55 = OpLabel 244 OpReturnValue %56 245 %51 = OpLabel 246 OpUnreachable 247 OpFunctionEnd 248END 249 250 251BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 252 253PIPELINE graphics variant_pipeline 254 ATTACH variant_vertex_shader 255 ATTACH variant_fragment_shader 256 FRAMEBUFFER_SIZE 256 256 257 BIND BUFFER variant_framebuffer AS color LOCATION 0 258END 259CLEAR_COLOR variant_pipeline 0 0 0 255 260 261CLEAR variant_pipeline 262RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 263 264EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 265