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 mem pass code path. 21 22# The test passes because shader always writes red. 23 24# Optimized using spirv-opt with the following arguments: 25# '--redundancy-elimination' 26# '--eliminate-dead-inserts' 27# '--private-to-local' 28# '--redundancy-elimination' 29# '--eliminate-local-multi-store' 30# '--if-conversion' 31# '--scalar-replacement=100' 32# '--combine-access-chains' 33# '--reduce-load-size' 34# '--eliminate-dead-branches' 35# '--merge-return' 36# '--eliminate-local-single-block' 37# '--if-conversion' 38# '--private-to-local' 39# '--eliminate-dead-inserts' 40# '--copy-propagate-arrays' 41# '--inline-entry-points-exhaustive' 42# '--copy-propagate-arrays' 43# '--convert-local-access-chains' 44# spirv-opt commit hash: 9215c1b7df0029f27807e8c8d7ec80532ce90a87 45 46 47 48SHADER vertex variant_vertex_shader PASSTHROUGH 49 50# variant_fragment_shader is derived from the following GLSL: 51# #version 310 es 52# precision highp float; 53# precision highp int; 54# 55# layout(location = 0) out vec4 _GLF_color; 56# layout(set = 0, binding = 0) uniform buf0 57# { 58# int one; 59# }; 60# 61# struct S 62# { 63# int a; 64# int b; 65# int c; 66# }; 67# 68# int func(S s, int x) 69# { 70# s.a = x; 71# 72# // Always false. 73# if(s.a == 2) 74# s.a = 9; 75# 76# s.b = x + 1; 77# s.c = x + 2; 78# 79# // Always false. 80# if(s.b == 2) 81# s.b = 7; 82# 83# return s.a + s.b + s.c; 84# } 85# 86# void main() 87# { 88# S arr[2]; 89# arr[one].a = 2; 90# 91# // Always false. 92# if(arr[1].a < 1) 93# { 94# _GLF_color = vec4(0); 95# return; 96# } 97# else 98# { 99# if (func(arr[1], 2 + one) == 12) 100# _GLF_color = vec4(1, 0, 0, 1); 101# else 102# _GLF_color = vec4(0); 103# } 104# } 105SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 106; SPIR-V 107; Version: 1.0 108; Generator: Khronos Glslang Reference Front End; 8 109; Bound: 136 110; Schema: 0 111 OpCapability Shader 112 %1 = OpExtInstImport "GLSL.std.450" 113 OpMemoryModel Logical GLSL450 114 OpEntryPoint Fragment %4 "main" %71 115 OpExecutionMode %4 OriginUpperLeft 116 OpSource ESSL 310 117 OpName %4 "main" 118 OpName %7 "S" 119 OpMemberName %7 0 "a" 120 OpMemberName %7 1 "b" 121 OpMemberName %7 2 "c" 122 OpName %13 "func(struct-S-i1-i1-i11;i1;" 123 OpName %11 "s" 124 OpName %12 "x" 125 OpName %55 "arr" 126 OpName %56 "buf0" 127 OpMemberName %56 0 "one" 128 OpName %58 "" 129 OpName %71 "_GLF_color" 130 OpName %79 "param" 131 OpName %82 "param" 132 OpMemberDecorate %56 0 Offset 0 133 OpDecorate %56 Block 134 OpDecorate %58 DescriptorSet 0 135 OpDecorate %58 Binding 0 136 OpDecorate %71 Location 0 137 %2 = OpTypeVoid 138 %3 = OpTypeFunction %2 139 %6 = OpTypeInt 32 1 140 %7 = OpTypeStruct %6 %6 %6 141 %8 = OpTypePointer Function %7 142 %9 = OpTypePointer Function %6 143 %10 = OpTypeFunction %6 %8 %9 144 %15 = OpConstant %6 0 145 %20 = OpConstant %6 2 146 %21 = OpTypeBool 147 %25 = OpConstant %6 9 148 %27 = OpConstant %6 1 149 %39 = OpConstant %6 7 150 %51 = OpTypeInt 32 0 151 %52 = OpConstant %51 2 152 %53 = OpTypeArray %7 %52 153 %54 = OpTypePointer Function %53 154 %56 = OpTypeStruct %6 155 %57 = OpTypePointer Uniform %56 156 %58 = OpVariable %57 Uniform 157 %59 = OpTypePointer Uniform %6 158 %68 = OpTypeFloat 32 159 %69 = OpTypeVector %68 4 160 %70 = OpTypePointer Output %69 161 %71 = OpVariable %70 Output 162 %72 = OpConstant %68 0 163 %73 = OpConstantComposite %69 %72 %72 %72 %72 164 %84 = OpConstant %6 12 165 %88 = OpConstant %68 1 166 %89 = OpConstantComposite %69 %88 %72 %72 %88 167 %95 = OpConstantFalse %21 168 %96 = OpTypePointer Function %21 169 %98 = OpConstantTrue %21 170 %4 = OpFunction %2 None %3 171 %5 = OpLabel 172 %99 = OpVariable %9 Function 173 %97 = OpVariable %96 Function %95 174 %55 = OpVariable %54 Function 175 %79 = OpVariable %8 Function 176 %82 = OpVariable %9 Function 177 OpBranch %92 178 %92 = OpLabel 179 OpLoopMerge %91 %94 None 180 OpBranch %93 181 %93 = OpLabel 182 %60 = OpAccessChain %59 %58 %15 183 %61 = OpLoad %6 %60 184 %62 = OpAccessChain %9 %55 %61 %15 185 OpStore %62 %20 186 %63 = OpAccessChain %9 %55 %27 %15 187 %64 = OpLoad %6 %63 188 %65 = OpSLessThan %21 %64 %27 189 OpSelectionMerge %67 None 190 OpBranchConditional %65 %66 %75 191 %66 = OpLabel 192 OpStore %71 %73 193 OpStore %97 %98 194 OpBranch %91 195 %75 = OpLabel 196 %78 = OpIAdd %6 %20 %61 197 %80 = OpAccessChain %8 %55 %27 198 %81 = OpLoad %7 %80 199 OpStore %79 %81 200 OpStore %82 %78 201 %100 = OpLoad %6 %82 202 %101 = OpAccessChain %9 %79 %15 203 %121 = OpLoad %7 %79 204 %122 = OpCompositeInsert %7 %100 %121 0 205 OpStore %79 %122 206 %123 = OpLoad %7 %79 207 %102 = OpCompositeExtract %6 %123 0 208 %103 = OpIEqual %21 %102 %20 209 OpSelectionMerge %104 None 210 OpBranchConditional %103 %105 %104 211 %105 = OpLabel 212 %124 = OpLoad %7 %79 213 %125 = OpCompositeInsert %7 %25 %124 0 214 OpStore %79 %125 215 OpBranch %104 216 %104 = OpLabel 217 %106 = OpLoad %6 %82 218 %107 = OpIAdd %6 %106 %27 219 %108 = OpAccessChain %9 %79 %27 220 %126 = OpLoad %7 %79 221 %127 = OpCompositeInsert %7 %107 %126 1 222 OpStore %79 %127 223 %109 = OpLoad %6 %82 224 %110 = OpIAdd %6 %109 %20 225 %111 = OpAccessChain %9 %79 %20 226 %128 = OpLoad %7 %79 227 %129 = OpCompositeInsert %7 %110 %128 2 228 OpStore %79 %129 229 %130 = OpLoad %7 %79 230 %112 = OpCompositeExtract %6 %130 1 231 %113 = OpIEqual %21 %112 %20 232 OpSelectionMerge %114 None 233 OpBranchConditional %113 %115 %114 234 %115 = OpLabel 235 %131 = OpLoad %7 %79 236 %132 = OpCompositeInsert %7 %39 %131 1 237 OpStore %79 %132 238 OpBranch %114 239 %114 = OpLabel 240 %133 = OpLoad %7 %79 241 %116 = OpCompositeExtract %6 %133 0 242 %134 = OpLoad %7 %79 243 %117 = OpCompositeExtract %6 %134 1 244 %118 = OpIAdd %6 %116 %117 245 %135 = OpLoad %7 %79 246 %119 = OpCompositeExtract %6 %135 2 247 %120 = OpIAdd %6 %118 %119 248 OpStore %99 %120 249 %83 = OpLoad %6 %99 250 %85 = OpIEqual %21 %83 %84 251 OpSelectionMerge %87 None 252 OpBranchConditional %85 %86 %90 253 %86 = OpLabel 254 OpStore %71 %89 255 OpBranch %87 256 %90 = OpLabel 257 OpStore %71 %73 258 OpBranch %87 259 %87 = OpLabel 260 OpBranch %67 261 %67 = OpLabel 262 OpStore %97 %98 263 OpBranch %91 264 %94 = OpLabel 265 OpBranch %92 266 %91 = OpLabel 267 OpReturn 268 OpFunctionEnd 269 %13 = OpFunction %6 None %10 270 %11 = OpFunctionParameter %8 271 %12 = OpFunctionParameter %9 272 %14 = OpLabel 273 %16 = OpLoad %6 %12 274 %17 = OpAccessChain %9 %11 %15 275 OpStore %17 %16 276 %19 = OpLoad %6 %17 277 %22 = OpIEqual %21 %19 %20 278 OpSelectionMerge %24 None 279 OpBranchConditional %22 %23 %24 280 %23 = OpLabel 281 OpStore %17 %25 282 OpBranch %24 283 %24 = OpLabel 284 %28 = OpLoad %6 %12 285 %29 = OpIAdd %6 %28 %27 286 %30 = OpAccessChain %9 %11 %27 287 OpStore %30 %29 288 %31 = OpLoad %6 %12 289 %32 = OpIAdd %6 %31 %20 290 %33 = OpAccessChain %9 %11 %20 291 OpStore %33 %32 292 %35 = OpLoad %6 %30 293 %36 = OpIEqual %21 %35 %20 294 OpSelectionMerge %38 None 295 OpBranchConditional %36 %37 %38 296 %37 = OpLabel 297 OpStore %30 %39 298 OpBranch %38 299 %38 = OpLabel 300 %42 = OpLoad %6 %17 301 %44 = OpLoad %6 %30 302 %45 = OpIAdd %6 %42 %44 303 %47 = OpLoad %6 %33 304 %48 = OpIAdd %6 %45 %47 305 OpReturnValue %48 306 OpFunctionEnd 307END 308 309# uniforms for variant 310 311# one 312BUFFER variant_one DATA_TYPE int32 DATA 313 1 314END 315 316BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 317 318PIPELINE graphics variant_pipeline 319 ATTACH variant_vertex_shader 320 ATTACH variant_fragment_shader 321 FRAMEBUFFER_SIZE 256 256 322 BIND BUFFER variant_framebuffer AS color LOCATION 0 323 BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 0 324END 325CLEAR_COLOR variant_pipeline 0 0 0 255 326 327CLEAR variant_pipeline 328RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 329 330EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 331