• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!amber
2
3# Copyright 2020 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 nested for loop and always true if
21
22# The test passes because both shaders render the same image.
23
24# Optimized using spirv-opt with the following arguments:
25# '--if-conversion'
26# '--eliminate-local-multi-store'
27# '--eliminate-dead-inserts'
28# '--scalar-replacement=100'
29# '--simplify-instructions'
30# '--reduce-load-size'
31# '--copy-propagate-arrays'
32# '--private-to-local'
33# '--ccp'
34# '--redundancy-elimination'
35# '--vector-dce'
36# '--eliminate-local-multi-store'
37# '--eliminate-dead-code-aggressive'
38# '--private-to-local'
39# '--convert-local-access-chains'
40# '--if-conversion'
41# '--inline-entry-points-exhaustive'
42# '--eliminate-dead-code-aggressive'
43# '--eliminate-local-single-block'
44# '--if-conversion'
45# spirv-opt commit hash: 230f363e6da32791f640b02205e0645cc67c3f1d
46
47
48
49SHADER vertex reference_vertex_shader PASSTHROUGH
50
51# reference_fragment_shader is derived from the following GLSL:
52# #version 320 es
53# precision highp float;
54#
55# precision highp int;
56#
57# layout(location = 0) out vec4 _GLF_color;
58#
59# layout(set = 0, binding = 0) uniform buf0
60# {
61#     vec2 resolution;
62# };
63# float cross2d(vec2 a, vec2 b)
64# {
65#     return ((a.x) * (b.y) - (b.x) * (a.y));
66# }
67# int pointInTriangle(vec2 p, vec2 a, vec2 b, vec2 c)
68# {
69#     float pab = cross2d(vec2(p.x - a.x, p.y - a.y), vec2(b.x - a.x, b.y - a.y));
70#     float pbc = cross2d(vec2(p.x - b.x, p.y - b.y), vec2(c.x - b.x, c.y - b.y));
71#     if (!((pab < 0.0 && pbc < 0.0) || (pab >= 0.0 && pbc >= 0.0)))
72#     {
73#         return 0;
74#     }
75#     float pca = cross2d(vec2(p.x - c.x, p.y - c.y), vec2(a.x - c.x, a.y - c.y));
76#     if (!((pab < 0.0 && pca < 0.0) || (pab >= 0.0 && pca >= 0.0)))
77#     {
78#         return 0;
79#     }
80#     return 1;
81# }
82# void main()
83# {
84#     vec2 pos = gl_FragCoord.xy / resolution;
85#     if (pointInTriangle(pos, vec2(0.7, 0.3), vec2(0.5, 0.9), vec2(0.1, 0.4)) == 1)
86#     {
87#         _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
88#     }
89#     else
90#     {
91#         _GLF_color = vec4(0.0, 0.0, 0.0, 1.0);
92#     }
93# }
94SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
95; SPIR-V
96; Version: 1.0
97; Generator: Khronos Glslang Reference Front End; 10
98; Bound: 236
99; Schema: 0
100               OpCapability Shader
101          %1 = OpExtInstImport "GLSL.std.450"
102               OpMemoryModel Logical GLSL450
103               OpEntryPoint Fragment %4 "main" %162 %191
104               OpExecutionMode %4 OriginUpperLeft
105               OpSource ESSL 320
106               OpName %4 "main"
107               OpName %20 "pointInTriangle(vf2;vf2;vf2;vf2;"
108               OpName %16 "p"
109               OpName %17 "a"
110               OpName %18 "b"
111               OpName %19 "c"
112               OpName %62 "param"
113               OpName %63 "param"
114               OpName %88 "param"
115               OpName %89 "param"
116               OpName %135 "param"
117               OpName %136 "param"
118               OpName %162 "gl_FragCoord"
119               OpName %165 "buf0"
120               OpMemberName %165 0 "resolution"
121               OpName %167 ""
122               OpName %181 "param"
123               OpName %183 "param"
124               OpName %184 "param"
125               OpName %185 "param"
126               OpName %191 "_GLF_color"
127               OpDecorate %162 BuiltIn FragCoord
128               OpMemberDecorate %165 0 Offset 0
129               OpDecorate %165 Block
130               OpDecorate %167 DescriptorSet 0
131               OpDecorate %167 Binding 0
132               OpDecorate %191 Location 0
133          %2 = OpTypeVoid
134          %3 = OpTypeFunction %2
135          %6 = OpTypeFloat 32
136          %7 = OpTypeVector %6 2
137          %8 = OpTypePointer Function %7
138         %14 = OpTypeInt 32 1
139         %15 = OpTypeFunction %14 %8 %8 %8 %8
140         %22 = OpTypeInt 32 0
141         %23 = OpConstant %22 0
142         %24 = OpTypePointer Function %6
143         %27 = OpConstant %22 1
144         %91 = OpTypeBool
145         %93 = OpConstant %6 0
146        %110 = OpConstant %14 0
147        %156 = OpConstant %14 1
148        %160 = OpTypeVector %6 4
149        %161 = OpTypePointer Input %160
150        %162 = OpVariable %161 Input
151        %165 = OpTypeStruct %7
152        %166 = OpTypePointer Uniform %165
153        %167 = OpVariable %166 Uniform
154        %168 = OpTypePointer Uniform %7
155        %172 = OpConstant %6 0.699999988
156        %173 = OpConstant %6 0.300000012
157        %174 = OpConstantComposite %7 %172 %173
158        %175 = OpConstant %6 0.5
159        %176 = OpConstant %6 0.899999976
160        %177 = OpConstantComposite %7 %175 %176
161        %178 = OpConstant %6 0.100000001
162        %179 = OpConstant %6 0.400000006
163        %180 = OpConstantComposite %7 %178 %179
164        %190 = OpTypePointer Output %160
165        %191 = OpVariable %190 Output
166        %192 = OpConstant %6 1
167        %193 = OpConstantComposite %160 %192 %93 %93 %192
168        %195 = OpConstantComposite %160 %93 %93 %93 %192
169          %4 = OpFunction %2 None %3
170          %5 = OpLabel
171        %181 = OpVariable %8 Function
172        %183 = OpVariable %8 Function
173        %184 = OpVariable %8 Function
174        %185 = OpVariable %8 Function
175        %163 = OpLoad %160 %162
176        %164 = OpVectorShuffle %7 %163 %163 0 1
177        %169 = OpAccessChain %168 %167 %110
178        %170 = OpLoad %7 %169
179        %171 = OpFDiv %7 %164 %170
180               OpStore %181 %171
181               OpStore %183 %174
182               OpStore %184 %177
183               OpStore %185 %180
184        %186 = OpFunctionCall %14 %20 %181 %183 %184 %185
185        %187 = OpIEqual %91 %186 %156
186               OpSelectionMerge %189 None
187               OpBranchConditional %187 %188 %194
188        %188 = OpLabel
189               OpStore %191 %193
190               OpBranch %189
191        %194 = OpLabel
192               OpStore %191 %195
193               OpBranch %189
194        %189 = OpLabel
195               OpReturn
196               OpFunctionEnd
197         %20 = OpFunction %14 None %15
198         %16 = OpFunctionParameter %8
199         %17 = OpFunctionParameter %8
200         %18 = OpFunctionParameter %8
201         %19 = OpFunctionParameter %8
202         %21 = OpLabel
203        %223 = OpVariable %24 Function
204        %210 = OpVariable %24 Function
205        %197 = OpVariable %24 Function
206         %62 = OpVariable %8 Function
207         %63 = OpVariable %8 Function
208         %88 = OpVariable %8 Function
209         %89 = OpVariable %8 Function
210        %135 = OpVariable %8 Function
211        %136 = OpVariable %8 Function
212         %40 = OpAccessChain %24 %16 %23
213         %41 = OpLoad %6 %40
214         %42 = OpAccessChain %24 %17 %23
215         %43 = OpLoad %6 %42
216         %44 = OpFSub %6 %41 %43
217         %45 = OpAccessChain %24 %16 %27
218         %46 = OpLoad %6 %45
219         %47 = OpAccessChain %24 %17 %27
220         %48 = OpLoad %6 %47
221         %49 = OpFSub %6 %46 %48
222         %50 = OpCompositeConstruct %7 %44 %49
223         %51 = OpAccessChain %24 %18 %23
224         %52 = OpLoad %6 %51
225         %54 = OpLoad %6 %42
226         %55 = OpFSub %6 %52 %54
227         %56 = OpAccessChain %24 %18 %27
228         %57 = OpLoad %6 %56
229         %59 = OpLoad %6 %47
230         %60 = OpFSub %6 %57 %59
231         %61 = OpCompositeConstruct %7 %55 %60
232               OpStore %62 %50
233               OpStore %63 %61
234        %199 = OpAccessChain %24 %62 %23
235        %200 = OpLoad %6 %199
236        %201 = OpAccessChain %24 %63 %27
237        %202 = OpLoad %6 %201
238        %203 = OpFMul %6 %200 %202
239        %204 = OpAccessChain %24 %63 %23
240        %205 = OpLoad %6 %204
241        %206 = OpAccessChain %24 %62 %27
242        %207 = OpLoad %6 %206
243        %208 = OpFMul %6 %205 %207
244        %209 = OpFSub %6 %203 %208
245               OpStore %197 %209
246         %67 = OpLoad %6 %40
247         %69 = OpLoad %6 %51
248         %70 = OpFSub %6 %67 %69
249         %72 = OpLoad %6 %45
250         %74 = OpLoad %6 %56
251         %75 = OpFSub %6 %72 %74
252         %76 = OpCompositeConstruct %7 %70 %75
253         %77 = OpAccessChain %24 %19 %23
254         %78 = OpLoad %6 %77
255         %80 = OpLoad %6 %51
256         %81 = OpFSub %6 %78 %80
257         %82 = OpAccessChain %24 %19 %27
258         %83 = OpLoad %6 %82
259         %85 = OpLoad %6 %56
260         %86 = OpFSub %6 %83 %85
261         %87 = OpCompositeConstruct %7 %81 %86
262               OpStore %88 %76
263               OpStore %89 %87
264        %212 = OpAccessChain %24 %88 %23
265        %213 = OpLoad %6 %212
266        %214 = OpAccessChain %24 %89 %27
267        %215 = OpLoad %6 %214
268        %216 = OpFMul %6 %213 %215
269        %217 = OpAccessChain %24 %89 %23
270        %218 = OpLoad %6 %217
271        %219 = OpAccessChain %24 %88 %27
272        %220 = OpLoad %6 %219
273        %221 = OpFMul %6 %218 %220
274        %222 = OpFSub %6 %216 %221
275               OpStore %210 %222
276         %94 = OpFOrdLessThan %91 %209 %93
277         %96 = OpFOrdLessThan %91 %222 %93
278         %97 = OpLogicalAnd %91 %94 %96
279         %98 = OpLogicalNot %91 %97
280               OpSelectionMerge %100 None
281               OpBranchConditional %98 %99 %100
282         %99 = OpLabel
283        %102 = OpFOrdGreaterThanEqual %91 %209 %93
284        %104 = OpFOrdGreaterThanEqual %91 %222 %93
285        %105 = OpLogicalAnd %91 %102 %104
286               OpBranch %100
287        %100 = OpLabel
288        %106 = OpPhi %91 %97 %21 %105 %99
289        %107 = OpLogicalNot %91 %106
290               OpSelectionMerge %109 None
291               OpBranchConditional %107 %108 %109
292        %108 = OpLabel
293               OpReturnValue %110
294        %109 = OpLabel
295        %114 = OpLoad %6 %40
296        %116 = OpLoad %6 %77
297        %117 = OpFSub %6 %114 %116
298        %119 = OpLoad %6 %45
299        %121 = OpLoad %6 %82
300        %122 = OpFSub %6 %119 %121
301        %123 = OpCompositeConstruct %7 %117 %122
302        %125 = OpLoad %6 %42
303        %127 = OpLoad %6 %77
304        %128 = OpFSub %6 %125 %127
305        %130 = OpLoad %6 %47
306        %132 = OpLoad %6 %82
307        %133 = OpFSub %6 %130 %132
308        %134 = OpCompositeConstruct %7 %128 %133
309               OpStore %135 %123
310               OpStore %136 %134
311        %225 = OpAccessChain %24 %135 %23
312        %226 = OpLoad %6 %225
313        %227 = OpAccessChain %24 %136 %27
314        %228 = OpLoad %6 %227
315        %229 = OpFMul %6 %226 %228
316        %230 = OpAccessChain %24 %136 %23
317        %231 = OpLoad %6 %230
318        %232 = OpAccessChain %24 %135 %27
319        %233 = OpLoad %6 %232
320        %234 = OpFMul %6 %231 %233
321        %235 = OpFSub %6 %229 %234
322               OpStore %223 %235
323        %141 = OpFOrdLessThan %91 %235 %93
324        %142 = OpLogicalAnd %91 %94 %141
325        %143 = OpLogicalNot %91 %142
326               OpSelectionMerge %145 None
327               OpBranchConditional %143 %144 %145
328        %144 = OpLabel
329        %147 = OpFOrdGreaterThanEqual %91 %209 %93
330        %149 = OpFOrdGreaterThanEqual %91 %235 %93
331        %150 = OpLogicalAnd %91 %147 %149
332               OpBranch %145
333        %145 = OpLabel
334        %151 = OpPhi %91 %142 %109 %150 %144
335        %152 = OpLogicalNot %91 %151
336               OpSelectionMerge %154 None
337               OpBranchConditional %152 %153 %154
338        %153 = OpLabel
339               OpReturnValue %110
340        %154 = OpLabel
341               OpReturnValue %156
342               OpFunctionEnd
343END
344
345# uniforms for reference
346
347# resolution
348BUFFER reference_resolution DATA_TYPE vec2<float> DATA
349 256.0 256.0
350END
351
352BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
353
354PIPELINE graphics reference_pipeline
355  ATTACH reference_vertex_shader
356  ATTACH reference_fragment_shader
357  FRAMEBUFFER_SIZE 256 256
358  BIND BUFFER reference_framebuffer AS color LOCATION 0
359  BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
360END
361CLEAR_COLOR reference_pipeline 0 0 0 255
362
363CLEAR reference_pipeline
364RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
365
366
367SHADER vertex variant_vertex_shader PASSTHROUGH
368
369# variant_fragment_shader is derived from the following GLSL:
370# #version 320 es
371# precision highp float;
372#
373# precision highp int;
374#
375# layout(location = 0) out vec4 _GLF_color;
376#
377# layout(set = 0, binding = 0) uniform buf0
378# {
379#     vec2 resolution;
380# };
381# layout(set = 0, binding = 1) uniform buf1
382# {
383#     vec2 injectionSwitch; // x == 0.0, y == 1.0
384# };
385#
386# void func()
387# {
388#     vec4 vec4_a = vec4(1.0, 1.0, 1.0, 1.0);
389#     // Iterates once.
390#     for (int int_i = 0; int_i < int(injectionSwitch.y); int_i++)
391#     {
392#         // _GLF_color == 1.0, 1.0, 1.0, 1.0
393#         _GLF_color = vec4_a;
394#         // Iterates once.
395#         for (int int_j = 0; int_j < int(injectionSwitch.y); int_j++)
396#         {
397#             // _GLF_color == 1.0, 1.0, 1.0, 1.0
398#             _GLF_color = vec4_a;
399#         }
400#     }
401# }
402#
403# float cross2d(vec2 a, vec2 b)
404# {
405#     return ((a.x) * (b.y) - (b.x) * (a.y));
406# }
407# int pointInTriangle(vec2 p, vec2 a, vec2 b, vec2 c)
408# {
409#     float pab = cross2d(vec2(p.x - a.x, p.y - a.y), vec2(b.x - a.x, b.y - a.y));
410#     float pbc = cross2d(vec2(p.x - b.x, p.y - b.y), vec2(c.x - b.x, c.y - b.y));
411#     if (!((pab < 0.0 && pbc < 0.0) || (pab >= 0.0 && pbc >= 0.0)))
412#     {
413#         func();
414#         return 0;
415#     }
416#     float pca = cross2d(vec2(p.x - c.x, p.y - c.y), vec2(a.x - c.x, a.y - c.y));
417#     if (!((pab < 0.0 && pca < 0.0) || (pab >= 0.0 && pca >= 0.0)))
418#     {
419#         return 0;
420#     }
421#     return 1;
422# }
423# void main()
424# {
425#     vec2 pos = gl_FragCoord.xy / resolution;
426#     if (pointInTriangle(pos, vec2(0.7, 0.3), vec2(0.5, 0.9), vec2(0.1, 0.4)) == 1)
427#     {
428#         // Always true.
429#         if ((injectionSwitch.y >= injectionSwitch.x))
430#         {
431#             _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
432#         }
433#     }
434#     else
435#     {
436#         _GLF_color = vec4(0.0, 0.0, 0.0, 1.0);
437#     }
438# }
439SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
440; SPIR-V
441; Version: 1.0
442; Generator: Khronos Glslang Reference Front End; 10
443; Bound: 307
444; Schema: 0
445               OpCapability Shader
446          %1 = OpExtInstImport "GLSL.std.450"
447               OpMemoryModel Logical GLSL450
448               OpEntryPoint Fragment %4 "main" %50 %204
449               OpExecutionMode %4 OriginUpperLeft
450               OpSource ESSL 320
451               OpName %4 "main"
452               OpName %22 "pointInTriangle(vf2;vf2;vf2;vf2;"
453               OpName %18 "p"
454               OpName %19 "a"
455               OpName %20 "b"
456               OpName %21 "c"
457               OpName %38 "buf1"
458               OpMemberName %38 0 "injectionSwitch"
459               OpName %40 ""
460               OpName %50 "_GLF_color"
461               OpName %107 "param"
462               OpName %108 "param"
463               OpName %133 "param"
464               OpName %134 "param"
465               OpName %179 "param"
466               OpName %180 "param"
467               OpName %204 "gl_FragCoord"
468               OpName %207 "buf0"
469               OpMemberName %207 0 "resolution"
470               OpName %209 ""
471               OpName %223 "param"
472               OpName %225 "param"
473               OpName %226 "param"
474               OpName %227 "param"
475               OpMemberDecorate %38 0 Offset 0
476               OpDecorate %38 Block
477               OpDecorate %40 DescriptorSet 0
478               OpDecorate %40 Binding 1
479               OpDecorate %50 Location 0
480               OpDecorate %204 BuiltIn FragCoord
481               OpMemberDecorate %207 0 Offset 0
482               OpDecorate %207 Block
483               OpDecorate %209 DescriptorSet 0
484               OpDecorate %209 Binding 0
485          %2 = OpTypeVoid
486          %3 = OpTypeFunction %2
487          %8 = OpTypeFloat 32
488          %9 = OpTypeVector %8 2
489         %10 = OpTypePointer Function %9
490         %16 = OpTypeInt 32 1
491         %17 = OpTypeFunction %16 %10 %10 %10 %10
492         %24 = OpTypeVector %8 4
493         %27 = OpConstant %8 1
494         %28 = OpConstantComposite %24 %27 %27 %27 %27
495         %31 = OpConstant %16 0
496         %38 = OpTypeStruct %9
497         %39 = OpTypePointer Uniform %38
498         %40 = OpVariable %39 Uniform
499         %41 = OpTypeInt 32 0
500         %42 = OpConstant %41 1
501         %43 = OpTypePointer Uniform %8
502         %47 = OpTypeBool
503         %49 = OpTypePointer Output %24
504         %50 = OpVariable %49 Output
505         %65 = OpConstant %16 1
506         %69 = OpConstant %41 0
507         %70 = OpTypePointer Function %8
508        %137 = OpConstant %8 0
509        %203 = OpTypePointer Input %24
510        %204 = OpVariable %203 Input
511        %207 = OpTypeStruct %9
512        %208 = OpTypePointer Uniform %207
513        %209 = OpVariable %208 Uniform
514        %210 = OpTypePointer Uniform %9
515        %214 = OpConstant %8 0.699999988
516        %215 = OpConstant %8 0.300000012
517        %216 = OpConstantComposite %9 %214 %215
518        %217 = OpConstant %8 0.5
519        %218 = OpConstant %8 0.899999976
520        %219 = OpConstantComposite %9 %217 %218
521        %220 = OpConstant %8 0.100000001
522        %221 = OpConstant %8 0.400000006
523        %222 = OpConstantComposite %9 %220 %221
524        %239 = OpConstantComposite %24 %27 %137 %137 %27
525        %241 = OpConstantComposite %24 %137 %137 %137 %27
526          %4 = OpFunction %2 None %3
527          %5 = OpLabel
528        %223 = OpVariable %10 Function
529        %225 = OpVariable %10 Function
530        %226 = OpVariable %10 Function
531        %227 = OpVariable %10 Function
532        %205 = OpLoad %24 %204
533        %206 = OpVectorShuffle %9 %205 %205 0 1
534        %211 = OpAccessChain %210 %209 %31
535        %212 = OpLoad %9 %211
536        %213 = OpFDiv %9 %206 %212
537               OpStore %223 %213
538               OpStore %225 %216
539               OpStore %226 %219
540               OpStore %227 %222
541        %228 = OpFunctionCall %16 %22 %223 %225 %226 %227
542        %229 = OpIEqual %47 %228 %65
543               OpSelectionMerge %231 None
544               OpBranchConditional %229 %230 %240
545        %230 = OpLabel
546        %232 = OpAccessChain %43 %40 %31 %42
547        %233 = OpLoad %8 %232
548        %234 = OpAccessChain %43 %40 %31 %69
549        %235 = OpLoad %8 %234
550        %236 = OpFOrdGreaterThanEqual %47 %233 %235
551               OpSelectionMerge %238 None
552               OpBranchConditional %236 %237 %238
553        %237 = OpLabel
554               OpStore %50 %239
555               OpBranch %238
556        %238 = OpLabel
557               OpBranch %231
558        %240 = OpLabel
559               OpStore %50 %241
560               OpBranch %231
561        %231 = OpLabel
562               OpReturn
563               OpFunctionEnd
564         %22 = OpFunction %16 None %17
565         %18 = OpFunctionParameter %10
566         %19 = OpFunctionParameter %10
567         %20 = OpFunctionParameter %10
568         %21 = OpFunctionParameter %10
569         %23 = OpLabel
570        %294 = OpVariable %70 Function
571        %261 = OpVariable %70 Function
572        %248 = OpVariable %70 Function
573        %107 = OpVariable %10 Function
574        %108 = OpVariable %10 Function
575        %133 = OpVariable %10 Function
576        %134 = OpVariable %10 Function
577        %179 = OpVariable %10 Function
578        %180 = OpVariable %10 Function
579         %85 = OpAccessChain %70 %18 %69
580         %86 = OpLoad %8 %85
581         %87 = OpAccessChain %70 %19 %69
582         %88 = OpLoad %8 %87
583         %89 = OpFSub %8 %86 %88
584         %90 = OpAccessChain %70 %18 %42
585         %91 = OpLoad %8 %90
586         %92 = OpAccessChain %70 %19 %42
587         %93 = OpLoad %8 %92
588         %94 = OpFSub %8 %91 %93
589         %95 = OpCompositeConstruct %9 %89 %94
590         %96 = OpAccessChain %70 %20 %69
591         %97 = OpLoad %8 %96
592         %99 = OpLoad %8 %87
593        %100 = OpFSub %8 %97 %99
594        %101 = OpAccessChain %70 %20 %42
595        %102 = OpLoad %8 %101
596        %104 = OpLoad %8 %92
597        %105 = OpFSub %8 %102 %104
598        %106 = OpCompositeConstruct %9 %100 %105
599               OpStore %107 %95
600               OpStore %108 %106
601        %250 = OpAccessChain %70 %107 %69
602        %251 = OpLoad %8 %250
603        %252 = OpAccessChain %70 %108 %42
604        %253 = OpLoad %8 %252
605        %254 = OpFMul %8 %251 %253
606        %255 = OpAccessChain %70 %108 %69
607        %256 = OpLoad %8 %255
608        %257 = OpAccessChain %70 %107 %42
609        %258 = OpLoad %8 %257
610        %259 = OpFMul %8 %256 %258
611        %260 = OpFSub %8 %254 %259
612               OpStore %248 %260
613        %112 = OpLoad %8 %85
614        %114 = OpLoad %8 %96
615        %115 = OpFSub %8 %112 %114
616        %117 = OpLoad %8 %90
617        %119 = OpLoad %8 %101
618        %120 = OpFSub %8 %117 %119
619        %121 = OpCompositeConstruct %9 %115 %120
620        %122 = OpAccessChain %70 %21 %69
621        %123 = OpLoad %8 %122
622        %125 = OpLoad %8 %96
623        %126 = OpFSub %8 %123 %125
624        %127 = OpAccessChain %70 %21 %42
625        %128 = OpLoad %8 %127
626        %130 = OpLoad %8 %101
627        %131 = OpFSub %8 %128 %130
628        %132 = OpCompositeConstruct %9 %126 %131
629               OpStore %133 %121
630               OpStore %134 %132
631        %263 = OpAccessChain %70 %133 %69
632        %264 = OpLoad %8 %263
633        %265 = OpAccessChain %70 %134 %42
634        %266 = OpLoad %8 %265
635        %267 = OpFMul %8 %264 %266
636        %268 = OpAccessChain %70 %134 %69
637        %269 = OpLoad %8 %268
638        %270 = OpAccessChain %70 %133 %42
639        %271 = OpLoad %8 %270
640        %272 = OpFMul %8 %269 %271
641        %273 = OpFSub %8 %267 %272
642               OpStore %261 %273
643        %138 = OpFOrdLessThan %47 %260 %137
644        %140 = OpFOrdLessThan %47 %273 %137
645        %141 = OpLogicalAnd %47 %138 %140
646        %142 = OpLogicalNot %47 %141
647               OpSelectionMerge %144 None
648               OpBranchConditional %142 %143 %144
649        %143 = OpLabel
650        %146 = OpFOrdGreaterThanEqual %47 %260 %137
651        %148 = OpFOrdGreaterThanEqual %47 %273 %137
652        %149 = OpLogicalAnd %47 %146 %148
653               OpBranch %144
654        %144 = OpLabel
655        %150 = OpPhi %47 %141 %23 %149 %143
656        %151 = OpLogicalNot %47 %150
657               OpSelectionMerge %153 None
658               OpBranchConditional %151 %152 %153
659        %152 = OpLabel
660               OpBranch %275
661        %275 = OpLabel
662        %276 = OpPhi %16 %31 %152 %292 %291
663               OpLoopMerge %293 %291 None
664               OpBranch %277
665        %277 = OpLabel
666        %278 = OpAccessChain %43 %40 %31 %42
667        %279 = OpLoad %8 %278
668        %280 = OpConvertFToS %16 %279
669        %281 = OpSLessThan %47 %276 %280
670               OpBranchConditional %281 %282 %293
671        %282 = OpLabel
672               OpStore %50 %28
673               OpBranch %283
674        %283 = OpLabel
675        %284 = OpPhi %16 %31 %282 %289 %288
676               OpLoopMerge %290 %288 None
677               OpBranch %285
678        %285 = OpLabel
679        %286 = OpSLessThan %47 %284 %280
680               OpBranchConditional %286 %287 %290
681        %287 = OpLabel
682               OpStore %50 %28
683               OpBranch %288
684        %288 = OpLabel
685        %289 = OpIAdd %16 %284 %65
686               OpBranch %283
687        %290 = OpLabel
688               OpBranch %291
689        %291 = OpLabel
690        %292 = OpIAdd %16 %276 %65
691               OpBranch %275
692        %293 = OpLabel
693               OpReturnValue %31
694        %153 = OpLabel
695        %158 = OpLoad %8 %85
696        %160 = OpLoad %8 %122
697        %161 = OpFSub %8 %158 %160
698        %163 = OpLoad %8 %90
699        %165 = OpLoad %8 %127
700        %166 = OpFSub %8 %163 %165
701        %167 = OpCompositeConstruct %9 %161 %166
702        %169 = OpLoad %8 %87
703        %171 = OpLoad %8 %122
704        %172 = OpFSub %8 %169 %171
705        %174 = OpLoad %8 %92
706        %176 = OpLoad %8 %127
707        %177 = OpFSub %8 %174 %176
708        %178 = OpCompositeConstruct %9 %172 %177
709               OpStore %179 %167
710               OpStore %180 %178
711        %296 = OpAccessChain %70 %179 %69
712        %297 = OpLoad %8 %296
713        %298 = OpAccessChain %70 %180 %42
714        %299 = OpLoad %8 %298
715        %300 = OpFMul %8 %297 %299
716        %301 = OpAccessChain %70 %180 %69
717        %302 = OpLoad %8 %301
718        %303 = OpAccessChain %70 %179 %42
719        %304 = OpLoad %8 %303
720        %305 = OpFMul %8 %302 %304
721        %306 = OpFSub %8 %300 %305
722               OpStore %294 %306
723        %185 = OpFOrdLessThan %47 %306 %137
724        %186 = OpLogicalAnd %47 %138 %185
725        %187 = OpLogicalNot %47 %186
726               OpSelectionMerge %189 None
727               OpBranchConditional %187 %188 %189
728        %188 = OpLabel
729        %191 = OpFOrdGreaterThanEqual %47 %260 %137
730        %193 = OpFOrdGreaterThanEqual %47 %306 %137
731        %194 = OpLogicalAnd %47 %191 %193
732               OpBranch %189
733        %189 = OpLabel
734        %195 = OpPhi %47 %186 %153 %194 %188
735        %196 = OpLogicalNot %47 %195
736               OpSelectionMerge %198 None
737               OpBranchConditional %196 %197 %198
738        %197 = OpLabel
739               OpReturnValue %31
740        %198 = OpLabel
741               OpReturnValue %65
742               OpFunctionEnd
743END
744
745# uniforms for variant
746
747# resolution
748BUFFER variant_resolution DATA_TYPE vec2<float> DATA
749 256.0 256.0
750END
751# injectionSwitch
752BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
753 0.0 1.0
754END
755
756BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
757
758PIPELINE graphics variant_pipeline
759  ATTACH variant_vertex_shader
760  ATTACH variant_fragment_shader
761  FRAMEBUFFER_SIZE 256 256
762  BIND BUFFER variant_framebuffer AS color LOCATION 0
763  BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
764  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 1
765END
766CLEAR_COLOR variant_pipeline 0 0 0 255
767
768CLEAR variant_pipeline
769RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
770
771EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
772