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