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 bug found by GraphicsFuzz. 19 20# Short description: A shader that multiplies a vector by fragcoord 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# vec2 injectionSwitch; 36# }; 37# 38# // Returns 1. 39# float func() 40# { 41# vec4 value; 42# bool alwaysFalse = gl_FragCoord.x < -1.0; 43# 44# if (alwaysFalse) 45# { 46# vec2 a; 47# value.xy = a; 48# } 49# 50# if (!alwaysFalse) 51# { 52# value.xy = injectionSwitch.xy; // x == 0.0, y == 1.0 53# } 54# 55# //At this point all components of value are guaranteed to be initialized. 56# value.zw = gl_FragCoord.xy * value.xy * vec2(2) + value.xy; 57# 58# // Iterates twice. 59# for (int i = 0; i < int(injectionSwitch.y) + 1; i++) 60# { 61# value.x = float(i); 62# } 63# 64# // Always true. 65# if (value.x == 1.0 && value.y == 1.0) 66# return 1.0; 67# else 68# return 0.0; 69# } 70# 71# void main() 72# { 73# int count = 0; 74# 75# // Iterates twice. 76# for (int i = 0; i < int(injectionSwitch.y) + 1; i++) 77# { 78# count += int(func()); 79# } 80# 81# // Always true. 82# if (count == 2) 83# _GLF_color = vec4(1, 0, 0, 1); 84# else 85# _GLF_color = vec4(0, 0, 0, 1); 86# } 87SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 88; SPIR-V 89; Version: 1.0 90; Generator: Khronos Glslang Reference Front End; 8 91; Bound: 129 92; Schema: 0 93 OpCapability Shader 94 %1 = OpExtInstImport "GLSL.std.450" 95 OpMemoryModel Logical GLSL450 96 OpEntryPoint Fragment %4 "main" %15 %125 97 OpExecutionMode %4 OriginUpperLeft 98 OpSource ESSL 310 99 OpName %4 "main" 100 OpName %8 "func(" 101 OpName %12 "alwaysFalse" 102 OpName %15 "gl_FragCoord" 103 OpName %27 "value" 104 OpName %30 "a" 105 OpName %38 "buf0" 106 OpMemberName %38 0 "injectionSwitch" 107 OpName %40 "" 108 OpName %62 "i" 109 OpName %100 "count" 110 OpName %101 "i" 111 OpName %125 "_GLF_color" 112 OpDecorate %15 BuiltIn FragCoord 113 OpMemberDecorate %38 0 Offset 0 114 OpDecorate %38 Block 115 OpDecorate %40 DescriptorSet 0 116 OpDecorate %40 Binding 0 117 OpDecorate %125 Location 0 118 %2 = OpTypeVoid 119 %3 = OpTypeFunction %2 120 %6 = OpTypeFloat 32 121 %7 = OpTypeFunction %6 122 %10 = OpTypeBool 123 %11 = OpTypePointer Function %10 124 %13 = OpTypeVector %6 4 125 %14 = OpTypePointer Input %13 126 %15 = OpVariable %14 Input 127 %16 = OpTypeInt 32 0 128 %17 = OpConstant %16 0 129 %18 = OpTypePointer Input %6 130 %21 = OpConstant %6 -1 131 %26 = OpTypePointer Function %13 132 %28 = OpTypeVector %6 2 133 %29 = OpTypePointer Function %28 134 %38 = OpTypeStruct %28 135 %39 = OpTypePointer Uniform %38 136 %40 = OpVariable %39 Uniform 137 %41 = OpTypeInt 32 1 138 %42 = OpConstant %41 0 139 %43 = OpTypePointer Uniform %28 140 %53 = OpConstant %6 2 141 %54 = OpConstantComposite %28 %53 %53 142 %61 = OpTypePointer Function %41 143 %69 = OpConstant %16 1 144 %70 = OpTypePointer Uniform %6 145 %74 = OpConstant %41 1 146 %79 = OpTypePointer Function %6 147 %85 = OpConstant %6 1 148 %97 = OpConstant %6 0 149 %120 = OpConstant %41 2 150 %124 = OpTypePointer Output %13 151 %125 = OpVariable %124 Output 152 %126 = OpConstantComposite %13 %85 %97 %97 %85 153 %128 = OpConstantComposite %13 %97 %97 %97 %85 154 %4 = OpFunction %2 None %3 155 %5 = OpLabel 156 %100 = OpVariable %61 Function 157 %101 = OpVariable %61 Function 158 OpStore %100 %42 159 OpStore %101 %42 160 OpBranch %102 161 %102 = OpLabel 162 OpLoopMerge %104 %105 None 163 OpBranch %106 164 %106 = OpLabel 165 %107 = OpLoad %41 %101 166 %108 = OpAccessChain %70 %40 %42 %69 167 %109 = OpLoad %6 %108 168 %110 = OpConvertFToS %41 %109 169 %111 = OpIAdd %41 %110 %74 170 %112 = OpSLessThan %10 %107 %111 171 OpBranchConditional %112 %103 %104 172 %103 = OpLabel 173 %113 = OpFunctionCall %6 %8 174 %114 = OpConvertFToS %41 %113 175 %115 = OpLoad %41 %100 176 %116 = OpIAdd %41 %115 %114 177 OpStore %100 %116 178 OpBranch %105 179 %105 = OpLabel 180 %117 = OpLoad %41 %101 181 %118 = OpIAdd %41 %117 %74 182 OpStore %101 %118 183 OpBranch %102 184 %104 = OpLabel 185 %119 = OpLoad %41 %100 186 %121 = OpIEqual %10 %119 %120 187 OpSelectionMerge %123 None 188 OpBranchConditional %121 %122 %127 189 %122 = OpLabel 190 OpStore %125 %126 191 OpBranch %123 192 %127 = OpLabel 193 OpStore %125 %128 194 OpBranch %123 195 %123 = OpLabel 196 OpReturn 197 OpFunctionEnd 198 %8 = OpFunction %6 None %7 199 %9 = OpLabel 200 %12 = OpVariable %11 Function 201 %27 = OpVariable %26 Function 202 %30 = OpVariable %29 Function 203 %62 = OpVariable %61 Function 204 %19 = OpAccessChain %18 %15 %17 205 %20 = OpLoad %6 %19 206 %22 = OpFOrdLessThan %10 %20 %21 207 OpStore %12 %22 208 %23 = OpLoad %10 %12 209 OpSelectionMerge %25 None 210 OpBranchConditional %23 %24 %25 211 %24 = OpLabel 212 %31 = OpLoad %28 %30 213 %32 = OpLoad %13 %27 214 %33 = OpVectorShuffle %13 %32 %31 4 5 2 3 215 OpStore %27 %33 216 OpBranch %25 217 %25 = OpLabel 218 %34 = OpLoad %10 %12 219 %35 = OpLogicalNot %10 %34 220 OpSelectionMerge %37 None 221 OpBranchConditional %35 %36 %37 222 %36 = OpLabel 223 %44 = OpAccessChain %43 %40 %42 224 %45 = OpLoad %28 %44 225 %46 = OpLoad %13 %27 226 %47 = OpVectorShuffle %13 %46 %45 4 5 2 3 227 OpStore %27 %47 228 OpBranch %37 229 %37 = OpLabel 230 %48 = OpLoad %13 %15 231 %49 = OpVectorShuffle %28 %48 %48 0 1 232 %50 = OpLoad %13 %27 233 %51 = OpVectorShuffle %28 %50 %50 0 1 234 %52 = OpFMul %28 %49 %51 235 %55 = OpFMul %28 %52 %54 236 %56 = OpLoad %13 %27 237 %57 = OpVectorShuffle %28 %56 %56 0 1 238 %58 = OpFAdd %28 %55 %57 239 %59 = OpLoad %13 %27 240 %60 = OpVectorShuffle %13 %59 %58 0 1 4 5 241 OpStore %27 %60 242 OpStore %62 %42 243 OpBranch %63 244 %63 = OpLabel 245 OpLoopMerge %65 %66 None 246 OpBranch %67 247 %67 = OpLabel 248 %68 = OpLoad %41 %62 249 %71 = OpAccessChain %70 %40 %42 %69 250 %72 = OpLoad %6 %71 251 %73 = OpConvertFToS %41 %72 252 %75 = OpIAdd %41 %73 %74 253 %76 = OpSLessThan %10 %68 %75 254 OpBranchConditional %76 %64 %65 255 %64 = OpLabel 256 %77 = OpLoad %41 %62 257 %78 = OpConvertSToF %6 %77 258 %80 = OpAccessChain %79 %27 %17 259 OpStore %80 %78 260 OpBranch %66 261 %66 = OpLabel 262 %81 = OpLoad %41 %62 263 %82 = OpIAdd %41 %81 %74 264 OpStore %62 %82 265 OpBranch %63 266 %65 = OpLabel 267 %83 = OpAccessChain %79 %27 %17 268 %84 = OpLoad %6 %83 269 %86 = OpFOrdEqual %10 %84 %85 270 OpSelectionMerge %88 None 271 OpBranchConditional %86 %87 %88 272 %87 = OpLabel 273 %89 = OpAccessChain %79 %27 %69 274 %90 = OpLoad %6 %89 275 %91 = OpFOrdEqual %10 %90 %85 276 OpBranch %88 277 %88 = OpLabel 278 %92 = OpPhi %10 %86 %65 %91 %87 279 OpSelectionMerge %94 None 280 OpBranchConditional %92 %93 %96 281 %93 = OpLabel 282 OpReturnValue %85 283 %96 = OpLabel 284 OpReturnValue %97 285 %94 = OpLabel 286 OpUnreachable 287 OpFunctionEnd 288END 289 290# uniforms for variant 291 292# injectionSwitch 293BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA 294 0.0 1.0 295END 296 297BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 298 299PIPELINE graphics variant_pipeline 300 ATTACH variant_vertex_shader 301 ATTACH variant_fragment_shader 302 FRAMEBUFFER_SIZE 256 256 303 BIND BUFFER variant_framebuffer AS color LOCATION 0 304 BIND BUFFER variant_injectionSwitch 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 256 256 310 311EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 312