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