blob: 5e9c459a633e28603ffaa1289c64bca2d92bc4f9 [file] [log] [blame]
#!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_2 _GLF_uniform_int_values[2]
# #define _int_9 _GLF_uniform_int_values[3]
# #define _int_20 _GLF_uniform_int_values[4]
# #define _int_29 _GLF_uniform_int_values[5]
#
# precision highp float;
# precision highp int;
#
# // Contents of _GLF_uniform_int_values: [1, 0, 2, 9, 20, 29]
# layout(set = 0, binding = 0) uniform buf0
# {
# int _GLF_uniform_int_values[6];
# };
# layout(location = 0) out vec4 _GLF_color;
#
# // A void function that only touches local variables and returns.
# void func()
# {
# int index = _int_0;
#
# while(true)
# {
# int a = int[10](_int_1, _int_2, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1)[index];
#
# if(a == _int_2)
# {
# // Executed during the second iteration.
# return;
# }
#
# index = _int_1;
# }
# }
# void main()
# {
# int a = _int_0;
#
# for(int i = _int_0; i < _int_20; i ++)
# {
# // Doesn't have any effect.
# func();
# a = i;
#
# int arr[9] = int[9](_int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1);
#
# // The array is never read so we don't care if the elements get incremented or not.
# // The loop increments a by 10 in total.
# for(int j = 0; j < 10; j ++)
# {
# arr[clamp(a, _int_0, 8)] = _int_1;
#
# switch(i)
# {
# case 0:
# arr[clamp(a, 0, 8)]++;
# case 8:
# arr[clamp(a, 0, 8)]++;
# }
# a++;
# }
# }
#
# // Always true.
# if(a == _int_29)
# {
# _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: 176
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %4 "main" %157
OpExecutionMode %4 OriginUpperLeft
OpSource ESSL 320
OpName %4 "main"
OpName %6 "func("
OpName %10 "index"
OpName %14 "buf0"
OpMemberName %14 0 "_GLF_uniform_int_values"
OpName %16 ""
OpName %29 "a"
OpName %56 "indexable"
OpName %68 "a"
OpName %71 "i"
OpName %89 "arr"
OpName %109 "j"
OpName %157 "_GLF_color"
OpDecorate %13 ArrayStride 16
OpMemberDecorate %14 0 Offset 0
OpDecorate %14 Block
OpDecorate %16 DescriptorSet 0
OpDecorate %16 Binding 0
OpDecorate %157 Location 0
%2 = OpTypeVoid
%3 = OpTypeFunction %2
%8 = OpTypeInt 32 1
%9 = OpTypePointer Function %8
%11 = OpTypeInt 32 0
%12 = OpConstant %11 6
%13 = OpTypeArray %8 %12
%14 = OpTypeStruct %13
%15 = OpTypePointer Uniform %14
%16 = OpVariable %15 Uniform
%17 = OpConstant %8 0
%18 = OpConstant %8 1
%19 = OpTypePointer Uniform %8
%27 = OpTypeBool
%28 = OpConstantTrue %27
%32 = OpConstant %8 2
%51 = OpConstant %11 10
%52 = OpTypeArray %8 %51
%55 = OpTypePointer Function %52
%80 = OpConstant %8 4
%86 = OpConstant %11 9
%87 = OpTypeArray %8 %86
%88 = OpTypePointer Function %87
%116 = OpConstant %8 10
%121 = OpConstant %8 8
%148 = OpConstant %8 5
%154 = OpTypeFloat 32
%155 = OpTypeVector %154 4
%156 = OpTypePointer Output %155
%157 = OpVariable %156 Output
%4 = OpFunction %2 None %3
%5 = OpLabel
%68 = OpVariable %9 Function
%71 = OpVariable %9 Function
%89 = OpVariable %88 Function
%109 = OpVariable %9 Function
%69 = OpAccessChain %19 %16 %17 %18
%70 = OpLoad %8 %69
OpStore %68 %70
%72 = OpAccessChain %19 %16 %17 %18
%73 = OpLoad %8 %72
OpStore %71 %73
OpBranch %74
%74 = OpLabel
OpLoopMerge %76 %77 None
OpBranch %78
%78 = OpLabel
%79 = OpLoad %8 %71
%81 = OpAccessChain %19 %16 %17 %80
%82 = OpLoad %8 %81
%83 = OpSLessThan %27 %79 %82
OpBranchConditional %83 %75 %76
%75 = OpLabel
%84 = OpFunctionCall %2 %6
%85 = OpLoad %8 %71
OpStore %68 %85
%90 = OpAccessChain %19 %16 %17 %17
%91 = OpLoad %8 %90
%92 = OpAccessChain %19 %16 %17 %17
%93 = OpLoad %8 %92
%94 = OpAccessChain %19 %16 %17 %17
%95 = OpLoad %8 %94
%96 = OpAccessChain %19 %16 %17 %17
%97 = OpLoad %8 %96
%98 = OpAccessChain %19 %16 %17 %17
%99 = OpLoad %8 %98
%100 = OpAccessChain %19 %16 %17 %17
%101 = OpLoad %8 %100
%102 = OpAccessChain %19 %16 %17 %17
%103 = OpLoad %8 %102
%104 = OpAccessChain %19 %16 %17 %17
%105 = OpLoad %8 %104
%106 = OpAccessChain %19 %16 %17 %17
%107 = OpLoad %8 %106
%108 = OpCompositeConstruct %87 %91 %93 %95 %97 %99 %101 %103 %105 %107
OpStore %89 %108
OpStore %109 %17
OpBranch %110
%110 = OpLabel
OpLoopMerge %112 %113 None
OpBranch %114
%114 = OpLabel
%115 = OpLoad %8 %109
%117 = OpSLessThan %27 %115 %116
OpBranchConditional %117 %111 %112
%111 = OpLabel
%118 = OpLoad %8 %68
%119 = OpAccessChain %19 %16 %17 %18
%120 = OpLoad %8 %119
%122 = OpExtInst %8 %1 SClamp %118 %120 %121
%123 = OpAccessChain %19 %16 %17 %17
%124 = OpLoad %8 %123
%125 = OpAccessChain %9 %89 %122
OpStore %125 %124
%126 = OpLoad %8 %71
OpSelectionMerge %129 None
OpSwitch %126 %129 0 %127 8 %128
%127 = OpLabel
%130 = OpLoad %8 %68
%131 = OpExtInst %8 %1 SClamp %130 %17 %121
%132 = OpAccessChain %9 %89 %131
%133 = OpLoad %8 %132
%134 = OpIAdd %8 %133 %18
OpStore %132 %134
OpBranch %128
%128 = OpLabel
%135 = OpLoad %8 %68
%136 = OpExtInst %8 %1 SClamp %135 %17 %121
%137 = OpAccessChain %9 %89 %136
%138 = OpLoad %8 %137
%139 = OpIAdd %8 %138 %18
OpStore %137 %139
OpBranch %129
%129 = OpLabel
%141 = OpLoad %8 %68
%142 = OpIAdd %8 %141 %18
OpStore %68 %142
OpBranch %113
%113 = OpLabel
%143 = OpLoad %8 %109
%144 = OpIAdd %8 %143 %18
OpStore %109 %144
OpBranch %110
%112 = OpLabel
OpBranch %77
%77 = OpLabel
%145 = OpLoad %8 %71
%146 = OpIAdd %8 %145 %18
OpStore %71 %146
OpBranch %74
%76 = OpLabel
%147 = OpLoad %8 %68
%149 = OpAccessChain %19 %16 %17 %148
%150 = OpLoad %8 %149
%151 = OpIEqual %27 %147 %150
OpSelectionMerge %153 None
OpBranchConditional %151 %152 %171
%152 = OpLabel
%158 = OpAccessChain %19 %16 %17 %17
%159 = OpLoad %8 %158
%160 = OpConvertSToF %154 %159
%161 = OpAccessChain %19 %16 %17 %18
%162 = OpLoad %8 %161
%163 = OpConvertSToF %154 %162
%164 = OpAccessChain %19 %16 %17 %18
%165 = OpLoad %8 %164
%166 = OpConvertSToF %154 %165
%167 = OpAccessChain %19 %16 %17 %17
%168 = OpLoad %8 %167
%169 = OpConvertSToF %154 %168
%170 = OpCompositeConstruct %155 %160 %163 %166 %169
OpStore %157 %170
OpBranch %153
%171 = OpLabel
%172 = OpAccessChain %19 %16 %17 %18
%173 = OpLoad %8 %172
%174 = OpConvertSToF %154 %173
%175 = OpCompositeConstruct %155 %174 %174 %174 %174
OpStore %157 %175
OpBranch %153
%153 = OpLabel
OpReturn
OpFunctionEnd
%6 = OpFunction %2 None %3
%7 = OpLabel
%10 = OpVariable %9 Function
%29 = OpVariable %9 Function
%56 = OpVariable %55 Function
%20 = OpAccessChain %19 %16 %17 %18
%21 = OpLoad %8 %20
OpStore %10 %21
OpBranch %22
%22 = OpLabel
OpLoopMerge %24 %25 None
OpBranch %26
%26 = OpLabel
OpBranchConditional %28 %23 %24
%23 = OpLabel
%30 = OpAccessChain %19 %16 %17 %17
%31 = OpLoad %8 %30
%33 = OpAccessChain %19 %16 %17 %32
%34 = OpLoad %8 %33
%35 = OpAccessChain %19 %16 %17 %17
%36 = OpLoad %8 %35
%37 = OpAccessChain %19 %16 %17 %17
%38 = OpLoad %8 %37
%39 = OpAccessChain %19 %16 %17 %17
%40 = OpLoad %8 %39
%41 = OpAccessChain %19 %16 %17 %17
%42 = OpLoad %8 %41
%43 = OpAccessChain %19 %16 %17 %17
%44 = OpLoad %8 %43
%45 = OpAccessChain %19 %16 %17 %17
%46 = OpLoad %8 %45
%47 = OpAccessChain %19 %16 %17 %17
%48 = OpLoad %8 %47
%49 = OpAccessChain %19 %16 %17 %17
%50 = OpLoad %8 %49
%53 = OpCompositeConstruct %52 %31 %34 %36 %38 %40 %42 %44 %46 %48 %50
%54 = OpLoad %8 %10
OpStore %56 %53
%57 = OpAccessChain %9 %56 %54
%58 = OpLoad %8 %57
OpStore %29 %58
%59 = OpLoad %8 %29
%60 = OpAccessChain %19 %16 %17 %32
%61 = OpLoad %8 %60
%62 = OpIEqual %27 %59 %61
OpSelectionMerge %64 None
OpBranchConditional %62 %63 %64
%63 = OpLabel
OpReturn
%64 = OpLabel
%66 = OpAccessChain %19 %16 %17 %17
%67 = OpLoad %8 %66
OpStore %10 %67
OpBranch %25
%25 = OpLabel
OpBranch %22
%24 = OpLabel
OpReturn
OpFunctionEnd
END
# uniforms for variant
# _GLF_uniform_int_values
BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
1 0 2 9 20 29
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