#!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 calculates negation of clamped loop iterator values # 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 310 es # #define _int_0 _GLF_uniform_int_values[0] # #define _int_1 _GLF_uniform_int_values[1] # #define _int_2 _GLF_uniform_int_values[2] # #define _int_3 _GLF_uniform_int_values[3] # #define _int_4 _GLF_uniform_int_values[4] # #define _int_5 _GLF_uniform_int_values[5] # #define _int_10 _GLF_uniform_int_values[6] # #define _int_15 _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_11 _GLF_uniform_int_values[12] # #define _int_12 _GLF_uniform_int_values[13] # #define _int_13 _GLF_uniform_int_values[14] # #define _int_14 _GLF_uniform_int_values[15] # # precision highp float; # precision highp int; # # // Contents of _GLF_uniform_int_values: [0, 1, 2, 3, 4, 5, 10, 15, 6, 7, 8, 9, # // 11, 12, 13, 14] # layout(set = 0, binding = 0) uniform buf0 # { # int _GLF_uniform_int_values[16]; # }; # # layout(location = 0) out vec4 _GLF_color; # # void main() # { # int data[15]; # int ref[15]; # ref[_int_0] = _int_0; # ref[_int_1] = _int_1; # ref[_int_2] = _int_2; # ref[_int_3] = _int_3; # ref[_int_4] = _int_4; # ref[_int_5] = -_int_1; # ref[_int_6] = -_int_1; # ref[_int_7] = -_int_1; # ref[_int_8] = -_int_1; # ref[_int_9] = -_int_1; # ref[_int_10] = -_int_2; # ref[_int_11] = -_int_2; # ref[_int_12] = -_int_2; # ref[_int_13] = -_int_2; # ref[_int_14] = -_int_2; # # for (int i = 0; i < _int_5; i++) # { # data[i] = ~clamp(~i, ~i, _int_1); # } # for (int i = _int_5; i < _int_10; i++) # { # data[i] = ~clamp(~i, 0, 1); # } # for (int i = _int_10; i < _int_15; i++) # { # data[i] = ~clamp(i, 0, 1); # } # for (int i = _int_0; i < _int_15; i++) # { # if (data[i] != ref[i]) # { # _GLF_color = vec4(_int_0); # return; # } # } # # _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; 8 ; Bound: 228 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %207 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 310 OpName %4 "main" OpName %11 "ref" OpName %14 "buf0" OpMemberName %14 0 "_GLF_uniform_int_values" OpName %16 "" OpName %119 "i" OpName %130 "data" OpName %143 "i" OpName %163 "i" OpName %183 "i" OpName %207 "_GLF_color" OpDecorate %13 ArrayStride 16 OpMemberDecorate %14 0 Offset 0 OpDecorate %14 Block OpDecorate %16 DescriptorSet 0 OpDecorate %16 Binding 0 OpDecorate %207 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeInt 32 1 %7 = OpTypeInt 32 0 %8 = OpConstant %7 15 %9 = OpTypeArray %6 %8 %10 = OpTypePointer Function %9 %12 = OpConstant %7 16 %13 = OpTypeArray %6 %12 %14 = OpTypeStruct %13 %15 = OpTypePointer Uniform %14 %16 = OpVariable %15 Uniform %17 = OpConstant %6 0 %18 = OpTypePointer Uniform %6 %23 = OpTypePointer Function %6 %25 = OpConstant %6 1 %31 = OpConstant %6 2 %37 = OpConstant %6 3 %43 = OpConstant %6 4 %49 = OpConstant %6 5 %56 = OpConstant %6 8 %63 = OpConstant %6 9 %70 = OpConstant %6 10 %77 = OpConstant %6 11 %84 = OpConstant %6 6 %91 = OpConstant %6 12 %98 = OpConstant %6 13 %105 = OpConstant %6 14 %112 = OpConstant %6 15 %128 = OpTypeBool %172 = OpConstant %6 7 %204 = OpTypeFloat 32 %205 = OpTypeVector %204 4 %206 = OpTypePointer Output %205 %207 = OpVariable %206 Output %4 = OpFunction %2 None %3 %5 = OpLabel %11 = OpVariable %10 Function %119 = OpVariable %23 Function %130 = OpVariable %10 Function %143 = OpVariable %23 Function %163 = OpVariable %23 Function %183 = OpVariable %23 Function %19 = OpAccessChain %18 %16 %17 %17 %20 = OpLoad %6 %19 %21 = OpAccessChain %18 %16 %17 %17 %22 = OpLoad %6 %21 %24 = OpAccessChain %23 %11 %20 OpStore %24 %22 %26 = OpAccessChain %18 %16 %17 %25 %27 = OpLoad %6 %26 %28 = OpAccessChain %18 %16 %17 %25 %29 = OpLoad %6 %28 %30 = OpAccessChain %23 %11 %27 OpStore %30 %29 %32 = OpAccessChain %18 %16 %17 %31 %33 = OpLoad %6 %32 %34 = OpAccessChain %18 %16 %17 %31 %35 = OpLoad %6 %34 %36 = OpAccessChain %23 %11 %33 OpStore %36 %35 %38 = OpAccessChain %18 %16 %17 %37 %39 = OpLoad %6 %38 %40 = OpAccessChain %18 %16 %17 %37 %41 = OpLoad %6 %40 %42 = OpAccessChain %23 %11 %39 OpStore %42 %41 %44 = OpAccessChain %18 %16 %17 %43 %45 = OpLoad %6 %44 %46 = OpAccessChain %18 %16 %17 %43 %47 = OpLoad %6 %46 %48 = OpAccessChain %23 %11 %45 OpStore %48 %47 %50 = OpAccessChain %18 %16 %17 %49 %51 = OpLoad %6 %50 %52 = OpAccessChain %18 %16 %17 %25 %53 = OpLoad %6 %52 %54 = OpSNegate %6 %53 %55 = OpAccessChain %23 %11 %51 OpStore %55 %54 %57 = OpAccessChain %18 %16 %17 %56 %58 = OpLoad %6 %57 %59 = OpAccessChain %18 %16 %17 %25 %60 = OpLoad %6 %59 %61 = OpSNegate %6 %60 %62 = OpAccessChain %23 %11 %58 OpStore %62 %61 %64 = OpAccessChain %18 %16 %17 %63 %65 = OpLoad %6 %64 %66 = OpAccessChain %18 %16 %17 %25 %67 = OpLoad %6 %66 %68 = OpSNegate %6 %67 %69 = OpAccessChain %23 %11 %65 OpStore %69 %68 %71 = OpAccessChain %18 %16 %17 %70 %72 = OpLoad %6 %71 %73 = OpAccessChain %18 %16 %17 %25 %74 = OpLoad %6 %73 %75 = OpSNegate %6 %74 %76 = OpAccessChain %23 %11 %72 OpStore %76 %75 %78 = OpAccessChain %18 %16 %17 %77 %79 = OpLoad %6 %78 %80 = OpAccessChain %18 %16 %17 %25 %81 = OpLoad %6 %80 %82 = OpSNegate %6 %81 %83 = OpAccessChain %23 %11 %79 OpStore %83 %82 %85 = OpAccessChain %18 %16 %17 %84 %86 = OpLoad %6 %85 %87 = OpAccessChain %18 %16 %17 %31 %88 = OpLoad %6 %87 %89 = OpSNegate %6 %88 %90 = OpAccessChain %23 %11 %86 OpStore %90 %89 %92 = OpAccessChain %18 %16 %17 %91 %93 = OpLoad %6 %92 %94 = OpAccessChain %18 %16 %17 %31 %95 = OpLoad %6 %94 %96 = OpSNegate %6 %95 %97 = OpAccessChain %23 %11 %93 OpStore %97 %96 %99 = OpAccessChain %18 %16 %17 %98 %100 = OpLoad %6 %99 %101 = OpAccessChain %18 %16 %17 %31 %102 = OpLoad %6 %101 %103 = OpSNegate %6 %102 %104 = OpAccessChain %23 %11 %100 OpStore %104 %103 %106 = OpAccessChain %18 %16 %17 %105 %107 = OpLoad %6 %106 %108 = OpAccessChain %18 %16 %17 %31 %109 = OpLoad %6 %108 %110 = OpSNegate %6 %109 %111 = OpAccessChain %23 %11 %107 OpStore %111 %110 %113 = OpAccessChain %18 %16 %17 %112 %114 = OpLoad %6 %113 %115 = OpAccessChain %18 %16 %17 %31 %116 = OpLoad %6 %115 %117 = OpSNegate %6 %116 %118 = OpAccessChain %23 %11 %114 OpStore %118 %117 OpStore %119 %17 OpBranch %120 %120 = OpLabel OpLoopMerge %122 %123 None OpBranch %124 %124 = OpLabel %125 = OpLoad %6 %119 %126 = OpAccessChain %18 %16 %17 %49 %127 = OpLoad %6 %126 %129 = OpSLessThan %128 %125 %127 OpBranchConditional %129 %121 %122 %121 = OpLabel %131 = OpLoad %6 %119 %132 = OpLoad %6 %119 %133 = OpNot %6 %132 %134 = OpLoad %6 %119 %135 = OpNot %6 %134 %136 = OpAccessChain %18 %16 %17 %25 %137 = OpLoad %6 %136 %138 = OpExtInst %6 %1 SClamp %133 %135 %137 %139 = OpNot %6 %138 %140 = OpAccessChain %23 %130 %131 OpStore %140 %139 OpBranch %123 %123 = OpLabel %141 = OpLoad %6 %119 %142 = OpIAdd %6 %141 %25 OpStore %119 %142 OpBranch %120 %122 = OpLabel %144 = OpAccessChain %18 %16 %17 %49 %145 = OpLoad %6 %144 OpStore %143 %145 OpBranch %146 %146 = OpLabel OpLoopMerge %148 %149 None OpBranch %150 %150 = OpLabel %151 = OpLoad %6 %143 %152 = OpAccessChain %18 %16 %17 %84 %153 = OpLoad %6 %152 %154 = OpSLessThan %128 %151 %153 OpBranchConditional %154 %147 %148 %147 = OpLabel %155 = OpLoad %6 %143 %156 = OpLoad %6 %143 %157 = OpNot %6 %156 %158 = OpExtInst %6 %1 SClamp %157 %17 %25 %159 = OpNot %6 %158 %160 = OpAccessChain %23 %130 %155 OpStore %160 %159 OpBranch %149 %149 = OpLabel %161 = OpLoad %6 %143 %162 = OpIAdd %6 %161 %25 OpStore %143 %162 OpBranch %146 %148 = OpLabel %164 = OpAccessChain %18 %16 %17 %84 %165 = OpLoad %6 %164 OpStore %163 %165 OpBranch %166 %166 = OpLabel OpLoopMerge %168 %169 None OpBranch %170 %170 = OpLabel %171 = OpLoad %6 %163 %173 = OpAccessChain %18 %16 %17 %172 %174 = OpLoad %6 %173 %175 = OpSLessThan %128 %171 %174 OpBranchConditional %175 %167 %168 %167 = OpLabel %176 = OpLoad %6 %163 %177 = OpLoad %6 %163 %178 = OpExtInst %6 %1 SClamp %177 %17 %25 %179 = OpNot %6 %178 %180 = OpAccessChain %23 %130 %176 OpStore %180 %179 OpBranch %169 %169 = OpLabel %181 = OpLoad %6 %163 %182 = OpIAdd %6 %181 %25 OpStore %163 %182 OpBranch %166 %168 = OpLabel %184 = OpAccessChain %18 %16 %17 %17 %185 = OpLoad %6 %184 OpStore %183 %185 OpBranch %186 %186 = OpLabel OpLoopMerge %188 %189 None OpBranch %190 %190 = OpLabel %191 = OpLoad %6 %183 %192 = OpAccessChain %18 %16 %17 %172 %193 = OpLoad %6 %192 %194 = OpSLessThan %128 %191 %193 OpBranchConditional %194 %187 %188 %187 = OpLabel %195 = OpLoad %6 %183 %196 = OpAccessChain %23 %130 %195 %197 = OpLoad %6 %196 %198 = OpLoad %6 %183 %199 = OpAccessChain %23 %11 %198 %200 = OpLoad %6 %199 %201 = OpINotEqual %128 %197 %200 OpSelectionMerge %203 None OpBranchConditional %201 %202 %203 %202 = OpLabel %208 = OpAccessChain %18 %16 %17 %17 %209 = OpLoad %6 %208 %210 = OpConvertSToF %204 %209 %211 = OpCompositeConstruct %205 %210 %210 %210 %210 OpStore %207 %211 OpReturn %203 = OpLabel OpBranch %189 %189 = OpLabel %213 = OpLoad %6 %183 %214 = OpIAdd %6 %213 %25 OpStore %183 %214 OpBranch %186 %188 = OpLabel %215 = OpAccessChain %18 %16 %17 %25 %216 = OpLoad %6 %215 %217 = OpConvertSToF %204 %216 %218 = OpAccessChain %18 %16 %17 %17 %219 = OpLoad %6 %218 %220 = OpConvertSToF %204 %219 %221 = OpAccessChain %18 %16 %17 %17 %222 = OpLoad %6 %221 %223 = OpConvertSToF %204 %222 %224 = OpAccessChain %18 %16 %17 %25 %225 = OpLoad %6 %224 %226 = OpConvertSToF %204 %225 %227 = OpCompositeConstruct %205 %217 %220 %223 %226 OpStore %207 %227 OpReturn OpFunctionEnd END # uniforms for variant # _GLF_uniform_int_values BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA 0 1 2 3 4 5 10 15 6 7 8 9 11 12 13 14 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