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