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 a specific instr info code path 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 310 es 28# #define _int_0 _GLF_uniform_int_values[0] 29# #define _int_1 _GLF_uniform_int_values[1] 30# #define _int_10 _GLF_uniform_int_values[2] 31# #define _float_0_0 _GLF_uniform_float_values[0] 32# #define _float_1_0 _GLF_uniform_float_values[1] 33# 34# precision highp float; 35# 36# precision highp int; 37# 38# layout(location = 0) out vec4 _GLF_color; 39# 40# // Contents of _GLF_uniform_int_values: [0, 1] 41# layout(set = 0, binding = 0) uniform buf0 42# { 43# int _GLF_uniform_int_values[3]; 44# }; 45# 46# // Contents of _GLF_uniform_float_values: [0.0, 1.0] 47# layout(set = 0, binding = 1) uniform buf1 48# { 49# float _GLF_uniform_float_values[2]; 50# }; 51# 52# int data[10]; 53# 54# void f1() 55# { 56# _GLF_color = vec4(0); 57# 58# for (int i = _int_1; i < _int_10; i++) 59# { 60# data[i] = _int_0; 61# } 62# 63# float a = determinant(mat2(1.0, 1.0, 1.0, 1.0)); 64# float b = determinant(mat2(0.0, 0.0, 0.0, 0.0)); 65# 66# mat2x4 m24a = mat2x4(a, _float_1_0, _float_1_0, _float_1_0, _float_1_0, 67# _float_1_0, _float_1_0, _float_1_0); 68# mat2x4 m24b = mat2x4(b, _float_1_0, _float_1_0, _float_1_0, _float_1_0, 69# _float_1_0, _float_1_0, _float_1_0); 70# 71# float c = min(float(m24a), float(m24b)); 72# 73# if (c < _float_1_0 && a == 0.0 && b == 0.0) 74# { 75# data[0] = _int_1; 76# } 77# } 78# 79# void main() 80# { 81# for (int i = 0; i <= 10; i++) 82# { 83# f1(); 84# } 85# 86# _GLF_color = vec4(data[0], _float_0_0, _float_0_0, data[0]); 87# } 88SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 89; SPIR-V 90; Version: 1.0 91; Generator: Khronos Glslang Reference Front End; 8 92; Bound: 152 93; Schema: 0 94 OpCapability Shader 95 %1 = OpExtInstImport "GLSL.std.450" 96 OpMemoryModel Logical GLSL450 97 OpEntryPoint Fragment %4 "main" %11 98 OpExecutionMode %4 OriginUpperLeft 99 OpSource ESSL 310 100 OpName %4 "main" 101 OpName %6 "f1(" 102 OpName %11 "_GLF_color" 103 OpName %16 "i" 104 OpName %20 "buf0" 105 OpMemberName %20 0 "_GLF_uniform_int_values" 106 OpName %22 "" 107 OpName %42 "data" 108 OpName %51 "a" 109 OpName %58 "b" 110 OpName %64 "m24a" 111 OpName %68 "buf1" 112 OpMemberName %68 0 "_GLF_uniform_float_values" 113 OpName %70 "" 114 OpName %89 "m24b" 115 OpName %108 "c" 116 OpName %129 "i" 117 OpDecorate %11 Location 0 118 OpDecorate %19 ArrayStride 16 119 OpMemberDecorate %20 0 Offset 0 120 OpDecorate %20 Block 121 OpDecorate %22 DescriptorSet 0 122 OpDecorate %22 Binding 0 123 OpDecorate %67 ArrayStride 16 124 OpMemberDecorate %68 0 Offset 0 125 OpDecorate %68 Block 126 OpDecorate %70 DescriptorSet 0 127 OpDecorate %70 Binding 1 128 %2 = OpTypeVoid 129 %3 = OpTypeFunction %2 130 %8 = OpTypeFloat 32 131 %9 = OpTypeVector %8 4 132 %10 = OpTypePointer Output %9 133 %11 = OpVariable %10 Output 134 %12 = OpConstant %8 0 135 %13 = OpConstantComposite %9 %12 %12 %12 %12 136 %14 = OpTypeInt 32 1 137 %15 = OpTypePointer Function %14 138 %17 = OpTypeInt 32 0 139 %18 = OpConstant %17 3 140 %19 = OpTypeArray %14 %18 141 %20 = OpTypeStruct %19 142 %21 = OpTypePointer Uniform %20 143 %22 = OpVariable %21 Uniform 144 %23 = OpConstant %14 0 145 %24 = OpConstant %14 1 146 %25 = OpTypePointer Uniform %14 147 %34 = OpConstant %14 2 148 %37 = OpTypeBool 149 %39 = OpConstant %17 10 150 %40 = OpTypeArray %14 %39 151 %41 = OpTypePointer Private %40 152 %42 = OpVariable %41 Private 153 %46 = OpTypePointer Private %14 154 %50 = OpTypePointer Function %8 155 %52 = OpTypeVector %8 2 156 %53 = OpTypeMatrix %52 2 157 %54 = OpConstant %8 1 158 %55 = OpConstantComposite %52 %54 %54 159 %56 = OpConstantComposite %53 %55 %55 160 %59 = OpConstantComposite %52 %12 %12 161 %60 = OpConstantComposite %53 %59 %59 162 %62 = OpTypeMatrix %9 2 163 %63 = OpTypePointer Function %62 164 %66 = OpConstant %17 2 165 %67 = OpTypeArray %8 %66 166 %68 = OpTypeStruct %67 167 %69 = OpTypePointer Uniform %68 168 %70 = OpVariable %69 Uniform 169 %71 = OpTypePointer Uniform %8 170 %136 = OpConstant %14 10 171 %4 = OpFunction %2 None %3 172 %5 = OpLabel 173 %129 = OpVariable %15 Function 174 OpStore %129 %23 175 OpBranch %130 176 %130 = OpLabel 177 OpLoopMerge %132 %133 None 178 OpBranch %134 179 %134 = OpLabel 180 %135 = OpLoad %14 %129 181 %137 = OpSLessThanEqual %37 %135 %136 182 OpBranchConditional %137 %131 %132 183 %131 = OpLabel 184 %138 = OpFunctionCall %2 %6 185 OpBranch %133 186 %133 = OpLabel 187 %139 = OpLoad %14 %129 188 %140 = OpIAdd %14 %139 %24 189 OpStore %129 %140 190 OpBranch %130 191 %132 = OpLabel 192 %141 = OpAccessChain %46 %42 %23 193 %142 = OpLoad %14 %141 194 %143 = OpConvertSToF %8 %142 195 %144 = OpAccessChain %71 %70 %23 %23 196 %145 = OpLoad %8 %144 197 %146 = OpAccessChain %71 %70 %23 %23 198 %147 = OpLoad %8 %146 199 %148 = OpAccessChain %46 %42 %23 200 %149 = OpLoad %14 %148 201 %150 = OpConvertSToF %8 %149 202 %151 = OpCompositeConstruct %9 %143 %145 %147 %150 203 OpStore %11 %151 204 OpReturn 205 OpFunctionEnd 206 %6 = OpFunction %2 None %3 207 %7 = OpLabel 208 %16 = OpVariable %15 Function 209 %51 = OpVariable %50 Function 210 %58 = OpVariable %50 Function 211 %64 = OpVariable %63 Function 212 %89 = OpVariable %63 Function 213 %108 = OpVariable %50 Function 214 OpStore %11 %13 215 %26 = OpAccessChain %25 %22 %23 %24 216 %27 = OpLoad %14 %26 217 OpStore %16 %27 218 OpBranch %28 219 %28 = OpLabel 220 OpLoopMerge %30 %31 None 221 OpBranch %32 222 %32 = OpLabel 223 %33 = OpLoad %14 %16 224 %35 = OpAccessChain %25 %22 %23 %34 225 %36 = OpLoad %14 %35 226 %38 = OpSLessThan %37 %33 %36 227 OpBranchConditional %38 %29 %30 228 %29 = OpLabel 229 %43 = OpLoad %14 %16 230 %44 = OpAccessChain %25 %22 %23 %23 231 %45 = OpLoad %14 %44 232 %47 = OpAccessChain %46 %42 %43 233 OpStore %47 %45 234 OpBranch %31 235 %31 = OpLabel 236 %48 = OpLoad %14 %16 237 %49 = OpIAdd %14 %48 %24 238 OpStore %16 %49 239 OpBranch %28 240 %30 = OpLabel 241 %57 = OpExtInst %8 %1 Determinant %56 242 OpStore %51 %57 243 %61 = OpExtInst %8 %1 Determinant %60 244 OpStore %58 %61 245 %65 = OpLoad %8 %51 246 %72 = OpAccessChain %71 %70 %23 %24 247 %73 = OpLoad %8 %72 248 %74 = OpAccessChain %71 %70 %23 %24 249 %75 = OpLoad %8 %74 250 %76 = OpAccessChain %71 %70 %23 %24 251 %77 = OpLoad %8 %76 252 %78 = OpAccessChain %71 %70 %23 %24 253 %79 = OpLoad %8 %78 254 %80 = OpAccessChain %71 %70 %23 %24 255 %81 = OpLoad %8 %80 256 %82 = OpAccessChain %71 %70 %23 %24 257 %83 = OpLoad %8 %82 258 %84 = OpAccessChain %71 %70 %23 %24 259 %85 = OpLoad %8 %84 260 %86 = OpCompositeConstruct %9 %65 %73 %75 %77 261 %87 = OpCompositeConstruct %9 %79 %81 %83 %85 262 %88 = OpCompositeConstruct %62 %86 %87 263 OpStore %64 %88 264 %90 = OpLoad %8 %58 265 %91 = OpAccessChain %71 %70 %23 %24 266 %92 = OpLoad %8 %91 267 %93 = OpAccessChain %71 %70 %23 %24 268 %94 = OpLoad %8 %93 269 %95 = OpAccessChain %71 %70 %23 %24 270 %96 = OpLoad %8 %95 271 %97 = OpAccessChain %71 %70 %23 %24 272 %98 = OpLoad %8 %97 273 %99 = OpAccessChain %71 %70 %23 %24 274 %100 = OpLoad %8 %99 275 %101 = OpAccessChain %71 %70 %23 %24 276 %102 = OpLoad %8 %101 277 %103 = OpAccessChain %71 %70 %23 %24 278 %104 = OpLoad %8 %103 279 %105 = OpCompositeConstruct %9 %90 %92 %94 %96 280 %106 = OpCompositeConstruct %9 %98 %100 %102 %104 281 %107 = OpCompositeConstruct %62 %105 %106 282 OpStore %89 %107 283 %109 = OpLoad %62 %64 284 %110 = OpCompositeExtract %8 %109 0 0 285 %111 = OpLoad %62 %89 286 %112 = OpCompositeExtract %8 %111 0 0 287 %113 = OpExtInst %8 %1 FMin %110 %112 288 OpStore %108 %113 289 %114 = OpLoad %8 %108 290 %115 = OpAccessChain %71 %70 %23 %24 291 %116 = OpLoad %8 %115 292 %117 = OpFOrdLessThan %37 %114 %116 293 %118 = OpLoad %8 %51 294 %119 = OpFOrdEqual %37 %118 %12 295 %120 = OpLogicalAnd %37 %117 %119 296 %121 = OpLoad %8 %58 297 %122 = OpFOrdEqual %37 %121 %12 298 %123 = OpLogicalAnd %37 %120 %122 299 OpSelectionMerge %125 None 300 OpBranchConditional %123 %124 %125 301 %124 = OpLabel 302 %126 = OpAccessChain %25 %22 %23 %24 303 %127 = OpLoad %14 %126 304 %128 = OpAccessChain %46 %42 %23 305 OpStore %128 %127 306 OpBranch %125 307 %125 = OpLabel 308 OpReturn 309 OpFunctionEnd 310END 311 312# uniforms for variant 313 314# _GLF_uniform_int_values 315BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 316 0 1 10 317END 318# _GLF_uniform_float_values 319BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA 320 0.0 1.0 321END 322 323BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 324 325PIPELINE graphics variant_pipeline 326 ATTACH variant_vertex_shader 327 ATTACH variant_fragment_shader 328 FRAMEBUFFER_SIZE 256 256 329 BIND BUFFER variant_framebuffer AS color LOCATION 0 330 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0 331 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1 332END 333CLEAR_COLOR variant_pipeline 0 0 0 255 334 335CLEAR variant_pipeline 336RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 337 338EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 339