1#!amber 2 3# Copyright 2019 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 fragment shader with a loop, dead if, and a loop 21 22# The test passes because the fragment shader contains two loops that do nothing (the if is never 23# entered) and finishes by writing red. 24 25SHADER vertex variant_vertex_shader PASSTHROUGH 26 27# variant_fragment_shader is derived from the following GLSL: 28# #version 310 es 29# precision highp float; 30# 31# layout(set = 0, binding = 0) uniform buf0 32# { 33# vec2 injectionSwitch; 34# }; 35# layout(location = 0) out vec4 _GLF_color; 36# 37# void main() 38# { 39# for ( 40# int k = 0; 41# k < 4; 42# k++) 43# { 44# 45# if (0.0 > injectionSwitch.y) // always false 46# { 47# int donor_replacementGLF_dead0stack[10]; 48# int donor_replacementGLF_dead0top; 49# for ( 50# int GLF_dead0j = 1; 51# 1 <= donor_replacementGLF_dead0stack[0]; 52# 1) 53# { 54# } 55# donor_replacementGLF_dead0stack[donor_replacementGLF_dead0top >= 0 && donor_replacementGLF_dead0top < 9 ? ++donor_replacementGLF_dead0top : 0] = 1; 56# } 57# 58# vec4 matrix_b = vec4(0.0); 59# for ( 60# int b = 3; 61# b >= 0; 62# b--) 63# { 64# matrix_b[b] = matrix_b[b] - 1.0; 65# } 66# } 67# _GLF_color = vec4(1.0, 0.0, 0.0, 1.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; 7 73; Bound: 90 74; Schema: 0 75 OpCapability Shader 76 %1 = OpExtInstImport "GLSL.std.450" 77 OpMemoryModel Logical GLSL450 78 OpEntryPoint Fragment %4 "main" %88 79 OpExecutionMode %4 OriginUpperLeft 80 OpSource ESSL 310 81 OpName %4 "main" 82 OpName %8 "k" 83 OpName %22 "buf0" 84 OpMemberName %22 0 "injectionSwitch" 85 OpName %24 "" 86 OpName %33 "GLF_dead0j" 87 OpName %43 "donor_replacementGLF_dead0stack" 88 OpName %47 "donor_replacementGLF_dead0top" 89 OpName %64 "matrix_b" 90 OpName %66 "b" 91 OpName %88 "_GLF_color" 92 OpDecorate %8 RelaxedPrecision 93 OpDecorate %15 RelaxedPrecision 94 OpMemberDecorate %22 0 Offset 0 95 OpDecorate %22 Block 96 OpDecorate %24 DescriptorSet 0 97 OpDecorate %24 Binding 0 98 OpDecorate %33 RelaxedPrecision 99 OpDecorate %43 RelaxedPrecision 100 OpDecorate %45 RelaxedPrecision 101 OpDecorate %47 RelaxedPrecision 102 OpDecorate %48 RelaxedPrecision 103 OpDecorate %50 RelaxedPrecision 104 OpDecorate %57 RelaxedPrecision 105 OpDecorate %58 RelaxedPrecision 106 OpDecorate %60 RelaxedPrecision 107 OpDecorate %66 RelaxedPrecision 108 OpDecorate %73 RelaxedPrecision 109 OpDecorate %75 RelaxedPrecision 110 OpDecorate %76 RelaxedPrecision 111 OpDecorate %83 RelaxedPrecision 112 OpDecorate %84 RelaxedPrecision 113 OpDecorate %85 RelaxedPrecision 114 OpDecorate %86 RelaxedPrecision 115 OpDecorate %88 Location 0 116 %2 = OpTypeVoid 117 %3 = OpTypeFunction %2 118 %6 = OpTypeInt 32 1 119 %7 = OpTypePointer Function %6 120 %9 = OpConstant %6 0 121 %16 = OpConstant %6 4 122 %17 = OpTypeBool 123 %19 = OpTypeFloat 32 124 %20 = OpConstant %19 0 125 %21 = OpTypeVector %19 2 126 %22 = OpTypeStruct %21 127 %23 = OpTypePointer Uniform %22 128 %24 = OpVariable %23 Uniform 129 %25 = OpTypeInt 32 0 130 %26 = OpConstant %25 1 131 %27 = OpTypePointer Uniform %19 132 %34 = OpConstant %6 1 133 %40 = OpConstant %25 10 134 %41 = OpTypeArray %6 %40 135 %42 = OpTypePointer Function %41 136 %51 = OpConstant %6 9 137 %62 = OpTypeVector %19 4 138 %63 = OpTypePointer Function %62 139 %65 = OpConstantComposite %62 %20 %20 %20 %20 140 %67 = OpConstant %6 3 141 %77 = OpTypePointer Function %19 142 %80 = OpConstant %19 1 143 %87 = OpTypePointer Output %62 144 %88 = OpVariable %87 Output 145 %89 = OpConstantComposite %62 %80 %20 %20 %80 146 %4 = OpFunction %2 None %3 147 %5 = OpLabel 148 %8 = OpVariable %7 Function 149 %33 = OpVariable %7 Function 150 %43 = OpVariable %42 Function 151 %47 = OpVariable %7 Function 152 %54 = OpVariable %7 Function 153 %64 = OpVariable %63 Function 154 %66 = OpVariable %7 Function 155 OpStore %8 %9 156 OpBranch %10 157 %10 = OpLabel 158 OpLoopMerge %12 %13 None 159 OpBranch %14 160 %14 = OpLabel 161 %15 = OpLoad %6 %8 162 %18 = OpSLessThan %17 %15 %16 163 OpBranchConditional %18 %11 %12 164 %11 = OpLabel 165 %28 = OpAccessChain %27 %24 %9 %26 166 %29 = OpLoad %19 %28 167 %30 = OpFOrdGreaterThan %17 %20 %29 168 OpSelectionMerge %32 None 169 OpBranchConditional %30 %31 %32 170 %31 = OpLabel 171 OpStore %33 %34 172 OpBranch %35 173 %35 = OpLabel 174 OpLoopMerge %37 %38 None 175 OpBranch %39 176 %39 = OpLabel 177 %44 = OpAccessChain %7 %43 %9 178 %45 = OpLoad %6 %44 179 %46 = OpSLessThanEqual %17 %34 %45 180 OpBranchConditional %46 %36 %37 181 %36 = OpLabel 182 OpBranch %38 183 %38 = OpLabel 184 OpBranch %35 185 %37 = OpLabel 186 %48 = OpLoad %6 %47 187 %49 = OpSGreaterThanEqual %17 %48 %9 188 %50 = OpLoad %6 %47 189 %52 = OpSLessThan %17 %50 %51 190 %53 = OpLogicalAnd %17 %49 %52 191 OpSelectionMerge %56 None 192 OpBranchConditional %53 %55 %59 193 %55 = OpLabel 194 %57 = OpLoad %6 %47 195 %58 = OpIAdd %6 %57 %34 196 OpStore %47 %58 197 OpStore %54 %58 198 OpBranch %56 199 %59 = OpLabel 200 OpStore %54 %9 201 OpBranch %56 202 %56 = OpLabel 203 %60 = OpLoad %6 %54 204 %61 = OpAccessChain %7 %43 %60 205 OpStore %61 %34 206 OpBranch %32 207 %32 = OpLabel 208 OpStore %64 %65 209 OpStore %66 %67 210 OpBranch %68 211 %68 = OpLabel 212 OpLoopMerge %70 %71 None 213 OpBranch %72 214 %72 = OpLabel 215 %73 = OpLoad %6 %66 216 %74 = OpSGreaterThanEqual %17 %73 %9 217 OpBranchConditional %74 %69 %70 218 %69 = OpLabel 219 %75 = OpLoad %6 %66 220 %76 = OpLoad %6 %66 221 %78 = OpAccessChain %77 %64 %76 222 %79 = OpLoad %19 %78 223 %81 = OpFSub %19 %79 %80 224 %82 = OpAccessChain %77 %64 %75 225 OpStore %82 %81 226 OpBranch %71 227 %71 = OpLabel 228 %83 = OpLoad %6 %66 229 %84 = OpISub %6 %83 %34 230 OpStore %66 %84 231 OpBranch %68 232 %70 = OpLabel 233 OpBranch %13 234 %13 = OpLabel 235 %85 = OpLoad %6 %8 236 %86 = OpIAdd %6 %85 %34 237 OpStore %8 %86 238 OpBranch %10 239 %12 = OpLabel 240 OpStore %88 %89 241 OpReturn 242 OpFunctionEnd 243END 244 245# uniforms for variant 246 247# injectionSwitch 248BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA 249 0.0 1.0 250END 251 252BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 253 254PIPELINE graphics variant_pipeline 255 ATTACH variant_vertex_shader 256 ATTACH variant_fragment_shader 257 FRAMEBUFFER_SIZE 256 256 258 BIND BUFFER variant_framebuffer AS color LOCATION 0 259 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0 260END 261CLEAR_COLOR variant_pipeline 0 0 0 255 262 263CLEAR variant_pipeline 264RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 265 266EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 267