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