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 the GraphicsFuzz project. 19 20# Short description: A fragment shader that covers specific NIR code paths 21 22# The test passes because the shader always writes red. 23 24SHADER vertex variant_vertex_shader PASSTHROUGH 25 26# variant_fragment_shader is derived from the following GLSL: 27# #version 320 es 28# 29# #define _int_5 _GLF_uniform_int_values[0] 30# #define _int_0 _GLF_uniform_int_values[1] 31# #define _float_1_0 _GLF_uniform_float_values[0] 32# #define _float_0_0 _GLF_uniform_float_values[1] 33# 34# precision highp float; 35# precision highp int; 36# 37# // Contents of _GLF_uniform_float_values: [1.0, 0.0] 38# layout(set = 0, binding = 0) uniform buf0 39# { 40# float _GLF_uniform_float_values[2]; 41# }; 42# // Contents of _GLF_uniform_int_values: [5, 0] 43# layout(set = 0, binding = 1) uniform buf1 44# { 45# int _GLF_uniform_int_values[2]; 46# }; 47# layout(location = 0) out vec4 _GLF_color; 48# 49# void main() 50# { 51# float arr[5] = float[5](_float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0); 52# int i = _int_0; 53# 54# for(int j = 0; i < _int_5; i++, j++) 55# { 56# // Always false. 57# if(j < -1) 58# { 59# break; 60# } 61# 62# arr[j] += 1.0; 63# } 64# _GLF_color = vec4(_float_1_0, _float_0_0, _float_0_0, _float_1_0); 65# for( i = _int_0; i < _int_5; i++) 66# { 67# // Always false. 68# if(arr[i] != 2.0) 69# { 70# _GLF_color = vec4(_float_0_0); 71# } 72# } 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; 10 78; Bound: 104 79; Schema: 0 80 OpCapability Shader 81 %1 = OpExtInstImport "GLSL.std.450" 82 OpMemoryModel Logical GLSL450 83 OpEntryPoint Fragment %4 "main" %71 84 OpExecutionMode %4 OriginUpperLeft 85 OpSource ESSL 320 86 OpName %4 "main" 87 OpName %11 "arr" 88 OpName %14 "buf0" 89 OpMemberName %14 0 "_GLF_uniform_float_values" 90 OpName %16 "" 91 OpName %32 "i" 92 OpName %34 "buf1" 93 OpMemberName %34 0 "_GLF_uniform_int_values" 94 OpName %36 "" 95 OpName %41 "j" 96 OpName %71 "_GLF_color" 97 OpDecorate %13 ArrayStride 16 98 OpMemberDecorate %14 0 Offset 0 99 OpDecorate %14 Block 100 OpDecorate %16 DescriptorSet 0 101 OpDecorate %16 Binding 0 102 OpDecorate %33 ArrayStride 16 103 OpMemberDecorate %34 0 Offset 0 104 OpDecorate %34 Block 105 OpDecorate %36 DescriptorSet 0 106 OpDecorate %36 Binding 1 107 OpDecorate %71 Location 0 108 %2 = OpTypeVoid 109 %3 = OpTypeFunction %2 110 %6 = OpTypeFloat 32 111 %7 = OpTypeInt 32 0 112 %8 = OpConstant %7 5 113 %9 = OpTypeArray %6 %8 114 %10 = OpTypePointer Function %9 115 %12 = OpConstant %7 2 116 %13 = OpTypeArray %6 %12 117 %14 = OpTypeStruct %13 118 %15 = OpTypePointer Uniform %14 119 %16 = OpVariable %15 Uniform 120 %17 = OpTypeInt 32 1 121 %18 = OpConstant %17 0 122 %19 = OpTypePointer Uniform %6 123 %31 = OpTypePointer Function %17 124 %33 = OpTypeArray %17 %12 125 %34 = OpTypeStruct %33 126 %35 = OpTypePointer Uniform %34 127 %36 = OpVariable %35 Uniform 128 %37 = OpConstant %17 1 129 %38 = OpTypePointer Uniform %17 130 %50 = OpTypeBool 131 %53 = OpConstant %17 -1 132 %59 = OpConstant %6 1 133 %60 = OpTypePointer Function %6 134 %69 = OpTypeVector %6 4 135 %70 = OpTypePointer Output %69 136 %71 = OpVariable %70 Output 137 %95 = OpConstant %6 2 138 %4 = OpFunction %2 None %3 139 %5 = OpLabel 140 %11 = OpVariable %10 Function 141 %32 = OpVariable %31 Function 142 %41 = OpVariable %31 Function 143 %20 = OpAccessChain %19 %16 %18 %18 144 %21 = OpLoad %6 %20 145 %22 = OpAccessChain %19 %16 %18 %18 146 %23 = OpLoad %6 %22 147 %24 = OpAccessChain %19 %16 %18 %18 148 %25 = OpLoad %6 %24 149 %26 = OpAccessChain %19 %16 %18 %18 150 %27 = OpLoad %6 %26 151 %28 = OpAccessChain %19 %16 %18 %18 152 %29 = OpLoad %6 %28 153 %30 = OpCompositeConstruct %9 %21 %23 %25 %27 %29 154 OpStore %11 %30 155 %39 = OpAccessChain %38 %36 %18 %37 156 %40 = OpLoad %17 %39 157 OpStore %32 %40 158 OpStore %41 %18 159 OpBranch %42 160 %42 = OpLabel 161 OpLoopMerge %44 %45 None 162 OpBranch %46 163 %46 = OpLabel 164 %47 = OpLoad %17 %32 165 %48 = OpAccessChain %38 %36 %18 %18 166 %49 = OpLoad %17 %48 167 %51 = OpSLessThan %50 %47 %49 168 OpBranchConditional %51 %43 %44 169 %43 = OpLabel 170 %52 = OpLoad %17 %41 171 %54 = OpSLessThan %50 %52 %53 172 OpSelectionMerge %56 None 173 OpBranchConditional %54 %55 %56 174 %55 = OpLabel 175 OpBranch %44 176 %56 = OpLabel 177 %58 = OpLoad %17 %41 178 %61 = OpAccessChain %60 %11 %58 179 %62 = OpLoad %6 %61 180 %63 = OpFAdd %6 %62 %59 181 %64 = OpAccessChain %60 %11 %58 182 OpStore %64 %63 183 OpBranch %45 184 %45 = OpLabel 185 %65 = OpLoad %17 %32 186 %66 = OpIAdd %17 %65 %37 187 OpStore %32 %66 188 %67 = OpLoad %17 %41 189 %68 = OpIAdd %17 %67 %37 190 OpStore %41 %68 191 OpBranch %42 192 %44 = OpLabel 193 %72 = OpAccessChain %19 %16 %18 %18 194 %73 = OpLoad %6 %72 195 %74 = OpAccessChain %19 %16 %18 %37 196 %75 = OpLoad %6 %74 197 %76 = OpAccessChain %19 %16 %18 %37 198 %77 = OpLoad %6 %76 199 %78 = OpAccessChain %19 %16 %18 %18 200 %79 = OpLoad %6 %78 201 %80 = OpCompositeConstruct %69 %73 %75 %77 %79 202 OpStore %71 %80 203 %81 = OpAccessChain %38 %36 %18 %37 204 %82 = OpLoad %17 %81 205 OpStore %32 %82 206 OpBranch %83 207 %83 = OpLabel 208 OpLoopMerge %85 %86 None 209 OpBranch %87 210 %87 = OpLabel 211 %88 = OpLoad %17 %32 212 %89 = OpAccessChain %38 %36 %18 %18 213 %90 = OpLoad %17 %89 214 %91 = OpSLessThan %50 %88 %90 215 OpBranchConditional %91 %84 %85 216 %84 = OpLabel 217 %92 = OpLoad %17 %32 218 %93 = OpAccessChain %60 %11 %92 219 %94 = OpLoad %6 %93 220 %96 = OpFUnordNotEqual %50 %94 %95 221 OpSelectionMerge %98 None 222 OpBranchConditional %96 %97 %98 223 %97 = OpLabel 224 %99 = OpAccessChain %19 %16 %18 %37 225 %100 = OpLoad %6 %99 226 %101 = OpCompositeConstruct %69 %100 %100 %100 %100 227 OpStore %71 %101 228 OpBranch %98 229 %98 = OpLabel 230 OpBranch %86 231 %86 = OpLabel 232 %102 = OpLoad %17 %32 233 %103 = OpIAdd %17 %102 %37 234 OpStore %32 %103 235 OpBranch %83 236 %85 = OpLabel 237 OpReturn 238 OpFunctionEnd 239END 240 241# uniforms for variant 242 243# _GLF_uniform_int_values 244BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 245 5 0 246END 247# _GLF_uniform_float_values 248BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA 249 1.0 0.0 250END 251 252BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 253 254PIPELINE graphics variant_pipeline 255 ATTACH variant_vertex_shader 256 ATTACH variant_fragment_shader 257 FRAMEBUFFER_SIZE 256 256 258 BIND BUFFER variant_framebuffer AS color LOCATION 0 259 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1 260 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0 261END 262CLEAR_COLOR variant_pipeline 0 0 0 255 263 264CLEAR variant_pipeline 265RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 266 267EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 268