1e5c31af7Sopenharmony_ci#!amber 2e5c31af7Sopenharmony_ci 3e5c31af7Sopenharmony_ci# Copyright 2022 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 the GraphicsFuzz project. 19e5c31af7Sopenharmony_ci 20e5c31af7Sopenharmony_ci# Short description: A fragment shader that covers specific LLVM code paths 21e5c31af7Sopenharmony_ci 22e5c31af7Sopenharmony_ci# The test passes because the shader always writes red. 23e5c31af7Sopenharmony_ci 24e5c31af7Sopenharmony_ci# Optimized using spirv-opt with the following arguments: 25e5c31af7Sopenharmony_ci# '-O' 26e5c31af7Sopenharmony_ci# spirv-opt commit hash: a0370efd589be33d5d9a85cfde2f85841b3755af 27e5c31af7Sopenharmony_ci 28e5c31af7Sopenharmony_ci 29e5c31af7Sopenharmony_ci 30e5c31af7Sopenharmony_ciSHADER vertex variant_vertex_shader PASSTHROUGH 31e5c31af7Sopenharmony_ci 32e5c31af7Sopenharmony_ci# variant_fragment_shader is derived from the following GLSL: 33e5c31af7Sopenharmony_ci# #version 320 es 34e5c31af7Sopenharmony_ci# 35e5c31af7Sopenharmony_ci# #define _int_8 _GLF_uniform_int_values[0] 36e5c31af7Sopenharmony_ci# #define _int_2 _GLF_uniform_int_values[1] 37e5c31af7Sopenharmony_ci# #define _int_0 _GLF_uniform_int_values[2] 38e5c31af7Sopenharmony_ci# #define _int_1 _GLF_uniform_int_values[3] 39e5c31af7Sopenharmony_ci# #define _int_3 _GLF_uniform_int_values[4] 40e5c31af7Sopenharmony_ci# #define _float_0_0 _GLF_uniform_float_values[0] 41e5c31af7Sopenharmony_ci# #define _float_2_0 _GLF_uniform_float_values[1] 42e5c31af7Sopenharmony_ci# 43e5c31af7Sopenharmony_ci# precision highp float; 44e5c31af7Sopenharmony_ci# precision highp int; 45e5c31af7Sopenharmony_ci# 46e5c31af7Sopenharmony_ci# // Contents of _GLF_uniform_int_values: [8, 2, 0, 1, 3] 47e5c31af7Sopenharmony_ci# layout(set = 0, binding = 0) uniform buf0 48e5c31af7Sopenharmony_ci# { 49e5c31af7Sopenharmony_ci# int _GLF_uniform_int_values[5]; 50e5c31af7Sopenharmony_ci# }; 51e5c31af7Sopenharmony_ci# 52e5c31af7Sopenharmony_ci# // Contents of _GLF_uniform_float_values: [0.0, 2.0] 53e5c31af7Sopenharmony_ci# layout(set = 0, binding = 1) uniform buf1 54e5c31af7Sopenharmony_ci# { 55e5c31af7Sopenharmony_ci# float _GLF_uniform_float_values[2]; 56e5c31af7Sopenharmony_ci# }; 57e5c31af7Sopenharmony_ci# 58e5c31af7Sopenharmony_ci# // Contents of injectionSwitch: [0.0, 1.0] 59e5c31af7Sopenharmony_ci# layout(set = 0, binding = 2) uniform buf2 60e5c31af7Sopenharmony_ci# { 61e5c31af7Sopenharmony_ci# highp vec2 injectionSwitch; 62e5c31af7Sopenharmony_ci# }; 63e5c31af7Sopenharmony_ci# 64e5c31af7Sopenharmony_ci# layout(location = 0) out vec4 _GLF_color; 65e5c31af7Sopenharmony_ci# 66e5c31af7Sopenharmony_ci# // Returns true if v.y >= 2.0. 67e5c31af7Sopenharmony_ci# bool func0(vec4 v) 68e5c31af7Sopenharmony_ci# { 69e5c31af7Sopenharmony_ci# // Always false. 70e5c31af7Sopenharmony_ci# while(injectionSwitch.x < _float_0_0) 71e5c31af7Sopenharmony_ci# { 72e5c31af7Sopenharmony_ci# return false; 73e5c31af7Sopenharmony_ci# } 74e5c31af7Sopenharmony_ci# 75e5c31af7Sopenharmony_ci# if(v.y < _float_2_0) 76e5c31af7Sopenharmony_ci# { 77e5c31af7Sopenharmony_ci# return false; 78e5c31af7Sopenharmony_ci# } 79e5c31af7Sopenharmony_ci# 80e5c31af7Sopenharmony_ci# return true; 81e5c31af7Sopenharmony_ci# } 82e5c31af7Sopenharmony_ci# 83e5c31af7Sopenharmony_ci# // Returns 2. 84e5c31af7Sopenharmony_ci# int func1() 85e5c31af7Sopenharmony_ci# { 86e5c31af7Sopenharmony_ci# int a = _int_0; 87e5c31af7Sopenharmony_ci# 88e5c31af7Sopenharmony_ci# // Iterates seven times. 89e5c31af7Sopenharmony_ci# for(int i = _int_1; i < _int_8; i++) 90e5c31af7Sopenharmony_ci# { 91e5c31af7Sopenharmony_ci# if(func0(vec4[8](vec4(_int_1), vec4(_int_1), vec4(_int_3), vec4(_int_1), vec4(_int_1), vec4(_int_1), vec4(_int_1), vec4(_int_1))[i])) 92e5c31af7Sopenharmony_ci# { 93e5c31af7Sopenharmony_ci# a = i; 94e5c31af7Sopenharmony_ci# } 95e5c31af7Sopenharmony_ci# } 96e5c31af7Sopenharmony_ci# 97e5c31af7Sopenharmony_ci# return a; 98e5c31af7Sopenharmony_ci# } 99e5c31af7Sopenharmony_ci# 100e5c31af7Sopenharmony_ci# void main() 101e5c31af7Sopenharmony_ci# { 102e5c31af7Sopenharmony_ci# // Always true. 103e5c31af7Sopenharmony_ci# if(func1() == _int_2) 104e5c31af7Sopenharmony_ci# { 105e5c31af7Sopenharmony_ci# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1); 106e5c31af7Sopenharmony_ci# } 107e5c31af7Sopenharmony_ci# else 108e5c31af7Sopenharmony_ci# { 109e5c31af7Sopenharmony_ci# _GLF_color = vec4(_int_0); 110e5c31af7Sopenharmony_ci# } 111e5c31af7Sopenharmony_ci# } 112e5c31af7Sopenharmony_ciSHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 113e5c31af7Sopenharmony_ci; SPIR-V 114e5c31af7Sopenharmony_ci; Version: 1.0 115e5c31af7Sopenharmony_ci; Generator: Khronos Glslang Reference Front End; 10 116e5c31af7Sopenharmony_ci; Bound: 275 117e5c31af7Sopenharmony_ci; Schema: 0 118e5c31af7Sopenharmony_ci OpCapability Shader 119e5c31af7Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 120e5c31af7Sopenharmony_ci OpMemoryModel Logical GLSL450 121e5c31af7Sopenharmony_ci OpEntryPoint Fragment %4 "main" %139 122e5c31af7Sopenharmony_ci OpExecutionMode %4 OriginUpperLeft 123e5c31af7Sopenharmony_ci OpSource ESSL 320 124e5c31af7Sopenharmony_ci OpName %4 "main" 125e5c31af7Sopenharmony_ci OpName %24 "buf2" 126e5c31af7Sopenharmony_ci OpMemberName %24 0 "injectionSwitch" 127e5c31af7Sopenharmony_ci OpName %26 "" 128e5c31af7Sopenharmony_ci OpName %35 "buf1" 129e5c31af7Sopenharmony_ci OpMemberName %35 0 "_GLF_uniform_float_values" 130e5c31af7Sopenharmony_ci OpName %37 "" 131e5c31af7Sopenharmony_ci OpName %61 "buf0" 132e5c31af7Sopenharmony_ci OpMemberName %61 0 "_GLF_uniform_int_values" 133e5c31af7Sopenharmony_ci OpName %63 "" 134e5c31af7Sopenharmony_ci OpName %139 "_GLF_color" 135e5c31af7Sopenharmony_ci OpMemberDecorate %24 0 Offset 0 136e5c31af7Sopenharmony_ci OpDecorate %24 Block 137e5c31af7Sopenharmony_ci OpDecorate %26 DescriptorSet 0 138e5c31af7Sopenharmony_ci OpDecorate %26 Binding 2 139e5c31af7Sopenharmony_ci OpDecorate %34 ArrayStride 16 140e5c31af7Sopenharmony_ci OpMemberDecorate %35 0 Offset 0 141e5c31af7Sopenharmony_ci OpDecorate %35 Block 142e5c31af7Sopenharmony_ci OpDecorate %37 DescriptorSet 0 143e5c31af7Sopenharmony_ci OpDecorate %37 Binding 1 144e5c31af7Sopenharmony_ci OpDecorate %60 ArrayStride 16 145e5c31af7Sopenharmony_ci OpMemberDecorate %61 0 Offset 0 146e5c31af7Sopenharmony_ci OpDecorate %61 Block 147e5c31af7Sopenharmony_ci OpDecorate %63 DescriptorSet 0 148e5c31af7Sopenharmony_ci OpDecorate %63 Binding 0 149e5c31af7Sopenharmony_ci OpDecorate %139 Location 0 150e5c31af7Sopenharmony_ci %2 = OpTypeVoid 151e5c31af7Sopenharmony_ci %3 = OpTypeFunction %2 152e5c31af7Sopenharmony_ci %6 = OpTypeFloat 32 153e5c31af7Sopenharmony_ci %7 = OpTypeVector %6 4 154e5c31af7Sopenharmony_ci %8 = OpTypePointer Function %7 155e5c31af7Sopenharmony_ci %9 = OpTypeBool 156e5c31af7Sopenharmony_ci %14 = OpTypeInt 32 1 157e5c31af7Sopenharmony_ci %23 = OpTypeVector %6 2 158e5c31af7Sopenharmony_ci %24 = OpTypeStruct %23 159e5c31af7Sopenharmony_ci %25 = OpTypePointer Uniform %24 160e5c31af7Sopenharmony_ci %26 = OpVariable %25 Uniform 161e5c31af7Sopenharmony_ci %27 = OpConstant %14 0 162e5c31af7Sopenharmony_ci %28 = OpTypeInt 32 0 163e5c31af7Sopenharmony_ci %29 = OpConstant %28 0 164e5c31af7Sopenharmony_ci %30 = OpTypePointer Uniform %6 165e5c31af7Sopenharmony_ci %33 = OpConstant %28 2 166e5c31af7Sopenharmony_ci %34 = OpTypeArray %6 %33 167e5c31af7Sopenharmony_ci %35 = OpTypeStruct %34 168e5c31af7Sopenharmony_ci %36 = OpTypePointer Uniform %35 169e5c31af7Sopenharmony_ci %37 = OpVariable %36 Uniform 170e5c31af7Sopenharmony_ci %41 = OpConstantFalse %9 171e5c31af7Sopenharmony_ci %47 = OpConstant %14 1 172e5c31af7Sopenharmony_ci %54 = OpConstantTrue %9 173e5c31af7Sopenharmony_ci %59 = OpConstant %28 5 174e5c31af7Sopenharmony_ci %60 = OpTypeArray %14 %59 175e5c31af7Sopenharmony_ci %61 = OpTypeStruct %60 176e5c31af7Sopenharmony_ci %62 = OpTypePointer Uniform %61 177e5c31af7Sopenharmony_ci %63 = OpVariable %62 Uniform 178e5c31af7Sopenharmony_ci %64 = OpConstant %14 2 179e5c31af7Sopenharmony_ci %65 = OpTypePointer Uniform %14 180e5c31af7Sopenharmony_ci %69 = OpConstant %14 3 181e5c31af7Sopenharmony_ci %89 = OpConstant %14 4 182e5c31af7Sopenharmony_ci %114 = OpConstant %28 8 183e5c31af7Sopenharmony_ci %115 = OpTypeArray %7 %114 184e5c31af7Sopenharmony_ci %119 = OpTypePointer Function %115 185e5c31af7Sopenharmony_ci %138 = OpTypePointer Output %7 186e5c31af7Sopenharmony_ci %139 = OpVariable %138 Output 187e5c31af7Sopenharmony_ci %263 = OpUndef %9 188e5c31af7Sopenharmony_ci %4 = OpFunction %2 None %3 189e5c31af7Sopenharmony_ci %5 = OpLabel 190e5c31af7Sopenharmony_ci %169 = OpVariable %119 Function 191e5c31af7Sopenharmony_ci %172 = OpAccessChain %65 %63 %27 %64 192e5c31af7Sopenharmony_ci %173 = OpLoad %14 %172 193e5c31af7Sopenharmony_ci %174 = OpAccessChain %65 %63 %27 %69 194e5c31af7Sopenharmony_ci %175 = OpLoad %14 %174 195e5c31af7Sopenharmony_ci OpBranch %176 196e5c31af7Sopenharmony_ci %176 = OpLabel 197e5c31af7Sopenharmony_ci %262 = OpPhi %9 %263 %5 %259 %223 198e5c31af7Sopenharmony_ci %256 = OpPhi %14 %173 %5 %274 %223 199e5c31af7Sopenharmony_ci %255 = OpPhi %14 %175 %5 %225 %223 200e5c31af7Sopenharmony_ci %179 = OpAccessChain %65 %63 %27 %27 201e5c31af7Sopenharmony_ci %180 = OpLoad %14 %179 202e5c31af7Sopenharmony_ci %181 = OpSLessThan %9 %255 %180 203e5c31af7Sopenharmony_ci OpLoopMerge %226 %223 None 204e5c31af7Sopenharmony_ci OpBranchConditional %181 %182 %226 205e5c31af7Sopenharmony_ci %182 = OpLabel 206e5c31af7Sopenharmony_ci %185 = OpConvertSToF %6 %175 207e5c31af7Sopenharmony_ci %186 = OpCompositeConstruct %7 %185 %185 %185 %185 208e5c31af7Sopenharmony_ci %191 = OpAccessChain %65 %63 %27 %89 209e5c31af7Sopenharmony_ci %192 = OpLoad %14 %191 210e5c31af7Sopenharmony_ci %193 = OpConvertSToF %6 %192 211e5c31af7Sopenharmony_ci %194 = OpCompositeConstruct %7 %193 %193 %193 %193 212e5c31af7Sopenharmony_ci %215 = OpCompositeConstruct %115 %186 %186 %194 %186 %186 %186 %186 %186 213e5c31af7Sopenharmony_ci OpStore %169 %215 214e5c31af7Sopenharmony_ci %217 = OpAccessChain %8 %169 %255 215e5c31af7Sopenharmony_ci %218 = OpLoad %7 %217 216e5c31af7Sopenharmony_ci OpSelectionMerge %252 None 217e5c31af7Sopenharmony_ci OpSwitch %29 %232 218e5c31af7Sopenharmony_ci %232 = OpLabel 219e5c31af7Sopenharmony_ci OpBranch %233 220e5c31af7Sopenharmony_ci %233 = OpLabel 221e5c31af7Sopenharmony_ci %235 = OpAccessChain %30 %26 %27 %29 222e5c31af7Sopenharmony_ci %236 = OpLoad %6 %235 223e5c31af7Sopenharmony_ci %237 = OpAccessChain %30 %37 %27 %27 224e5c31af7Sopenharmony_ci %238 = OpLoad %6 %237 225e5c31af7Sopenharmony_ci %239 = OpFOrdLessThan %9 %236 %238 226e5c31af7Sopenharmony_ci OpLoopMerge %242 %241 None 227e5c31af7Sopenharmony_ci OpBranchConditional %239 %240 %242 228e5c31af7Sopenharmony_ci %240 = OpLabel 229e5c31af7Sopenharmony_ci OpBranch %242 230e5c31af7Sopenharmony_ci %241 = OpLabel 231e5c31af7Sopenharmony_ci OpBranch %233 232e5c31af7Sopenharmony_ci %242 = OpLabel 233e5c31af7Sopenharmony_ci %260 = OpPhi %9 %262 %233 %41 %240 234e5c31af7Sopenharmony_ci %257 = OpPhi %9 %41 %233 %54 %240 235e5c31af7Sopenharmony_ci OpSelectionMerge %244 None 236e5c31af7Sopenharmony_ci OpBranchConditional %257 %252 %244 237e5c31af7Sopenharmony_ci %244 = OpLabel 238e5c31af7Sopenharmony_ci %246 = OpCompositeExtract %6 %218 1 239e5c31af7Sopenharmony_ci %247 = OpAccessChain %30 %37 %27 %47 240e5c31af7Sopenharmony_ci %248 = OpLoad %6 %247 241e5c31af7Sopenharmony_ci %249 = OpFOrdLessThan %9 %246 %248 242e5c31af7Sopenharmony_ci OpSelectionMerge %251 None 243e5c31af7Sopenharmony_ci OpBranchConditional %249 %250 %251 244e5c31af7Sopenharmony_ci %250 = OpLabel 245e5c31af7Sopenharmony_ci OpBranch %252 246e5c31af7Sopenharmony_ci %251 = OpLabel 247e5c31af7Sopenharmony_ci OpBranch %252 248e5c31af7Sopenharmony_ci %252 = OpLabel 249e5c31af7Sopenharmony_ci %259 = OpPhi %9 %260 %242 %41 %250 %54 %251 250e5c31af7Sopenharmony_ci %274 = OpSelect %14 %259 %255 %256 251e5c31af7Sopenharmony_ci OpBranch %223 252e5c31af7Sopenharmony_ci %223 = OpLabel 253e5c31af7Sopenharmony_ci %225 = OpIAdd %14 %255 %47 254e5c31af7Sopenharmony_ci OpBranch %176 255e5c31af7Sopenharmony_ci %226 = OpLabel 256e5c31af7Sopenharmony_ci %133 = OpAccessChain %65 %63 %27 %47 257e5c31af7Sopenharmony_ci %134 = OpLoad %14 %133 258e5c31af7Sopenharmony_ci %135 = OpIEqual %9 %256 %134 259e5c31af7Sopenharmony_ci OpSelectionMerge %137 None 260e5c31af7Sopenharmony_ci OpBranchConditional %135 %136 %153 261e5c31af7Sopenharmony_ci %153 = OpLabel 262e5c31af7Sopenharmony_ci %156 = OpConvertSToF %6 %173 263e5c31af7Sopenharmony_ci %157 = OpCompositeConstruct %7 %156 %156 %156 %156 264e5c31af7Sopenharmony_ci OpStore %139 %157 265e5c31af7Sopenharmony_ci OpBranch %137 266e5c31af7Sopenharmony_ci %136 = OpLabel 267e5c31af7Sopenharmony_ci %142 = OpConvertSToF %6 %175 268e5c31af7Sopenharmony_ci %145 = OpConvertSToF %6 %173 269e5c31af7Sopenharmony_ci %152 = OpCompositeConstruct %7 %142 %145 %145 %142 270e5c31af7Sopenharmony_ci OpStore %139 %152 271e5c31af7Sopenharmony_ci OpBranch %137 272e5c31af7Sopenharmony_ci %137 = OpLabel 273e5c31af7Sopenharmony_ci OpReturn 274e5c31af7Sopenharmony_ci OpFunctionEnd 275e5c31af7Sopenharmony_ciEND 276e5c31af7Sopenharmony_ci 277e5c31af7Sopenharmony_ci# uniforms for variant 278e5c31af7Sopenharmony_ci 279e5c31af7Sopenharmony_ci# injectionSwitch 280e5c31af7Sopenharmony_ciBUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA 281e5c31af7Sopenharmony_ci 0.0 1.0 282e5c31af7Sopenharmony_ciEND 283e5c31af7Sopenharmony_ci# _GLF_uniform_float_values 284e5c31af7Sopenharmony_ciBUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA 285e5c31af7Sopenharmony_ci 0.0 2.0 286e5c31af7Sopenharmony_ciEND 287e5c31af7Sopenharmony_ci# _GLF_uniform_int_values 288e5c31af7Sopenharmony_ciBUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 289e5c31af7Sopenharmony_ci 8 2 0 1 3 290e5c31af7Sopenharmony_ciEND 291e5c31af7Sopenharmony_ci 292e5c31af7Sopenharmony_ciBUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 293e5c31af7Sopenharmony_ci 294e5c31af7Sopenharmony_ciPIPELINE graphics variant_pipeline 295e5c31af7Sopenharmony_ci ATTACH variant_vertex_shader 296e5c31af7Sopenharmony_ci ATTACH variant_fragment_shader 297e5c31af7Sopenharmony_ci FRAMEBUFFER_SIZE 32 32 298e5c31af7Sopenharmony_ci BIND BUFFER variant_framebuffer AS color LOCATION 0 299e5c31af7Sopenharmony_ci BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 2 300e5c31af7Sopenharmony_ci BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1 301e5c31af7Sopenharmony_ci BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0 302e5c31af7Sopenharmony_ciEND 303e5c31af7Sopenharmony_ciCLEAR_COLOR variant_pipeline 0 0 0 255 304e5c31af7Sopenharmony_ci 305e5c31af7Sopenharmony_ciCLEAR variant_pipeline 306e5c31af7Sopenharmony_ciRUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32 307e5c31af7Sopenharmony_ci 308e5c31af7Sopenharmony_ciEXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255 309