Fix missing dependency on sparse binds
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / data / vulkan / amber / graphicsfuzz / cov-loop-array-index-decrement-never-negative.amber
1 #!amber
2
3 # Copyright 2022 Google LLC
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 #     http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17
18 # A test for a coverage-gap found by the GraphicsFuzz project.
19
20 # Short description: A fragment shader that covers specific LLVM code paths
21
22 # The test passes because the shader always writes red.
23
24 # Optimized using spirv-opt with the following arguments:
25 # '--copy-propagate-arrays'
26 # '--eliminate-local-multi-store'
27 # '--if-conversion'
28 # '--eliminate-local-single-block'
29 # '--eliminate-dead-inserts'
30 # '--redundancy-elimination'
31 # '--eliminate-local-single-store'
32 # '--eliminate-dead-code-aggressive'
33 # '--eliminate-dead-code-aggressive'
34 # '--redundancy-elimination'
35 # '--scalar-replacement=100'
36 # '--eliminate-local-multi-store'
37 # '--inline-entry-points-exhaustive'
38 # '--eliminate-dead-branches'
39 # '--merge-return'
40 # '--eliminate-dead-branches'
41 # '--merge-blocks'
42 # '--ccp'
43 # '--copy-propagate-arrays'
44 # '--combine-access-chains'
45 # '--if-conversion'
46 # '--private-to-local'
47 # '--reduce-load-size'
48 # '--scalar-replacement=100'
49 # spirv-opt commit hash: a0370efd589be33d5d9a85cfde2f85841b3755af
50
51
52
53 SHADER vertex variant_vertex_shader PASSTHROUGH
54
55 # variant_fragment_shader is derived from the following GLSL:
56 # #version 320 es
57 #
58 # #define _int_1 _GLF_uniform_int_values[0]
59 # #define _int_0 _GLF_uniform_int_values[1]
60 #
61 # precision highp float;
62 # precision highp int;
63 #
64 # // Contents of _GLF_uniform_int_values: [1, 0]
65 # layout(set = 0, binding = 0) uniform buf0
66 # {
67 #     int _GLF_uniform_int_values[2];
68 # };
69 #
70 # const int _GLF_global_loop_bound = 10;
71 # int _GLF_global_loop_count = 0;
72 #
73 # layout(location = 0) out vec4 _GLF_color;
74 #
75 # int arr0[10] = int[10](1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
76 #
77 # int func()
78 # {
79 #     int a = _int_1;
80 #     int b = _int_0;
81 #     int arr1[10] = int[10](_int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1, _int_1);
82 #
83 #     // Iterates ten times.
84 #     while(b >= _int_0 && _GLF_global_loop_count < _GLF_global_loop_bound)
85 #     {
86 #         _GLF_global_loop_count++;
87 #
88 #         // Reads zero as an index and then decrements b to -1. Reads value one, so a stays at one.
89 #         a = arr1[b--];
90 #
91 #         // arr0[1] = arr0[0]. No effect.
92 #         arr0[_int_1] = arr0[a];
93 #
94 #         // Always true.
95 #         if(a > _int_0)
96 #         {
97 #             // Increments b to zero and indexes with that. Writes one to arr1[0] but that value already existed.
98 #             arr1[++b] = a;
99 #         }
100 #     }
101 #
102 #     // Returns zero.
103 #     return b;
104 # }
105 #
106 # void main()
107 # {
108 #     // Always true.
109 #     if(func() == _int_0)
110 #     {
111 #         _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
112 #     }
113 #     else
114 #     {
115 #         _GLF_color = vec4(_int_0);
116 #     }
117 # }
118 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
119 ; SPIR-V
120 ; Version: 1.0
121 ; Generator: Khronos Glslang Reference Front End; 10
122 ; Bound: 157
123 ; Schema: 0
124                OpCapability Shader
125           %1 = OpExtInstImport "GLSL.std.450"
126                OpMemoryModel Logical GLSL450
127                OpEntryPoint Fragment %4 "main" %104
128                OpExecutionMode %4 OriginUpperLeft
129                OpSource ESSL 320
130                OpName %4 "main"
131                OpName %8 "func("
132                OpName %11 "_GLF_global_loop_count"
133                OpName %17 "arr0"
134                OpName %24 "buf0"
135                OpMemberName %24 0 "_GLF_uniform_int_values"
136                OpName %26 ""
137                OpName %34 "arr1"
138                OpName %104 "_GLF_color"
139                OpDecorate %23 ArrayStride 16
140                OpMemberDecorate %24 0 Offset 0
141                OpDecorate %24 Block
142                OpDecorate %26 DescriptorSet 0
143                OpDecorate %26 Binding 0
144                OpDecorate %104 Location 0
145           %2 = OpTypeVoid
146           %3 = OpTypeFunction %2
147           %6 = OpTypeInt 32 1
148           %7 = OpTypeFunction %6
149          %10 = OpTypePointer Private %6
150          %11 = OpVariable %10 Private
151          %12 = OpConstant %6 0
152          %13 = OpTypeInt 32 0
153          %14 = OpConstant %13 10
154          %15 = OpTypeArray %6 %14
155          %16 = OpTypePointer Private %15
156          %17 = OpVariable %16 Private
157          %18 = OpConstant %6 1
158          %19 = OpConstantComposite %15 %18 %18 %18 %18 %18 %18 %18 %18 %18 %18
159          %20 = OpTypePointer Function %6
160          %22 = OpConstant %13 2
161          %23 = OpTypeArray %6 %22
162          %24 = OpTypeStruct %23
163          %25 = OpTypePointer Uniform %24
164          %26 = OpVariable %25 Uniform
165          %27 = OpTypePointer Uniform %6
166          %33 = OpTypePointer Function %15
167          %64 = OpTypeBool
168          %67 = OpConstant %6 10
169         %101 = OpTypeFloat 32
170         %102 = OpTypeVector %101 4
171         %103 = OpTypePointer Output %102
172         %104 = OpVariable %103 Output
173           %4 = OpFunction %2 None %3
174           %5 = OpLabel
175         %125 = OpVariable %33 Function
176         %126 = OpVariable %20 Function
177                OpStore %11 %12
178                OpStore %17 %19
179         %128 = OpAccessChain %27 %26 %12 %12
180         %129 = OpLoad %6 %128
181         %130 = OpAccessChain %27 %26 %12 %18
182         %131 = OpLoad %6 %130
183         %132 = OpCompositeConstruct %15 %129 %129 %129 %129 %129 %129 %129 %129 %129 %129
184                OpStore %125 %132
185                OpBranch %133
186         %133 = OpLabel
187         %134 = OpPhi %6 %131 %5 %154 %155
188         %136 = OpSGreaterThanEqual %64 %134 %131
189         %137 = OpLoad %6 %11
190         %138 = OpSLessThan %64 %137 %67
191         %139 = OpLogicalAnd %64 %136 %138
192                OpLoopMerge %156 %155 None
193                OpBranchConditional %139 %140 %156
194         %140 = OpLabel
195         %141 = OpLoad %6 %11
196         %142 = OpIAdd %6 %141 %18
197                OpStore %11 %142
198         %143 = OpISub %6 %134 %18
199         %144 = OpAccessChain %20 %125 %134
200         %145 = OpLoad %6 %144
201         %146 = OpAccessChain %10 %17 %145
202         %147 = OpLoad %6 %146
203         %148 = OpAccessChain %10 %17 %129
204                OpStore %148 %147
205         %149 = OpSGreaterThan %64 %145 %131
206                OpSelectionMerge %153 None
207                OpBranchConditional %149 %150 %153
208         %150 = OpLabel
209         %151 = OpIAdd %6 %143 %18
210         %152 = OpAccessChain %20 %125 %151
211                OpStore %152 %145
212                OpBranch %153
213         %153 = OpLabel
214         %154 = OpPhi %6 %143 %140 %151 %150
215                OpBranch %155
216         %155 = OpLabel
217                OpBranch %133
218         %156 = OpLabel
219                OpStore %126 %134
220          %95 = OpLoad %6 %126
221          %96 = OpAccessChain %27 %26 %12 %18
222          %97 = OpLoad %6 %96
223          %98 = OpIEqual %64 %95 %97
224                OpSelectionMerge %100 None
225                OpBranchConditional %98 %99 %118
226          %99 = OpLabel
227         %105 = OpAccessChain %27 %26 %12 %12
228         %106 = OpLoad %6 %105
229         %107 = OpConvertSToF %101 %106
230         %110 = OpConvertSToF %101 %97
231         %117 = OpCompositeConstruct %102 %107 %110 %110 %107
232                OpStore %104 %117
233                OpBranch %100
234         %118 = OpLabel
235         %121 = OpConvertSToF %101 %97
236         %122 = OpCompositeConstruct %102 %121 %121 %121 %121
237                OpStore %104 %122
238                OpBranch %100
239         %100 = OpLabel
240                OpReturn
241                OpFunctionEnd
242           %8 = OpFunction %6 None %7
243           %9 = OpLabel
244          %34 = OpVariable %33 Function
245          %28 = OpAccessChain %27 %26 %12 %12
246          %29 = OpLoad %6 %28
247          %31 = OpAccessChain %27 %26 %12 %18
248          %32 = OpLoad %6 %31
249          %55 = OpCompositeConstruct %15 %29 %29 %29 %29 %29 %29 %29 %29 %29 %29
250                OpStore %34 %55
251                OpBranch %56
252          %56 = OpLabel
253         %123 = OpPhi %6 %32 %9 %124 %59
254                OpLoopMerge %58 %59 None
255                OpBranch %60
256          %60 = OpLabel
257          %65 = OpSGreaterThanEqual %64 %123 %32
258          %66 = OpLoad %6 %11
259          %68 = OpSLessThan %64 %66 %67
260          %69 = OpLogicalAnd %64 %65 %68
261                OpBranchConditional %69 %57 %58
262          %57 = OpLabel
263          %70 = OpLoad %6 %11
264          %71 = OpIAdd %6 %70 %18
265                OpStore %11 %71
266          %73 = OpISub %6 %123 %18
267          %74 = OpAccessChain %20 %34 %123
268          %75 = OpLoad %6 %74
269          %79 = OpAccessChain %10 %17 %75
270          %80 = OpLoad %6 %79
271          %81 = OpAccessChain %10 %17 %29
272                OpStore %81 %80
273          %85 = OpSGreaterThan %64 %75 %32
274                OpSelectionMerge %87 None
275                OpBranchConditional %85 %86 %87
276          %86 = OpLabel
277          %89 = OpIAdd %6 %73 %18
278          %91 = OpAccessChain %20 %34 %89
279                OpStore %91 %75
280                OpBranch %87
281          %87 = OpLabel
282         %124 = OpPhi %6 %73 %57 %89 %86
283                OpBranch %59
284          %59 = OpLabel
285                OpBranch %56
286          %58 = OpLabel
287                OpReturnValue %123
288                OpFunctionEnd
289 END
290
291 # uniforms for variant
292
293 # _GLF_uniform_int_values
294 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
295  1 0
296 END
297
298 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
299
300 PIPELINE graphics variant_pipeline
301   ATTACH variant_vertex_shader
302   ATTACH variant_fragment_shader
303   FRAMEBUFFER_SIZE 32 32
304   BIND BUFFER variant_framebuffer AS color LOCATION 0
305   BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
306 END
307 CLEAR_COLOR variant_pipeline 0 0 0 255
308
309 CLEAR variant_pipeline
310 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 32 32
311
312 EXPECT variant_framebuffer IDX 0 0 SIZE 32 32 EQ_RGBA 255 0 0 255