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