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