#!amber # Copyright 2021 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_10 _GLF_uniform_int_values[2] # #define _int_6 _GLF_uniform_int_values[3] # # precision highp float; # precision highp int; # # // Contents of _GLF_uniform_int_values: [1, 0, 10, 6] # layout(set = 0, binding = 0) uniform buf0 # { # int _GLF_uniform_int_values[4]; # }; # # const int _GLF_global_loop_bound = 10; # int _GLF_global_loop_count = 0; # # struct S # { # int data[10]; # }; # # layout(location = 0) out vec4 _GLF_color; # # void func() # { # int a = _int_1; # int b = _int_1; # # while (_GLF_global_loop_count < _GLF_global_loop_bound) # { # _GLF_global_loop_count ++; # # if(b == _int_6) # { # break; # } # # b++; # # // Always false. # if(int[10](_int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1)[a] == _int_0) # { # return; # } # } # } # # void main() # { # S obj = S(int[10](_int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0)); # # for(int i = _int_0; i < _int_10 && _GLF_global_loop_count < _GLF_global_loop_bound; i ++) # { # _GLF_global_loop_count ++; # # if(i == 0) # { # obj.data[i] = 1; # } # else if(i == 1) # { # // Calling func twice makes sure the global counter has reached its limit, and this # // loop will therefore end. # func(); # func(); # obj.data[i] = _int_1; # } # // Never executed. # else if(i == 4) # { # obj.data[i] = _int_1; # } # // Never executed. # else # { # discard; # } # } # # // Check results against reference values. # bool ok = true; # int ref[10] = int[10](_int_1, _int_1, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0); # # for(int i = 0; i < 10; i ++) # { # if(obj.data[i] != ref[i]) # { # ok = false; # } # } # # if(ok) # { # _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1); # } # else # { # _GLF_color = vec4(_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: 226 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %207 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 320 OpName %4 "main" OpName %6 "func(" OpName %10 "_GLF_global_loop_count" OpName %13 "a" OpName %17 "buf0" OpMemberName %17 0 "_GLF_uniform_int_values" OpName %19 "" OpName %23 "b" OpName %73 "indexable" OpName %82 "S" OpMemberName %82 0 "data" OpName %84 "obj" OpName %107 "i" OpName %157 "ok" OpName %159 "ref" OpName %181 "i" OpName %207 "_GLF_color" OpDecorate %16 ArrayStride 16 OpMemberDecorate %17 0 Offset 0 OpDecorate %17 Block OpDecorate %19 DescriptorSet 0 OpDecorate %19 Binding 0 OpDecorate %207 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %8 = OpTypeInt 32 1 %9 = OpTypePointer Private %8 %10 = OpVariable %9 Private %11 = OpConstant %8 0 %12 = OpTypePointer Function %8 %14 = OpTypeInt 32 0 %15 = OpConstant %14 4 %16 = OpTypeArray %8 %15 %17 = OpTypeStruct %16 %18 = OpTypePointer Uniform %17 %19 = OpVariable %18 Uniform %20 = OpTypePointer Uniform %8 %32 = OpConstant %8 10 %33 = OpTypeBool %36 = OpConstant %8 1 %39 = OpConstant %8 3 %68 = OpConstant %14 10 %69 = OpTypeArray %8 %68 %72 = OpTypePointer Function %69 %82 = OpTypeStruct %69 %83 = OpTypePointer Function %82 %116 = OpConstant %8 2 %144 = OpConstant %8 4 %156 = OpTypePointer Function %33 %158 = OpConstantTrue %33 %198 = OpConstantFalse %33 %204 = OpTypeFloat 32 %205 = OpTypeVector %204 4 %206 = OpTypePointer Output %205 %207 = OpVariable %206 Output %4 = OpFunction %2 None %3 %5 = OpLabel %84 = OpVariable %83 Function %107 = OpVariable %12 Function %157 = OpVariable %156 Function %159 = OpVariable %72 Function %181 = OpVariable %12 Function OpStore %10 %11 %85 = OpAccessChain %20 %19 %11 %36 %86 = OpLoad %8 %85 %87 = OpAccessChain %20 %19 %11 %36 %88 = OpLoad %8 %87 %89 = OpAccessChain %20 %19 %11 %36 %90 = OpLoad %8 %89 %91 = OpAccessChain %20 %19 %11 %36 %92 = OpLoad %8 %91 %93 = OpAccessChain %20 %19 %11 %36 %94 = OpLoad %8 %93 %95 = OpAccessChain %20 %19 %11 %36 %96 = OpLoad %8 %95 %97 = OpAccessChain %20 %19 %11 %36 %98 = OpLoad %8 %97 %99 = OpAccessChain %20 %19 %11 %36 %100 = OpLoad %8 %99 %101 = OpAccessChain %20 %19 %11 %36 %102 = OpLoad %8 %101 %103 = OpAccessChain %20 %19 %11 %36 %104 = OpLoad %8 %103 %105 = OpCompositeConstruct %69 %86 %88 %90 %92 %94 %96 %98 %100 %102 %104 %106 = OpCompositeConstruct %82 %105 OpStore %84 %106 %108 = OpAccessChain %20 %19 %11 %36 %109 = OpLoad %8 %108 OpStore %107 %109 OpBranch %110 %110 = OpLabel OpLoopMerge %112 %113 None OpBranch %114 %114 = OpLabel %115 = OpLoad %8 %107 %117 = OpAccessChain %20 %19 %11 %116 %118 = OpLoad %8 %117 %119 = OpSLessThan %33 %115 %118 %120 = OpLoad %8 %10 %121 = OpSLessThan %33 %120 %32 %122 = OpLogicalAnd %33 %119 %121 OpBranchConditional %122 %111 %112 %111 = OpLabel %123 = OpLoad %8 %10 %124 = OpIAdd %8 %123 %36 OpStore %10 %124 %125 = OpLoad %8 %107 %126 = OpIEqual %33 %125 %11 OpSelectionMerge %128 None OpBranchConditional %126 %127 %131 %127 = OpLabel %129 = OpLoad %8 %107 %130 = OpAccessChain %12 %84 %11 %129 OpStore %130 %36 OpBranch %128 %131 = OpLabel %132 = OpLoad %8 %107 %133 = OpIEqual %33 %132 %36 OpSelectionMerge %135 None OpBranchConditional %133 %134 %142 %134 = OpLabel %136 = OpFunctionCall %2 %6 %137 = OpFunctionCall %2 %6 %138 = OpLoad %8 %107 %139 = OpAccessChain %20 %19 %11 %11 %140 = OpLoad %8 %139 %141 = OpAccessChain %12 %84 %11 %138 OpStore %141 %140 OpBranch %135 %142 = OpLabel %143 = OpLoad %8 %107 %145 = OpIEqual %33 %143 %144 OpSelectionMerge %147 None OpBranchConditional %145 %146 %152 %146 = OpLabel %148 = OpLoad %8 %107 %149 = OpAccessChain %20 %19 %11 %11 %150 = OpLoad %8 %149 %151 = OpAccessChain %12 %84 %11 %148 OpStore %151 %150 OpBranch %147 %152 = OpLabel OpKill %147 = OpLabel OpBranch %135 %135 = OpLabel OpBranch %128 %128 = OpLabel OpBranch %113 %113 = OpLabel %154 = OpLoad %8 %107 %155 = OpIAdd %8 %154 %36 OpStore %107 %155 OpBranch %110 %112 = OpLabel OpStore %157 %158 %160 = OpAccessChain %20 %19 %11 %11 %161 = OpLoad %8 %160 %162 = OpAccessChain %20 %19 %11 %11 %163 = OpLoad %8 %162 %164 = OpAccessChain %20 %19 %11 %36 %165 = OpLoad %8 %164 %166 = OpAccessChain %20 %19 %11 %36 %167 = OpLoad %8 %166 %168 = OpAccessChain %20 %19 %11 %36 %169 = OpLoad %8 %168 %170 = OpAccessChain %20 %19 %11 %36 %171 = OpLoad %8 %170 %172 = OpAccessChain %20 %19 %11 %36 %173 = OpLoad %8 %172 %174 = OpAccessChain %20 %19 %11 %36 %175 = OpLoad %8 %174 %176 = OpAccessChain %20 %19 %11 %36 %177 = OpLoad %8 %176 %178 = OpAccessChain %20 %19 %11 %36 %179 = OpLoad %8 %178 %180 = OpCompositeConstruct %69 %161 %163 %165 %167 %169 %171 %173 %175 %177 %179 OpStore %159 %180 OpStore %181 %11 OpBranch %182 %182 = OpLabel OpLoopMerge %184 %185 None OpBranch %186 %186 = OpLabel %187 = OpLoad %8 %181 %188 = OpSLessThan %33 %187 %32 OpBranchConditional %188 %183 %184 %183 = OpLabel %189 = OpLoad %8 %181 %190 = OpAccessChain %12 %84 %11 %189 %191 = OpLoad %8 %190 %192 = OpLoad %8 %181 %193 = OpAccessChain %12 %159 %192 %194 = OpLoad %8 %193 %195 = OpINotEqual %33 %191 %194 OpSelectionMerge %197 None OpBranchConditional %195 %196 %197 %196 = OpLabel OpStore %157 %198 OpBranch %197 %197 = OpLabel OpBranch %185 %185 = OpLabel %199 = OpLoad %8 %181 %200 = OpIAdd %8 %199 %36 OpStore %181 %200 OpBranch %182 %184 = OpLabel %201 = OpLoad %33 %157 OpSelectionMerge %203 None OpBranchConditional %201 %202 %221 %202 = OpLabel %208 = OpAccessChain %20 %19 %11 %11 %209 = OpLoad %8 %208 %210 = OpConvertSToF %204 %209 %211 = OpAccessChain %20 %19 %11 %36 %212 = OpLoad %8 %211 %213 = OpConvertSToF %204 %212 %214 = OpAccessChain %20 %19 %11 %36 %215 = OpLoad %8 %214 %216 = OpConvertSToF %204 %215 %217 = OpAccessChain %20 %19 %11 %11 %218 = OpLoad %8 %217 %219 = OpConvertSToF %204 %218 %220 = OpCompositeConstruct %205 %210 %213 %216 %219 OpStore %207 %220 OpBranch %203 %221 = OpLabel %222 = OpAccessChain %20 %19 %11 %36 %223 = OpLoad %8 %222 %224 = OpConvertSToF %204 %223 %225 = OpCompositeConstruct %205 %224 %224 %224 %224 OpStore %207 %225 OpBranch %203 %203 = OpLabel OpReturn OpFunctionEnd %6 = OpFunction %2 None %3 %7 = OpLabel %13 = OpVariable %12 Function %23 = OpVariable %12 Function %73 = OpVariable %72 Function %21 = OpAccessChain %20 %19 %11 %11 %22 = OpLoad %8 %21 OpStore %13 %22 %24 = OpAccessChain %20 %19 %11 %11 %25 = OpLoad %8 %24 OpStore %23 %25 OpBranch %26 %26 = OpLabel OpLoopMerge %28 %29 None OpBranch %30 %30 = OpLabel %31 = OpLoad %8 %10 %34 = OpSLessThan %33 %31 %32 OpBranchConditional %34 %27 %28 %27 = OpLabel %35 = OpLoad %8 %10 %37 = OpIAdd %8 %35 %36 OpStore %10 %37 %38 = OpLoad %8 %23 %40 = OpAccessChain %20 %19 %11 %39 %41 = OpLoad %8 %40 %42 = OpIEqual %33 %38 %41 OpSelectionMerge %44 None OpBranchConditional %42 %43 %44 %43 = OpLabel OpBranch %28 %44 = OpLabel %46 = OpLoad %8 %23 %47 = OpIAdd %8 %46 %36 OpStore %23 %47 %48 = OpAccessChain %20 %19 %11 %11 %49 = OpLoad %8 %48 %50 = OpAccessChain %20 %19 %11 %11 %51 = OpLoad %8 %50 %52 = OpAccessChain %20 %19 %11 %11 %53 = OpLoad %8 %52 %54 = OpAccessChain %20 %19 %11 %11 %55 = OpLoad %8 %54 %56 = OpAccessChain %20 %19 %11 %11 %57 = OpLoad %8 %56 %58 = OpAccessChain %20 %19 %11 %11 %59 = OpLoad %8 %58 %60 = OpAccessChain %20 %19 %11 %11 %61 = OpLoad %8 %60 %62 = OpAccessChain %20 %19 %11 %11 %63 = OpLoad %8 %62 %64 = OpAccessChain %20 %19 %11 %11 %65 = OpLoad %8 %64 %66 = OpAccessChain %20 %19 %11 %11 %67 = OpLoad %8 %66 %70 = OpCompositeConstruct %69 %49 %51 %53 %55 %57 %59 %61 %63 %65 %67 %71 = OpLoad %8 %13 OpStore %73 %70 %74 = OpAccessChain %12 %73 %71 %75 = OpLoad %8 %74 %76 = OpAccessChain %20 %19 %11 %36 %77 = OpLoad %8 %76 %78 = OpIEqual %33 %75 %77 OpSelectionMerge %80 None OpBranchConditional %78 %79 %80 %79 = OpLabel OpReturn %80 = OpLabel OpBranch %29 %29 = OpLabel OpBranch %26 %28 = OpLabel OpReturn OpFunctionEnd END # uniforms for variant # _GLF_uniform_int_values BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 1 0 10 6 END BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM PIPELINE graphics variant_pipeline ATTACH variant_vertex_shader ATTACH variant_fragment_shader FRAMEBUFFER_SIZE 256 256 BIND BUFFER variant_framebuffer AS color LOCATION 0 BIND BUFFER variant__GLF_uniform_int_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 256 256 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255