#!amber # Copyright 2022 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # A test for a coverage-gap found by the GraphicsFuzz project. # Short description: A fragment shader that covers specific LLVM code paths # The test passes because the shader always writes red. SHADER vertex variant_vertex_shader PASSTHROUGH # variant_fragment_shader is derived from the following GLSL: # #version 320 es # # #define _int_1 _GLF_uniform_int_values[0] # #define _int_0 _GLF_uniform_int_values[1] # #define _int_100 _GLF_uniform_int_values[2] # #define _int_30 _GLF_uniform_int_values[3] # #define _int_6 _GLF_uniform_int_values[4] # #define _int_35 _GLF_uniform_int_values[5] # #define _int_8 _GLF_uniform_int_values[6] # #define _float_1_0 _GLF_uniform_float_values[0] # #define _float_0_0 _GLF_uniform_float_values[1] # # precision highp float; # precision highp int; # # // Contents of _GLF_uniform_float_values: [1.0, 0.0] # layout(set = 0, binding = 0) uniform buf0 # { # float _GLF_uniform_float_values[2]; # }; # # // Contents of _GLF_uniform_int_values: [1, 0, 100, 30, 6, 35, 8] # layout(set = 0, binding = 1) uniform buf1 # { # int _GLF_uniform_int_values[7]; # }; # # // Contents of injectionSwitch: [0.0, 1.0] # layout(set = 0, binding = 2) uniform buf2 # { # vec2 injectionSwitch; # }; # # layout(location = 0) out vec4 _GLF_color; # # int arr[10] = int[10](1, 1, 1, 1, 1, 1, 1, 1, 1, 1); # # void func0(int x) # { # int a = _int_1; # # for(int i = 0; i < 4; i ++) # { # // Always false. # if(x == 1) # { # return; # } # # // a stays at value one. # a = arr[a]; # # // Always false. # if(injectionSwitch.x > injectionSwitch.y) # { # frexp(1.0, x); # # for(int j = _int_8; a < 10; j ++) # { # if(float[10](_float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0, _float_1_0)[a] > _float_0_0) # { # a = j; # } # } # } # } # } # # // This value never changes. # float f = 1.0; # # // This function always returns vec3(1, 1, 1). # vec3 func1(vec2 v) # { # if(v.x > _float_1_0) # { # return vec3(_int_1); # } # # if(v.y < _float_1_0) # { # // f stays at value one. # f = min(_float_1_0, f); # # return vec3(_int_1, _int_1, f); # } # # if(v.y > _float_1_0) # { # // f stays at value one. # f = clamp(_float_1_0, _float_1_0, f); # } # # return vec3(_int_1); # } # # // This function is always called with a zero matrix # // and always returns vec3(1, 1, 1). # vec3 func2(mat2 m) # { # func0(_int_6); # func0(30); # # // v0 = vec2(0, 0). # vec2 v0 = vec2(_float_1_0) * m; # vec3 v1 = vec3(_float_1_0); # # for(int i = _int_0; i < _int_35; i ++) # { # // v2 = vec3(1, 1, 1); # vec3 v2 = func1(v0); # # // Always false. # if(length(v2) <= _float_1_0) # { # continue; # } # # // v1 stays at value (1, 1, 1). # v1 = v2; # } # # # return v1; # } # # void main() # { # // Always false. # if(injectionSwitch.x > injectionSwitch.y) # { # return; # } # # // v = vec3(1, 1, 1). # vec3 v = func2(mat2(_float_0_0, cos(_float_0_0), _float_0_0, _float_0_0)); # func2(mat2(_int_0)); # func0(_int_100); # func0(_int_30); # func2(mat2(_int_0)); # # // Always true. # if(f == _float_1_0) # { # _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1); # } # else # { # _GLF_color = vec4(v, _int_0); # } # } SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 ; SPIR-V ; Version: 1.0 ; Generator: Khronos Glslang Reference Front End; 10 ; Bound: 318 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %295 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 320 OpName %4 "main" OpName %10 "func0(i1;" OpName %9 "x" OpName %18 "func1(vf2;" OpName %17 "v" OpName %24 "func2(mf22;" OpName %23 "m" OpName %30 "arr" OpName %34 "f" OpName %36 "a" OpName %39 "buf1" OpMemberName %39 0 "_GLF_uniform_int_values" OpName %41 "" OpName %46 "i" OpName %65 "buf2" OpMemberName %65 0 "injectionSwitch" OpName %67 "" OpName %78 "ResType" OpName %82 "j" OpName %96 "buf0" OpMemberName %96 0 "_GLF_uniform_float_values" OpName %98 "" OpName %123 "indexable" OpName %188 "param" OpName %193 "param" OpName %195 "v0" OpName %202 "v1" OpName %206 "i" OpName %219 "v2" OpName %220 "param" OpName %245 "v" OpName %259 "param" OpName %267 "param" OpName %270 "param" OpName %275 "param" OpName %285 "param" OpName %295 "_GLF_color" OpDecorate %38 ArrayStride 16 OpMemberDecorate %39 0 Offset 0 OpDecorate %39 Block OpDecorate %41 DescriptorSet 0 OpDecorate %41 Binding 1 OpMemberDecorate %65 0 Offset 0 OpDecorate %65 Block OpDecorate %67 DescriptorSet 0 OpDecorate %67 Binding 2 OpDecorate %95 ArrayStride 16 OpMemberDecorate %96 0 Offset 0 OpDecorate %96 Block OpDecorate %98 DescriptorSet 0 OpDecorate %98 Binding 0 OpDecorate %295 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeInt 32 1 %7 = OpTypePointer Function %6 %8 = OpTypeFunction %2 %7 %12 = OpTypeFloat 32 %13 = OpTypeVector %12 2 %14 = OpTypePointer Function %13 %15 = OpTypeVector %12 3 %16 = OpTypeFunction %15 %14 %20 = OpTypeMatrix %13 2 %21 = OpTypePointer Function %20 %22 = OpTypeFunction %15 %21 %26 = OpTypeInt 32 0 %27 = OpConstant %26 10 %28 = OpTypeArray %6 %27 %29 = OpTypePointer Private %28 %30 = OpVariable %29 Private %31 = OpConstant %6 1 %32 = OpConstantComposite %28 %31 %31 %31 %31 %31 %31 %31 %31 %31 %31 %33 = OpTypePointer Private %12 %34 = OpVariable %33 Private %35 = OpConstant %12 1 %37 = OpConstant %26 7 %38 = OpTypeArray %6 %37 %39 = OpTypeStruct %38 %40 = OpTypePointer Uniform %39 %41 = OpVariable %40 Uniform %42 = OpConstant %6 0 %43 = OpTypePointer Uniform %6 %53 = OpConstant %6 4 %54 = OpTypeBool %62 = OpTypePointer Private %6 %65 = OpTypeStruct %13 %66 = OpTypePointer Uniform %65 %67 = OpVariable %66 Uniform %68 = OpConstant %26 0 %69 = OpTypePointer Uniform %12 %72 = OpConstant %26 1 %78 = OpTypeStruct %12 %6 %83 = OpConstant %6 6 %92 = OpConstant %6 10 %94 = OpConstant %26 2 %95 = OpTypeArray %12 %94 %96 = OpTypeStruct %95 %97 = OpTypePointer Uniform %96 %98 = OpVariable %97 Uniform %119 = OpTypeArray %12 %27 %122 = OpTypePointer Function %119 %124 = OpTypePointer Function %12 %192 = OpConstant %6 30 %201 = OpTypePointer Function %15 %215 = OpConstant %6 5 %255 = OpConstant %12 0 %269 = OpConstant %6 2 %274 = OpConstant %6 3 %293 = OpTypeVector %12 4 %294 = OpTypePointer Output %293 %295 = OpVariable %294 Output %4 = OpFunction %2 None %3 %5 = OpLabel %245 = OpVariable %201 Function %259 = OpVariable %21 Function %267 = OpVariable %21 Function %270 = OpVariable %7 Function %275 = OpVariable %7 Function %285 = OpVariable %21 Function OpStore %30 %32 OpStore %34 %35 %237 = OpAccessChain %69 %67 %42 %68 %238 = OpLoad %12 %237 %239 = OpAccessChain %69 %67 %42 %72 %240 = OpLoad %12 %239 %241 = OpFOrdGreaterThan %54 %238 %240 OpSelectionMerge %243 None OpBranchConditional %241 %242 %243 %242 = OpLabel OpReturn %243 = OpLabel %246 = OpAccessChain %69 %98 %42 %31 %247 = OpLoad %12 %246 %248 = OpAccessChain %69 %98 %42 %31 %249 = OpLoad %12 %248 %250 = OpExtInst %12 %1 Cos %249 %251 = OpAccessChain %69 %98 %42 %31 %252 = OpLoad %12 %251 %253 = OpAccessChain %69 %98 %42 %31 %254 = OpLoad %12 %253 %256 = OpCompositeConstruct %13 %247 %250 %257 = OpCompositeConstruct %13 %252 %254 %258 = OpCompositeConstruct %20 %256 %257 OpStore %259 %258 %260 = OpFunctionCall %15 %24 %259 OpStore %245 %260 %261 = OpAccessChain %43 %41 %42 %31 %262 = OpLoad %6 %261 %263 = OpConvertSToF %12 %262 %264 = OpCompositeConstruct %13 %263 %255 %265 = OpCompositeConstruct %13 %255 %263 %266 = OpCompositeConstruct %20 %264 %265 OpStore %267 %266 %268 = OpFunctionCall %15 %24 %267 %271 = OpAccessChain %43 %41 %42 %269 %272 = OpLoad %6 %271 OpStore %270 %272 %273 = OpFunctionCall %2 %10 %270 %276 = OpAccessChain %43 %41 %42 %274 %277 = OpLoad %6 %276 OpStore %275 %277 %278 = OpFunctionCall %2 %10 %275 %279 = OpAccessChain %43 %41 %42 %31 %280 = OpLoad %6 %279 %281 = OpConvertSToF %12 %280 %282 = OpCompositeConstruct %13 %281 %255 %283 = OpCompositeConstruct %13 %255 %281 %284 = OpCompositeConstruct %20 %282 %283 OpStore %285 %284 %286 = OpFunctionCall %15 %24 %285 %287 = OpLoad %12 %34 %288 = OpAccessChain %69 %98 %42 %42 %289 = OpLoad %12 %288 %290 = OpFOrdEqual %54 %287 %289 OpSelectionMerge %292 None OpBranchConditional %290 %291 %309 %291 = OpLabel %296 = OpAccessChain %43 %41 %42 %42 %297 = OpLoad %6 %296 %298 = OpConvertSToF %12 %297 %299 = OpAccessChain %43 %41 %42 %31 %300 = OpLoad %6 %299 %301 = OpConvertSToF %12 %300 %302 = OpAccessChain %43 %41 %42 %31 %303 = OpLoad %6 %302 %304 = OpConvertSToF %12 %303 %305 = OpAccessChain %43 %41 %42 %42 %306 = OpLoad %6 %305 %307 = OpConvertSToF %12 %306 %308 = OpCompositeConstruct %293 %298 %301 %304 %307 OpStore %295 %308 OpBranch %292 %309 = OpLabel %310 = OpLoad %15 %245 %311 = OpAccessChain %43 %41 %42 %31 %312 = OpLoad %6 %311 %313 = OpConvertSToF %12 %312 %314 = OpCompositeExtract %12 %310 0 %315 = OpCompositeExtract %12 %310 1 %316 = OpCompositeExtract %12 %310 2 %317 = OpCompositeConstruct %293 %314 %315 %316 %313 OpStore %295 %317 OpBranch %292 %292 = OpLabel OpReturn OpFunctionEnd %10 = OpFunction %2 None %8 %9 = OpFunctionParameter %7 %11 = OpLabel %36 = OpVariable %7 Function %46 = OpVariable %7 Function %82 = OpVariable %7 Function %123 = OpVariable %122 Function %44 = OpAccessChain %43 %41 %42 %42 %45 = OpLoad %6 %44 OpStore %36 %45 OpStore %46 %42 OpBranch %47 %47 = OpLabel OpLoopMerge %49 %50 None OpBranch %51 %51 = OpLabel %52 = OpLoad %6 %46 %55 = OpSLessThan %54 %52 %53 OpBranchConditional %55 %48 %49 %48 = OpLabel %56 = OpLoad %6 %9 %57 = OpIEqual %54 %56 %31 OpSelectionMerge %59 None OpBranchConditional %57 %58 %59 %58 = OpLabel OpReturn %59 = OpLabel %61 = OpLoad %6 %36 %63 = OpAccessChain %62 %30 %61 %64 = OpLoad %6 %63 OpStore %36 %64 %70 = OpAccessChain %69 %67 %42 %68 %71 = OpLoad %12 %70 %73 = OpAccessChain %69 %67 %42 %72 %74 = OpLoad %12 %73 %75 = OpFOrdGreaterThan %54 %71 %74 OpSelectionMerge %77 None OpBranchConditional %75 %76 %77 %76 = OpLabel %79 = OpExtInst %78 %1 FrexpStruct %35 %80 = OpCompositeExtract %6 %79 1 OpStore %9 %80 %81 = OpCompositeExtract %12 %79 0 %84 = OpAccessChain %43 %41 %42 %83 %85 = OpLoad %6 %84 OpStore %82 %85 OpBranch %86 %86 = OpLabel OpLoopMerge %88 %89 None OpBranch %90 %90 = OpLabel %91 = OpLoad %6 %36 %93 = OpSLessThan %54 %91 %92 OpBranchConditional %93 %87 %88 %87 = OpLabel %99 = OpAccessChain %69 %98 %42 %42 %100 = OpLoad %12 %99 %101 = OpAccessChain %69 %98 %42 %42 %102 = OpLoad %12 %101 %103 = OpAccessChain %69 %98 %42 %42 %104 = OpLoad %12 %103 %105 = OpAccessChain %69 %98 %42 %42 %106 = OpLoad %12 %105 %107 = OpAccessChain %69 %98 %42 %42 %108 = OpLoad %12 %107 %109 = OpAccessChain %69 %98 %42 %42 %110 = OpLoad %12 %109 %111 = OpAccessChain %69 %98 %42 %42 %112 = OpLoad %12 %111 %113 = OpAccessChain %69 %98 %42 %42 %114 = OpLoad %12 %113 %115 = OpAccessChain %69 %98 %42 %42 %116 = OpLoad %12 %115 %117 = OpAccessChain %69 %98 %42 %42 %118 = OpLoad %12 %117 %120 = OpCompositeConstruct %119 %100 %102 %104 %106 %108 %110 %112 %114 %116 %118 %121 = OpLoad %6 %36 OpStore %123 %120 %125 = OpAccessChain %124 %123 %121 %126 = OpLoad %12 %125 %127 = OpAccessChain %69 %98 %42 %31 %128 = OpLoad %12 %127 %129 = OpFOrdGreaterThan %54 %126 %128 OpSelectionMerge %131 None OpBranchConditional %129 %130 %131 %130 = OpLabel %132 = OpLoad %6 %82 OpStore %36 %132 OpBranch %131 %131 = OpLabel OpBranch %89 %89 = OpLabel %133 = OpLoad %6 %82 %134 = OpIAdd %6 %133 %31 OpStore %82 %134 OpBranch %86 %88 = OpLabel OpBranch %77 %77 = OpLabel OpBranch %50 %50 = OpLabel %135 = OpLoad %6 %46 %136 = OpIAdd %6 %135 %31 OpStore %46 %136 OpBranch %47 %49 = OpLabel OpReturn OpFunctionEnd %18 = OpFunction %15 None %16 %17 = OpFunctionParameter %14 %19 = OpLabel %137 = OpAccessChain %124 %17 %68 %138 = OpLoad %12 %137 %139 = OpAccessChain %69 %98 %42 %42 %140 = OpLoad %12 %139 %141 = OpFOrdGreaterThan %54 %138 %140 OpSelectionMerge %143 None OpBranchConditional %141 %142 %143 %142 = OpLabel %144 = OpAccessChain %43 %41 %42 %42 %145 = OpLoad %6 %144 %146 = OpConvertSToF %12 %145 %147 = OpCompositeConstruct %15 %146 %146 %146 OpReturnValue %147 %143 = OpLabel %149 = OpAccessChain %124 %17 %72 %150 = OpLoad %12 %149 %151 = OpAccessChain %69 %98 %42 %42 %152 = OpLoad %12 %151 %153 = OpFOrdLessThan %54 %150 %152 OpSelectionMerge %155 None OpBranchConditional %153 %154 %155 %154 = OpLabel %156 = OpAccessChain %69 %98 %42 %42 %157 = OpLoad %12 %156 %158 = OpLoad %12 %34 %159 = OpExtInst %12 %1 FMin %157 %158 OpStore %34 %159 %160 = OpAccessChain %43 %41 %42 %42 %161 = OpLoad %6 %160 %162 = OpConvertSToF %12 %161 %163 = OpAccessChain %43 %41 %42 %42 %164 = OpLoad %6 %163 %165 = OpConvertSToF %12 %164 %166 = OpLoad %12 %34 %167 = OpCompositeConstruct %15 %162 %165 %166 OpReturnValue %167 %155 = OpLabel %169 = OpAccessChain %124 %17 %72 %170 = OpLoad %12 %169 %171 = OpAccessChain %69 %98 %42 %42 %172 = OpLoad %12 %171 %173 = OpFOrdGreaterThan %54 %170 %172 OpSelectionMerge %175 None OpBranchConditional %173 %174 %175 %174 = OpLabel %176 = OpAccessChain %69 %98 %42 %42 %177 = OpLoad %12 %176 %178 = OpAccessChain %69 %98 %42 %42 %179 = OpLoad %12 %178 %180 = OpLoad %12 %34 %181 = OpExtInst %12 %1 FClamp %177 %179 %180 OpStore %34 %181 OpBranch %175 %175 = OpLabel %182 = OpAccessChain %43 %41 %42 %42 %183 = OpLoad %6 %182 %184 = OpConvertSToF %12 %183 %185 = OpCompositeConstruct %15 %184 %184 %184 OpReturnValue %185 OpFunctionEnd %24 = OpFunction %15 None %22 %23 = OpFunctionParameter %21 %25 = OpLabel %188 = OpVariable %7 Function %193 = OpVariable %7 Function %195 = OpVariable %14 Function %202 = OpVariable %201 Function %206 = OpVariable %7 Function %219 = OpVariable %201 Function %220 = OpVariable %14 Function %189 = OpAccessChain %43 %41 %42 %53 %190 = OpLoad %6 %189 OpStore %188 %190 %191 = OpFunctionCall %2 %10 %188 OpStore %193 %192 %194 = OpFunctionCall %2 %10 %193 %196 = OpAccessChain %69 %98 %42 %42 %197 = OpLoad %12 %196 %198 = OpCompositeConstruct %13 %197 %197 %199 = OpLoad %20 %23 %200 = OpVectorTimesMatrix %13 %198 %199 OpStore %195 %200 %203 = OpAccessChain %69 %98 %42 %42 %204 = OpLoad %12 %203 %205 = OpCompositeConstruct %15 %204 %204 %204 OpStore %202 %205 %207 = OpAccessChain %43 %41 %42 %31 %208 = OpLoad %6 %207 OpStore %206 %208 OpBranch %209 %209 = OpLabel OpLoopMerge %211 %212 None OpBranch %213 %213 = OpLabel %214 = OpLoad %6 %206 %216 = OpAccessChain %43 %41 %42 %215 %217 = OpLoad %6 %216 %218 = OpSLessThan %54 %214 %217 OpBranchConditional %218 %210 %211 %210 = OpLabel %221 = OpLoad %13 %195 OpStore %220 %221 %222 = OpFunctionCall %15 %18 %220 OpStore %219 %222 %223 = OpLoad %15 %219 %224 = OpExtInst %12 %1 Length %223 %225 = OpAccessChain %69 %98 %42 %42 %226 = OpLoad %12 %225 %227 = OpFOrdLessThanEqual %54 %224 %226 OpSelectionMerge %229 None OpBranchConditional %227 %228 %229 %228 = OpLabel OpBranch %212 %229 = OpLabel %231 = OpLoad %15 %219 OpStore %202 %231 OpBranch %212 %212 = OpLabel %232 = OpLoad %6 %206 %233 = OpIAdd %6 %232 %31 OpStore %206 %233 OpBranch %209 %211 = OpLabel %234 = OpLoad %15 %202 OpReturnValue %234 OpFunctionEnd END # uniforms for variant # injectionSwitch BUFFER variant_injectionSwitch DATA_TYPE vec2 STD140 DATA 0.0 1.0 END # _GLF_uniform_int_values BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 1 0 100 30 6 35 8 END # _GLF_uniform_float_values BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA 1.0 0.0 END BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM PIPELINE graphics variant_pipeline ATTACH variant_vertex_shader ATTACH variant_fragment_shader FRAMEBUFFER_SIZE 32 32 BIND BUFFER variant_framebuffer AS color LOCATION 0 BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 2 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0 END CLEAR_COLOR variant_pipeline 0 0 0 255 CLEAR variant_pipeline RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32 EXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255