#!amber # Copyright 2020 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 a specific nir path # 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_100 _GLF_uniform_int_values[0] # #define _int_17 _GLF_uniform_int_values[1] # #define _int_0 _GLF_uniform_int_values[2] # #define _int_1 _GLF_uniform_int_values[3] # #define _int_2 _GLF_uniform_int_values[4] # #define _int_3 _GLF_uniform_int_values[5] # #define _int_4 _GLF_uniform_int_values[6] # #define _int_5 _GLF_uniform_int_values[7] # #define _int_6 _GLF_uniform_int_values[8] # #define _int_7 _GLF_uniform_int_values[9] # #define _int_8 _GLF_uniform_int_values[10] # #define _int_9 _GLF_uniform_int_values[11] # #define _int_10 _GLF_uniform_int_values[12] # #define _int_11 _GLF_uniform_int_values[13] # #define _int_12 _GLF_uniform_int_values[14] # #define _int_13 _GLF_uniform_int_values[15] # #define _int_14 _GLF_uniform_int_values[16] # #define _int_15 _GLF_uniform_int_values[17] # #define _int_16 _GLF_uniform_int_values[18] # # precision highp int; # # precision highp float; # # // Contents of _GLF_uniform_int_values: # // [100, 17, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] # layout(set = 0, binding = 0) uniform buf0 # { # int _GLF_uniform_int_values[19]; # }; # layout(location = 0) out vec4 _GLF_color; # # void main() # { # int A[17] = int[17](_int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, # _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, _int_0, # _int_0, _int_0, _int_0); # int ref[17] = int[17](_int_1, _int_2, _int_3, _int_4, _int_5, _int_6, # _int_7, _int_8, _int_9, _int_10, _int_11, _int_12, # _int_13, _int_14, _int_15, _int_16, _int_17); # # int a = _int_0; # for (int i = _int_0; i < _int_17; i++) # { # A[i] = a--; # A[clamp(i, _int_0, _int_16)] = i + _int_1; # } # # bool ok = true; # for (int i = _int_0; i < _int_17; i++) # { # if (A[i] != ref[i]) # ok = false; # } # # _GLF_color = vec4(_int_0); # # if (ok) # _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1); # } SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 ; SPIR-V ; Version: 1.0 ; Generator: Khronos Glslang Reference Front End; 10 ; Bound: 193 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %172 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 320 OpName %4 "main" OpName %11 "A" OpName %14 "buf0" OpMemberName %14 0 "_GLF_uniform_int_values" OpName %16 "" OpName %55 "ref" OpName %109 "a" OpName %112 "i" OpName %143 "ok" OpName %145 "i" OpName %172 "_GLF_color" OpDecorate %13 ArrayStride 16 OpMemberDecorate %14 0 Offset 0 OpDecorate %14 Block OpDecorate %16 DescriptorSet 0 OpDecorate %16 Binding 0 OpDecorate %172 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeInt 32 1 %7 = OpTypeInt 32 0 %8 = OpConstant %7 17 %9 = OpTypeArray %6 %8 %10 = OpTypePointer Function %9 %12 = OpConstant %7 19 %13 = OpTypeArray %6 %12 %14 = OpTypeStruct %13 %15 = OpTypePointer Uniform %14 %16 = OpVariable %15 Uniform %17 = OpConstant %6 0 %18 = OpConstant %6 2 %19 = OpTypePointer Uniform %6 %56 = OpConstant %6 3 %59 = OpConstant %6 4 %62 = OpConstant %6 5 %65 = OpConstant %6 6 %68 = OpConstant %6 7 %71 = OpConstant %6 8 %74 = OpConstant %6 9 %77 = OpConstant %6 10 %80 = OpConstant %6 11 %83 = OpConstant %6 12 %86 = OpConstant %6 13 %89 = OpConstant %6 14 %92 = OpConstant %6 15 %95 = OpConstant %6 16 %98 = OpConstant %6 17 %101 = OpConstant %6 18 %104 = OpConstant %6 1 %108 = OpTypePointer Function %6 %123 = OpTypeBool %142 = OpTypePointer Function %123 %144 = OpConstantTrue %123 %166 = OpConstantFalse %123 %169 = OpTypeFloat 32 %170 = OpTypeVector %169 4 %171 = OpTypePointer Output %170 %172 = OpVariable %171 Output %4 = OpFunction %2 None %3 %5 = OpLabel %11 = OpVariable %10 Function %55 = OpVariable %10 Function %109 = OpVariable %108 Function %112 = OpVariable %108 Function %143 = OpVariable %142 Function %145 = OpVariable %108 Function %20 = OpAccessChain %19 %16 %17 %18 %21 = OpLoad %6 %20 %22 = OpAccessChain %19 %16 %17 %18 %23 = OpLoad %6 %22 %24 = OpAccessChain %19 %16 %17 %18 %25 = OpLoad %6 %24 %26 = OpAccessChain %19 %16 %17 %18 %27 = OpLoad %6 %26 %28 = OpAccessChain %19 %16 %17 %18 %29 = OpLoad %6 %28 %30 = OpAccessChain %19 %16 %17 %18 %31 = OpLoad %6 %30 %32 = OpAccessChain %19 %16 %17 %18 %33 = OpLoad %6 %32 %34 = OpAccessChain %19 %16 %17 %18 %35 = OpLoad %6 %34 %36 = OpAccessChain %19 %16 %17 %18 %37 = OpLoad %6 %36 %38 = OpAccessChain %19 %16 %17 %18 %39 = OpLoad %6 %38 %40 = OpAccessChain %19 %16 %17 %18 %41 = OpLoad %6 %40 %42 = OpAccessChain %19 %16 %17 %18 %43 = OpLoad %6 %42 %44 = OpAccessChain %19 %16 %17 %18 %45 = OpLoad %6 %44 %46 = OpAccessChain %19 %16 %17 %18 %47 = OpLoad %6 %46 %48 = OpAccessChain %19 %16 %17 %18 %49 = OpLoad %6 %48 %50 = OpAccessChain %19 %16 %17 %18 %51 = OpLoad %6 %50 %52 = OpAccessChain %19 %16 %17 %18 %53 = OpLoad %6 %52 %54 = OpCompositeConstruct %9 %21 %23 %25 %27 %29 %31 %33 %35 %37 %39 %41 %43 %45 %47 %49 %51 %53 OpStore %11 %54 %57 = OpAccessChain %19 %16 %17 %56 %58 = OpLoad %6 %57 %60 = OpAccessChain %19 %16 %17 %59 %61 = OpLoad %6 %60 %63 = OpAccessChain %19 %16 %17 %62 %64 = OpLoad %6 %63 %66 = OpAccessChain %19 %16 %17 %65 %67 = OpLoad %6 %66 %69 = OpAccessChain %19 %16 %17 %68 %70 = OpLoad %6 %69 %72 = OpAccessChain %19 %16 %17 %71 %73 = OpLoad %6 %72 %75 = OpAccessChain %19 %16 %17 %74 %76 = OpLoad %6 %75 %78 = OpAccessChain %19 %16 %17 %77 %79 = OpLoad %6 %78 %81 = OpAccessChain %19 %16 %17 %80 %82 = OpLoad %6 %81 %84 = OpAccessChain %19 %16 %17 %83 %85 = OpLoad %6 %84 %87 = OpAccessChain %19 %16 %17 %86 %88 = OpLoad %6 %87 %90 = OpAccessChain %19 %16 %17 %89 %91 = OpLoad %6 %90 %93 = OpAccessChain %19 %16 %17 %92 %94 = OpLoad %6 %93 %96 = OpAccessChain %19 %16 %17 %95 %97 = OpLoad %6 %96 %99 = OpAccessChain %19 %16 %17 %98 %100 = OpLoad %6 %99 %102 = OpAccessChain %19 %16 %17 %101 %103 = OpLoad %6 %102 %105 = OpAccessChain %19 %16 %17 %104 %106 = OpLoad %6 %105 %107 = OpCompositeConstruct %9 %58 %61 %64 %67 %70 %73 %76 %79 %82 %85 %88 %91 %94 %97 %100 %103 %106 OpStore %55 %107 %110 = OpAccessChain %19 %16 %17 %18 %111 = OpLoad %6 %110 OpStore %109 %111 %113 = OpAccessChain %19 %16 %17 %18 %114 = OpLoad %6 %113 OpStore %112 %114 OpBranch %115 %115 = OpLabel OpLoopMerge %117 %118 None OpBranch %119 %119 = OpLabel %120 = OpLoad %6 %112 %121 = OpAccessChain %19 %16 %17 %104 %122 = OpLoad %6 %121 %124 = OpSLessThan %123 %120 %122 OpBranchConditional %124 %116 %117 %116 = OpLabel %125 = OpLoad %6 %112 %126 = OpLoad %6 %109 %127 = OpISub %6 %126 %104 OpStore %109 %127 %128 = OpAccessChain %108 %11 %125 OpStore %128 %126 %129 = OpLoad %6 %112 %130 = OpAccessChain %19 %16 %17 %18 %131 = OpLoad %6 %130 %132 = OpAccessChain %19 %16 %17 %101 %133 = OpLoad %6 %132 %134 = OpExtInst %6 %1 SClamp %129 %131 %133 %135 = OpLoad %6 %112 %136 = OpAccessChain %19 %16 %17 %56 %137 = OpLoad %6 %136 %138 = OpIAdd %6 %135 %137 %139 = OpAccessChain %108 %11 %134 OpStore %139 %138 OpBranch %118 %118 = OpLabel %140 = OpLoad %6 %112 %141 = OpIAdd %6 %140 %104 OpStore %112 %141 OpBranch %115 %117 = OpLabel OpStore %143 %144 %146 = OpAccessChain %19 %16 %17 %18 %147 = OpLoad %6 %146 OpStore %145 %147 OpBranch %148 %148 = OpLabel OpLoopMerge %150 %151 None OpBranch %152 %152 = OpLabel %153 = OpLoad %6 %145 %154 = OpAccessChain %19 %16 %17 %104 %155 = OpLoad %6 %154 %156 = OpSLessThan %123 %153 %155 OpBranchConditional %156 %149 %150 %149 = OpLabel %157 = OpLoad %6 %145 %158 = OpAccessChain %108 %11 %157 %159 = OpLoad %6 %158 %160 = OpLoad %6 %145 %161 = OpAccessChain %108 %55 %160 %162 = OpLoad %6 %161 %163 = OpINotEqual %123 %159 %162 OpSelectionMerge %165 None OpBranchConditional %163 %164 %165 %164 = OpLabel OpStore %143 %166 OpBranch %165 %165 = OpLabel OpBranch %151 %151 = OpLabel %167 = OpLoad %6 %145 %168 = OpIAdd %6 %167 %104 OpStore %145 %168 OpBranch %148 %150 = OpLabel %173 = OpAccessChain %19 %16 %17 %18 %174 = OpLoad %6 %173 %175 = OpConvertSToF %169 %174 %176 = OpCompositeConstruct %170 %175 %175 %175 %175 OpStore %172 %176 %177 = OpLoad %123 %143 OpSelectionMerge %179 None OpBranchConditional %177 %178 %179 %178 = OpLabel %180 = OpAccessChain %19 %16 %17 %56 %181 = OpLoad %6 %180 %182 = OpConvertSToF %169 %181 %183 = OpAccessChain %19 %16 %17 %18 %184 = OpLoad %6 %183 %185 = OpConvertSToF %169 %184 %186 = OpAccessChain %19 %16 %17 %18 %187 = OpLoad %6 %186 %188 = OpConvertSToF %169 %187 %189 = OpAccessChain %19 %16 %17 %56 %190 = OpLoad %6 %189 %191 = OpConvertSToF %169 %190 %192 = OpCompositeConstruct %170 %182 %185 %188 %191 OpStore %172 %192 OpBranch %179 %179 = OpLabel OpReturn OpFunctionEnd END # uniforms for variant # _GLF_uniform_int_values BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 100 17 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 END BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM PIPELINE graphics variant_pipeline ATTACH variant_vertex_shader ATTACH variant_fragment_shader FRAMEBUFFER_SIZE 16 16 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 16 16 EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255