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