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