• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!amber
2
3# Copyright 2019 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 bug found by GraphicsFuzz.
19
20# Short description: A fragment shader with an arr value set to itself squared
21
22# The test passes because shader always writes red.
23
24SHADER vertex variant_vertex_shader PASSTHROUGH
25
26# variant_fragment_shader is derived from the following GLSL:
27# #version 310 es
28# precision highp float;
29#
30# precision highp int;
31#
32# layout(location = 0) out vec4 _GLF_color;
33#
34# layout(set = 0, binding = 0) uniform buf0 {
35#  vec2 resolution;
36# };
37# struct QuicksortObject {
38#  int numbers[10];
39# } ;
40#
41# QuicksortObject obj;
42#
43# void swap(int i, int j)
44# {
45#  int temp = obj.numbers[i];
46#  obj.numbers[i] = obj.numbers[j];
47#  obj.numbers[j] = temp;
48# }
49# int performPartition(int l, int h)
50# {
51#  int pivot = obj.numbers[h];
52#  int i = (l - 1);
53#  for(
54#      int j = l;
55#      j <= h - 1;
56#      j ++
57#  )
58#   {
59#    if(obj.numbers[j] <= pivot)
60#     {
61#      i ++;
62#      swap(i, j);
63#     }
64#   }
65#  swap(i + 1, h);
66#  return (i + 1);
67# }
68# void quicksort()
69# {
70#  int l = 0, h = 9;
71#  int stack[10];
72#  int top = - 1;
73#  stack[++ top] = l;
74#  stack[++ top] = h;
75#  while(top >= 0)
76#   {
77#    h = stack[top --];
78#    l = stack[top --];
79#    int p = performPartition(l, h);
80#    if(p - 1 > l)
81#     {
82#      stack[++ top] = l;
83#      stack[++ top] = p - 1;
84#     }
85#    if(p + 1 < h)
86#     {
87#      stack[++ top] = p + 1;
88#      stack[++ top] = h;
89#     }
90#   }
91# }
92# void main()
93# {
94#  for(
95#      int i = 0;
96#      i < 10;
97#      i ++
98#  )
99#   {
100#    obj.numbers[i] = (10 - i);
101#    obj.numbers[i] = obj.numbers[i] * obj.numbers[i];
102#   }
103#  quicksort();
104#
105#  if (obj.numbers[0] < obj.numbers[4])
106#   _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
107#  else
108#   _GLF_color = vec4(0.0, 1.0, 0.0, 1.0);
109#
110# }
111SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
112; SPIR-V
113; Version: 1.0
114; Generator: Khronos Glslang Reference Front End; 8
115; Bound: 198
116; Schema: 0
117               OpCapability Shader
118          %1 = OpExtInstImport "GLSL.std.450"
119               OpMemoryModel Logical GLSL450
120               OpEntryPoint Fragment %4 "main" %188
121               OpExecutionMode %4 OriginUpperLeft
122               OpSource ESSL 310
123               OpName %4 "main"
124               OpName %11 "swap(i1;i1;"
125               OpName %9 "i"
126               OpName %10 "j"
127               OpName %16 "performPartition(i1;i1;"
128               OpName %14 "l"
129               OpName %15 "h"
130               OpName %18 "quicksort("
131               OpName %20 "temp"
132               OpName %24 "QuicksortObject"
133               OpMemberName %24 0 "numbers"
134               OpName %26 "obj"
135               OpName %40 "pivot"
136               OpName %44 "i"
137               OpName %48 "j"
138               OpName %69 "param"
139               OpName %71 "param"
140               OpName %78 "param"
141               OpName %79 "param"
142               OpName %86 "l"
143               OpName %87 "h"
144               OpName %89 "top"
145               OpName %92 "stack"
146               OpName %116 "p"
147               OpName %117 "param"
148               OpName %119 "param"
149               OpName %152 "i"
150               OpName %188 "_GLF_color"
151               OpName %195 "buf0"
152               OpMemberName %195 0 "resolution"
153               OpName %197 ""
154               OpDecorate %188 Location 0
155               OpMemberDecorate %195 0 Offset 0
156               OpDecorate %195 Block
157               OpDecorate %197 DescriptorSet 0
158               OpDecorate %197 Binding 0
159          %2 = OpTypeVoid
160          %3 = OpTypeFunction %2
161          %6 = OpTypeInt 32 1
162          %7 = OpTypePointer Function %6
163          %8 = OpTypeFunction %2 %7 %7
164         %13 = OpTypeFunction %6 %7 %7
165         %21 = OpTypeInt 32 0
166         %22 = OpConstant %21 10
167         %23 = OpTypeArray %6 %22
168         %24 = OpTypeStruct %23
169         %25 = OpTypePointer Private %24
170         %26 = OpVariable %25 Private
171         %27 = OpConstant %6 0
172         %29 = OpTypePointer Private %6
173         %46 = OpConstant %6 1
174         %58 = OpTypeBool
175         %88 = OpConstant %6 9
176         %90 = OpConstant %6 -1
177         %91 = OpTypePointer Function %23
178        %159 = OpConstant %6 10
179        %179 = OpConstant %6 4
180        %185 = OpTypeFloat 32
181        %186 = OpTypeVector %185 4
182        %187 = OpTypePointer Output %186
183        %188 = OpVariable %187 Output
184        %189 = OpConstant %185 1
185        %190 = OpConstant %185 0
186        %191 = OpConstantComposite %186 %189 %190 %190 %189
187        %193 = OpConstantComposite %186 %190 %189 %190 %189
188        %194 = OpTypeVector %185 2
189        %195 = OpTypeStruct %194
190        %196 = OpTypePointer Uniform %195
191        %197 = OpVariable %196 Uniform
192          %4 = OpFunction %2 None %3
193          %5 = OpLabel
194        %152 = OpVariable %7 Function
195               OpStore %152 %27
196               OpBranch %153
197        %153 = OpLabel
198               OpLoopMerge %155 %156 None
199               OpBranch %157
200        %157 = OpLabel
201        %158 = OpLoad %6 %152
202        %160 = OpSLessThan %58 %158 %159
203               OpBranchConditional %160 %154 %155
204        %154 = OpLabel
205        %161 = OpLoad %6 %152
206        %162 = OpLoad %6 %152
207        %163 = OpISub %6 %159 %162
208        %164 = OpAccessChain %29 %26 %27 %161
209               OpStore %164 %163
210        %165 = OpLoad %6 %152
211        %166 = OpLoad %6 %152
212        %167 = OpAccessChain %29 %26 %27 %166
213        %168 = OpLoad %6 %167
214        %169 = OpLoad %6 %152
215        %170 = OpAccessChain %29 %26 %27 %169
216        %171 = OpLoad %6 %170
217        %172 = OpIMul %6 %168 %171
218        %173 = OpAccessChain %29 %26 %27 %165
219               OpStore %173 %172
220               OpBranch %156
221        %156 = OpLabel
222        %174 = OpLoad %6 %152
223        %175 = OpIAdd %6 %174 %46
224               OpStore %152 %175
225               OpBranch %153
226        %155 = OpLabel
227        %176 = OpFunctionCall %2 %18
228        %177 = OpAccessChain %29 %26 %27 %27
229        %178 = OpLoad %6 %177
230        %180 = OpAccessChain %29 %26 %27 %179
231        %181 = OpLoad %6 %180
232        %182 = OpSLessThan %58 %178 %181
233               OpSelectionMerge %184 None
234               OpBranchConditional %182 %183 %192
235        %183 = OpLabel
236               OpStore %188 %191
237               OpBranch %184
238        %192 = OpLabel
239               OpStore %188 %193
240               OpBranch %184
241        %184 = OpLabel
242               OpReturn
243               OpFunctionEnd
244         %11 = OpFunction %2 None %8
245          %9 = OpFunctionParameter %7
246         %10 = OpFunctionParameter %7
247         %12 = OpLabel
248         %20 = OpVariable %7 Function
249         %28 = OpLoad %6 %9
250         %30 = OpAccessChain %29 %26 %27 %28
251         %31 = OpLoad %6 %30
252               OpStore %20 %31
253         %32 = OpLoad %6 %9
254         %33 = OpLoad %6 %10
255         %34 = OpAccessChain %29 %26 %27 %33
256         %35 = OpLoad %6 %34
257         %36 = OpAccessChain %29 %26 %27 %32
258               OpStore %36 %35
259         %37 = OpLoad %6 %10
260         %38 = OpLoad %6 %20
261         %39 = OpAccessChain %29 %26 %27 %37
262               OpStore %39 %38
263               OpReturn
264               OpFunctionEnd
265         %16 = OpFunction %6 None %13
266         %14 = OpFunctionParameter %7
267         %15 = OpFunctionParameter %7
268         %17 = OpLabel
269         %40 = OpVariable %7 Function
270         %44 = OpVariable %7 Function
271         %48 = OpVariable %7 Function
272         %69 = OpVariable %7 Function
273         %71 = OpVariable %7 Function
274         %78 = OpVariable %7 Function
275         %79 = OpVariable %7 Function
276         %41 = OpLoad %6 %15
277         %42 = OpAccessChain %29 %26 %27 %41
278         %43 = OpLoad %6 %42
279               OpStore %40 %43
280         %45 = OpLoad %6 %14
281         %47 = OpISub %6 %45 %46
282               OpStore %44 %47
283         %49 = OpLoad %6 %14
284               OpStore %48 %49
285               OpBranch %50
286         %50 = OpLabel
287               OpLoopMerge %52 %53 None
288               OpBranch %54
289         %54 = OpLabel
290         %55 = OpLoad %6 %48
291         %56 = OpLoad %6 %15
292         %57 = OpISub %6 %56 %46
293         %59 = OpSLessThanEqual %58 %55 %57
294               OpBranchConditional %59 %51 %52
295         %51 = OpLabel
296         %60 = OpLoad %6 %48
297         %61 = OpAccessChain %29 %26 %27 %60
298         %62 = OpLoad %6 %61
299         %63 = OpLoad %6 %40
300         %64 = OpSLessThanEqual %58 %62 %63
301               OpSelectionMerge %66 None
302               OpBranchConditional %64 %65 %66
303         %65 = OpLabel
304         %67 = OpLoad %6 %44
305         %68 = OpIAdd %6 %67 %46
306               OpStore %44 %68
307         %70 = OpLoad %6 %44
308               OpStore %69 %70
309         %72 = OpLoad %6 %48
310               OpStore %71 %72
311         %73 = OpFunctionCall %2 %11 %69 %71
312               OpBranch %66
313         %66 = OpLabel
314               OpBranch %53
315         %53 = OpLabel
316         %74 = OpLoad %6 %48
317         %75 = OpIAdd %6 %74 %46
318               OpStore %48 %75
319               OpBranch %50
320         %52 = OpLabel
321         %76 = OpLoad %6 %44
322         %77 = OpIAdd %6 %76 %46
323               OpStore %78 %77
324         %80 = OpLoad %6 %15
325               OpStore %79 %80
326         %81 = OpFunctionCall %2 %11 %78 %79
327         %82 = OpLoad %6 %44
328         %83 = OpIAdd %6 %82 %46
329               OpReturnValue %83
330               OpFunctionEnd
331         %18 = OpFunction %2 None %3
332         %19 = OpLabel
333         %86 = OpVariable %7 Function
334         %87 = OpVariable %7 Function
335         %89 = OpVariable %7 Function
336         %92 = OpVariable %91 Function
337        %116 = OpVariable %7 Function
338        %117 = OpVariable %7 Function
339        %119 = OpVariable %7 Function
340               OpStore %86 %27
341               OpStore %87 %88
342               OpStore %89 %90
343         %93 = OpLoad %6 %89
344         %94 = OpIAdd %6 %93 %46
345               OpStore %89 %94
346         %95 = OpLoad %6 %86
347         %96 = OpAccessChain %7 %92 %94
348               OpStore %96 %95
349         %97 = OpLoad %6 %89
350         %98 = OpIAdd %6 %97 %46
351               OpStore %89 %98
352         %99 = OpLoad %6 %87
353        %100 = OpAccessChain %7 %92 %98
354               OpStore %100 %99
355               OpBranch %101
356        %101 = OpLabel
357               OpLoopMerge %103 %104 None
358               OpBranch %105
359        %105 = OpLabel
360        %106 = OpLoad %6 %89
361        %107 = OpSGreaterThanEqual %58 %106 %27
362               OpBranchConditional %107 %102 %103
363        %102 = OpLabel
364        %108 = OpLoad %6 %89
365        %109 = OpISub %6 %108 %46
366               OpStore %89 %109
367        %110 = OpAccessChain %7 %92 %108
368        %111 = OpLoad %6 %110
369               OpStore %87 %111
370        %112 = OpLoad %6 %89
371        %113 = OpISub %6 %112 %46
372               OpStore %89 %113
373        %114 = OpAccessChain %7 %92 %112
374        %115 = OpLoad %6 %114
375               OpStore %86 %115
376        %118 = OpLoad %6 %86
377               OpStore %117 %118
378        %120 = OpLoad %6 %87
379               OpStore %119 %120
380        %121 = OpFunctionCall %6 %16 %117 %119
381               OpStore %116 %121
382        %122 = OpLoad %6 %116
383        %123 = OpISub %6 %122 %46
384        %124 = OpLoad %6 %86
385        %125 = OpSGreaterThan %58 %123 %124
386               OpSelectionMerge %127 None
387               OpBranchConditional %125 %126 %127
388        %126 = OpLabel
389        %128 = OpLoad %6 %89
390        %129 = OpIAdd %6 %128 %46
391               OpStore %89 %129
392        %130 = OpLoad %6 %86
393        %131 = OpAccessChain %7 %92 %129
394               OpStore %131 %130
395        %132 = OpLoad %6 %89
396        %133 = OpIAdd %6 %132 %46
397               OpStore %89 %133
398        %134 = OpLoad %6 %116
399        %135 = OpISub %6 %134 %46
400        %136 = OpAccessChain %7 %92 %133
401               OpStore %136 %135
402               OpBranch %127
403        %127 = OpLabel
404        %137 = OpLoad %6 %116
405        %138 = OpIAdd %6 %137 %46
406        %139 = OpLoad %6 %87
407        %140 = OpSLessThan %58 %138 %139
408               OpSelectionMerge %142 None
409               OpBranchConditional %140 %141 %142
410        %141 = OpLabel
411        %143 = OpLoad %6 %89
412        %144 = OpIAdd %6 %143 %46
413               OpStore %89 %144
414        %145 = OpLoad %6 %116
415        %146 = OpIAdd %6 %145 %46
416        %147 = OpAccessChain %7 %92 %144
417               OpStore %147 %146
418        %148 = OpLoad %6 %89
419        %149 = OpIAdd %6 %148 %46
420               OpStore %89 %149
421        %150 = OpLoad %6 %87
422        %151 = OpAccessChain %7 %92 %149
423               OpStore %151 %150
424               OpBranch %142
425        %142 = OpLabel
426               OpBranch %104
427        %104 = OpLabel
428               OpBranch %101
429        %103 = OpLabel
430               OpReturn
431               OpFunctionEnd
432END
433
434# uniforms for variant
435
436# resolution
437BUFFER variant_resolution DATA_TYPE vec2<float> DATA
438 256.0 256.0
439END
440
441BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
442
443PIPELINE graphics variant_pipeline
444  ATTACH variant_vertex_shader
445  ATTACH variant_fragment_shader
446  FRAMEBUFFER_SIZE 256 256
447  BIND BUFFER variant_framebuffer AS color LOCATION 0
448  BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
449END
450CLEAR_COLOR variant_pipeline 0 0 0 255
451
452CLEAR variant_pipeline
453RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
454
455EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
456