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