• 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 the GraphicsFuzz project.
19
20# Short description: Three shaders with diff: added mutate pointer
21
22# The test renders three images using semantically equivalent shaders, and then
23# checks that the images are similar.
24# The test passes because the shaders have the same semantics and so the images
25# should be the same.
26
27SHADER vertex reference_vertex_shader PASSTHROUGH
28
29SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
30; SPIR-V
31; Version: 1.0
32; Generator: Khronos Glslang Reference Front End; 7
33; Bound: 229
34; Schema: 0
35               OpCapability Shader
36          %1 = OpExtInstImport "GLSL.std.450"
37               OpMemoryModel Logical GLSL450
38               OpEntryPoint Fragment %4 "main" %53 %138
39               OpExecutionMode %4 OriginUpperLeft
40               OpSource ESSL 320
41               OpName %4 "main"
42               OpName %53 "gl_FragCoord"
43               OpName %56 "buf0"
44               OpMemberName %56 0 "resolution"
45               OpName %58 ""
46               OpName %138 "_GLF_color"
47               OpName %163 "indexable"
48               OpDecorate %53 BuiltIn FragCoord
49               OpMemberDecorate %56 0 Offset 0
50               OpDecorate %56 Block
51               OpDecorate %58 DescriptorSet 0
52               OpDecorate %58 Binding 0
53               OpDecorate %138 Location 0
54          %2 = OpTypeVoid
55          %3 = OpTypeFunction %2
56          %6 = OpTypeInt 32 1
57          %7 = OpTypeVector %6 2
58         %13 = OpTypeInt 32 0
59         %18 = OpConstant %6 0
60         %19 = OpTypeBool
61         %26 = OpConstant %6 1
62         %38 = OpConstant %6 2
63         %47 = OpTypeFloat 32
64         %48 = OpTypeVector %47 2
65         %51 = OpTypeVector %47 4
66         %52 = OpTypePointer Input %51
67         %53 = OpVariable %52 Input
68         %56 = OpTypeStruct %48
69         %57 = OpTypePointer Uniform %56
70         %58 = OpVariable %57 Uniform
71         %59 = OpTypePointer Uniform %48
72         %67 = OpConstant %47 8
73         %78 = OpConstant %6 5
74         %82 = OpConstant %6 10
75         %95 = OpConstant %6 8
76        %107 = OpConstant %6 100
77        %130 = OpConstant %6 15
78        %132 = OpConstant %6 16
79        %137 = OpTypePointer Output %51
80        %138 = OpVariable %137 Output
81        %139 = OpConstant %13 16
82        %140 = OpTypeArray %51 %139
83        %141 = OpConstant %47 0
84        %142 = OpConstant %47 1
85        %143 = OpConstantComposite %51 %141 %141 %141 %142
86        %144 = OpConstant %47 0.5
87        %145 = OpConstantComposite %51 %144 %141 %141 %142
88        %146 = OpConstantComposite %51 %141 %144 %141 %142
89        %147 = OpConstantComposite %51 %144 %144 %141 %142
90        %148 = OpConstantComposite %51 %141 %141 %144 %142
91        %149 = OpConstantComposite %51 %144 %141 %144 %142
92        %150 = OpConstantComposite %51 %141 %144 %144 %142
93        %151 = OpConstantComposite %51 %144 %144 %144 %142
94        %152 = OpConstantComposite %51 %142 %141 %141 %142
95        %153 = OpConstantComposite %51 %141 %142 %141 %142
96        %154 = OpConstantComposite %51 %142 %142 %141 %142
97        %155 = OpConstantComposite %51 %141 %141 %142 %142
98        %156 = OpConstantComposite %51 %142 %141 %142 %142
99        %157 = OpConstantComposite %51 %141 %142 %142 %142
100        %158 = OpConstantComposite %51 %142 %142 %142 %142
101        %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158
102        %162 = OpTypePointer Function %140
103        %164 = OpTypePointer Function %51
104          %4 = OpFunction %2 None %3
105          %5 = OpLabel
106        %163 = OpVariable %162 Function
107         %54 = OpLoad %51 %53
108         %55 = OpVectorShuffle %48 %54 %54 0 1
109         %60 = OpAccessChain %59 %58 %18
110         %61 = OpLoad %48 %60
111         %62 = OpFDiv %48 %55 %61
112         %66 = OpCompositeExtract %47 %62 0
113         %68 = OpFMul %47 %66 %67
114         %69 = OpConvertFToS %6 %68
115         %71 = OpCompositeExtract %47 %62 1
116         %72 = OpFMul %47 %71 %67
117         %73 = OpConvertFToS %6 %72
118         %79 = OpBitwiseAnd %6 %69 %78
119         %83 = OpBitwiseAnd %6 %73 %82
120         %84 = OpBitwiseOr %6 %79 %83
121         %88 = OpBitwiseAnd %6 %73 %78
122         %91 = OpBitwiseAnd %6 %69 %82
123         %92 = OpBitwiseOr %6 %88 %91
124         %96 = OpIMul %6 %84 %95
125         %98 = OpIAdd %6 %96 %92
126         %99 = OpCompositeConstruct %7 %98 %18
127               OpBranch %101
128        %101 = OpLabel
129        %224 = OpPhi %7 %99 %5 %214 %104
130        %193 = OpPhi %6 %18 %5 %113 %104
131        %108 = OpSLessThan %19 %193 %107
132               OpLoopMerge %103 %104 None
133               OpBranchConditional %108 %102 %103
134        %102 = OpLabel
135        %170 = OpCompositeExtract %6 %224 0
136        %171 = OpSGreaterThan %19 %170 %18
137               OpSelectionMerge %176 None
138               OpBranchConditional %171 %172 %176
139        %172 = OpLabel
140        %174 = OpCompositeExtract %6 %224 1
141        %175 = OpISub %6 %174 %26
142        %206 = OpCompositeInsert %7 %175 %224 1
143               OpBranch %176
144        %176 = OpLabel
145        %227 = OpPhi %7 %224 %102 %206 %172
146        %178 = OpCompositeExtract %6 %227 0
147        %179 = OpSLessThan %19 %178 %18
148               OpSelectionMerge %184 None
149               OpBranchConditional %179 %180 %184
150        %180 = OpLabel
151        %182 = OpCompositeExtract %6 %227 1
152        %183 = OpIAdd %6 %182 %26
153        %210 = OpCompositeInsert %7 %183 %227 1
154               OpBranch %184
155        %184 = OpLabel
156        %228 = OpPhi %7 %227 %176 %210 %180
157        %186 = OpCompositeExtract %6 %228 1
158        %187 = OpSDiv %6 %186 %38
159        %189 = OpCompositeExtract %6 %228 0
160        %190 = OpIAdd %6 %189 %187
161        %214 = OpCompositeInsert %7 %190 %228 0
162               OpBranch %104
163        %104 = OpLabel
164        %113 = OpIAdd %6 %193 %26
165               OpBranch %101
166        %103 = OpLabel
167        %115 = OpCompositeExtract %6 %224 0
168        %116 = OpSLessThan %19 %115 %18
169               OpSelectionMerge %118 None
170               OpBranchConditional %116 %117 %118
171        %117 = OpLabel
172        %121 = OpSNegate %6 %115
173        %218 = OpCompositeInsert %7 %121 %224 0
174               OpBranch %118
175        %118 = OpLabel
176        %226 = OpPhi %7 %224 %103 %218 %117
177               OpBranch %123
178        %123 = OpLabel
179        %225 = OpPhi %7 %226 %118 %222 %124
180        %129 = OpCompositeExtract %6 %225 0
181        %131 = OpSGreaterThan %19 %129 %130
182               OpLoopMerge %125 %124 None
183               OpBranchConditional %131 %124 %125
184        %124 = OpLabel
185        %135 = OpISub %6 %129 %132
186        %222 = OpCompositeInsert %7 %135 %225 0
187               OpBranch %123
188        %125 = OpLabel
189               OpStore %163 %159
190        %165 = OpAccessChain %164 %163 %129
191        %166 = OpLoad %51 %165
192               OpStore %138 %166
193               OpReturn
194               OpFunctionEnd
195END
196
197# uniforms for reference
198
199# resolution
200BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
201 256.0 256.0
202END
203
204BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
205
206PIPELINE graphics reference_pipeline
207  ATTACH reference_vertex_shader
208  ATTACH reference_fragment_shader
209  FRAMEBUFFER_SIZE 256 256
210  BIND BUFFER reference_framebuffer AS color LOCATION 0
211  BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
212END
213CLEAR_COLOR reference_pipeline 0 0 0 255
214
215CLEAR reference_pipeline
216RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
217
218
219SHADER vertex variant_vertex_shader PASSTHROUGH
220
221SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
222; SPIR-V
223; Version: 1.0
224; Generator: Khronos Glslang Reference Front End; 7
225; Bound: 549
226; Schema: 0
227               OpCapability Shader
228          %1 = OpExtInstImport "GLSL.std.450"
229               OpMemoryModel Logical GLSL450
230               OpEntryPoint Fragment %4 "main" %53 %138
231               OpExecutionMode %4 OriginUpperLeft
232               OpSource ESSL 320
233               OpName %4 "main"
234               OpName %53 "gl_FragCoord"
235               OpName %56 "buf0"
236               OpMemberName %56 0 "resolution"
237               OpName %58 ""
238               OpName %138 "_GLF_color"
239               OpName %163 "indexable"
240               OpDecorate %53 BuiltIn FragCoord
241               OpMemberDecorate %56 0 Offset 0
242               OpDecorate %56 Block
243               OpDecorate %58 DescriptorSet 0
244               OpDecorate %58 Binding 0
245               OpDecorate %138 Location 0
246          %2 = OpTypeVoid
247          %3 = OpTypeFunction %2
248          %6 = OpTypeInt 32 1
249          %7 = OpTypeVector %6 2
250         %13 = OpTypeInt 32 0
251         %18 = OpConstant %6 0
252         %19 = OpTypeBool
253         %26 = OpConstant %6 1
254         %38 = OpConstant %6 2
255         %47 = OpTypeFloat 32
256         %48 = OpTypeVector %47 2
257         %51 = OpTypeVector %47 4
258         %52 = OpTypePointer Input %51
259         %53 = OpVariable %52 Input
260         %56 = OpTypeStruct %48
261         %57 = OpTypePointer Uniform %56
262         %58 = OpVariable %57 Uniform
263         %59 = OpTypePointer Uniform %48
264         %67 = OpConstant %47 8
265         %78 = OpConstant %6 5
266         %82 = OpConstant %6 10
267         %95 = OpConstant %6 8
268        %107 = OpConstant %6 100
269        %130 = OpConstant %6 15
270        %132 = OpConstant %6 16
271        %137 = OpTypePointer Output %51
272        %138 = OpVariable %137 Output
273        %139 = OpConstant %13 16
274        %140 = OpTypeArray %51 %139
275        %141 = OpConstant %47 0
276        %142 = OpConstant %47 1
277        %143 = OpConstantComposite %51 %141 %141 %141 %142
278        %144 = OpConstant %47 0.5
279        %145 = OpConstantComposite %51 %144 %141 %141 %142
280        %146 = OpConstantComposite %51 %141 %144 %141 %142
281        %147 = OpConstantComposite %51 %144 %144 %141 %142
282        %148 = OpConstantComposite %51 %141 %141 %144 %142
283        %149 = OpConstantComposite %51 %144 %141 %144 %142
284        %150 = OpConstantComposite %51 %141 %144 %144 %142
285        %151 = OpConstantComposite %51 %144 %144 %144 %142
286        %152 = OpConstantComposite %51 %142 %141 %141 %142
287        %153 = OpConstantComposite %51 %141 %142 %141 %142
288        %154 = OpConstantComposite %51 %142 %142 %141 %142
289        %155 = OpConstantComposite %51 %141 %141 %142 %142
290        %156 = OpConstantComposite %51 %142 %141 %142 %142
291        %157 = OpConstantComposite %51 %141 %142 %142 %142
292        %158 = OpConstantComposite %51 %142 %142 %142 %142
293        %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158
294        %162 = OpTypePointer Function %140
295        %164 = OpTypePointer Function %51
296        %440 = OpConstant %47 0
297        %441 = OpConstantComposite %51 %440 %440 %440 %440
298        %442 = OpConstantComposite %140 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441
299          %4 = OpFunction %2 None %3
300          %5 = OpLabel
301        %163 = OpVariable %162 Function
302         %54 = OpLoad %51 %53
303         %55 = OpVectorShuffle %48 %54 %54 0 1
304         %60 = OpAccessChain %59 %58 %18
305         %61 = OpLoad %48 %60
306         %62 = OpFDiv %48 %55 %61
307         %66 = OpCompositeExtract %47 %62 0
308         %68 = OpFMul %47 %66 %67
309         %69 = OpConvertFToS %6 %68
310        %330 = OpAccessChain %162 %163
311         %71 = OpCompositeExtract %47 %62 1
312         %72 = OpFMul %47 %71 %67
313         %73 = OpConvertFToS %6 %72
314         %79 = OpBitwiseAnd %6 %69 %78
315         %83 = OpBitwiseAnd %6 %73 %82
316         %84 = OpBitwiseOr %6 %79 %83
317         %88 = OpBitwiseAnd %6 %73 %78
318         %91 = OpBitwiseAnd %6 %69 %82
319         %92 = OpBitwiseOr %6 %88 %91
320         %96 = OpIMul %6 %84 %95
321         %98 = OpIAdd %6 %96 %92
322         %99 = OpCompositeConstruct %7 %98 %18
323               OpBranch %101
324        %101 = OpLabel
325        %224 = OpPhi %7 %99 %5 %214 %104
326        %193 = OpPhi %6 %18 %5 %113 %104
327        %108 = OpSLessThan %19 %193 %107
328               OpLoopMerge %103 %104 None
329               OpBranchConditional %108 %102 %103
330        %102 = OpLabel
331        %170 = OpCompositeExtract %6 %224 0
332        %171 = OpSGreaterThan %19 %170 %18
333               OpSelectionMerge %176 None
334               OpBranchConditional %171 %172 %176
335        %172 = OpLabel
336        %174 = OpCompositeExtract %6 %224 1
337        %175 = OpISub %6 %174 %26
338        %206 = OpCompositeInsert %7 %175 %224 1
339               OpBranch %176
340        %176 = OpLabel
341        %227 = OpPhi %7 %224 %102 %206 %172
342        %178 = OpCompositeExtract %6 %227 0
343        %179 = OpSLessThan %19 %178 %18
344               OpSelectionMerge %184 None
345               OpBranchConditional %179 %180 %184
346        %180 = OpLabel
347        %182 = OpCompositeExtract %6 %227 1
348        %183 = OpIAdd %6 %182 %26
349        %210 = OpCompositeInsert %7 %183 %227 1
350               OpBranch %184
351        %184 = OpLabel
352        %228 = OpPhi %7 %227 %176 %210 %180
353        %186 = OpCompositeExtract %6 %228 1
354        %187 = OpSDiv %6 %186 %38
355        %189 = OpCompositeExtract %6 %228 0
356        %190 = OpIAdd %6 %189 %187
357        %214 = OpCompositeInsert %7 %190 %228 0
358               OpBranch %104
359        %104 = OpLabel
360        %113 = OpIAdd %6 %193 %26
361               OpBranch %101
362        %103 = OpLabel
363        %115 = OpCompositeExtract %6 %224 0
364        %116 = OpSLessThan %19 %115 %18
365               OpSelectionMerge %118 None
366               OpBranchConditional %116 %117 %118
367        %117 = OpLabel
368        %121 = OpSNegate %6 %115
369        %218 = OpCompositeInsert %7 %121 %224 0
370               OpBranch %118
371        %118 = OpLabel
372        %226 = OpPhi %7 %224 %103 %218 %117
373               OpBranch %123
374        %123 = OpLabel
375        %225 = OpPhi %7 %226 %118 %222 %124
376        %129 = OpCompositeExtract %6 %225 0
377        %131 = OpSGreaterThan %19 %129 %130
378               OpLoopMerge %125 %124 None
379               OpBranchConditional %131 %124 %125
380        %124 = OpLabel
381        %135 = OpISub %6 %129 %132
382        %222 = OpCompositeInsert %7 %135 %225 0
383               OpBranch %123
384        %125 = OpLabel
385               OpStore %163 %159
386        %165 = OpAccessChain %164 %163 %129
387        %548 = OpLoad %140 %330
388               OpStore %330 %442
389               OpStore %330 %548
390        %166 = OpLoad %51 %165
391               OpStore %138 %166
392               OpReturn
393               OpFunctionEnd
394END
395
396# uniforms for variant
397
398# resolution
399BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
400 256.0 256.0
401END
402
403BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
404
405PIPELINE graphics variant_pipeline
406  ATTACH variant_vertex_shader
407  ATTACH variant_fragment_shader
408  FRAMEBUFFER_SIZE 256 256
409  BIND BUFFER variant_framebuffer AS color LOCATION 0
410  BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
411END
412CLEAR_COLOR variant_pipeline 0 0 0 255
413
414CLEAR variant_pipeline
415RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
416
417
418SHADER vertex variant_2_vertex_shader PASSTHROUGH
419
420SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
421; SPIR-V
422; Version: 1.0
423; Generator: Khronos Glslang Reference Front End; 7
424; Bound: 443
425; Schema: 0
426               OpCapability Shader
427          %1 = OpExtInstImport "GLSL.std.450"
428               OpMemoryModel Logical GLSL450
429               OpEntryPoint Fragment %4 "main" %53 %138
430               OpExecutionMode %4 OriginUpperLeft
431               OpSource ESSL 320
432               OpName %4 "main"
433               OpName %53 "gl_FragCoord"
434               OpName %56 "buf0"
435               OpMemberName %56 0 "resolution"
436               OpName %58 ""
437               OpName %138 "_GLF_color"
438               OpName %163 "indexable"
439               OpDecorate %53 BuiltIn FragCoord
440               OpMemberDecorate %56 0 Offset 0
441               OpDecorate %56 Block
442               OpDecorate %58 DescriptorSet 0
443               OpDecorate %58 Binding 0
444               OpDecorate %138 Location 0
445          %2 = OpTypeVoid
446          %3 = OpTypeFunction %2
447          %6 = OpTypeInt 32 1
448          %7 = OpTypeVector %6 2
449         %13 = OpTypeInt 32 0
450         %18 = OpConstant %6 0
451         %19 = OpTypeBool
452         %26 = OpConstant %6 1
453         %38 = OpConstant %6 2
454         %47 = OpTypeFloat 32
455         %48 = OpTypeVector %47 2
456         %51 = OpTypeVector %47 4
457         %52 = OpTypePointer Input %51
458         %53 = OpVariable %52 Input
459         %56 = OpTypeStruct %48
460         %57 = OpTypePointer Uniform %56
461         %58 = OpVariable %57 Uniform
462         %59 = OpTypePointer Uniform %48
463         %67 = OpConstant %47 8
464         %78 = OpConstant %6 5
465         %82 = OpConstant %6 10
466         %95 = OpConstant %6 8
467        %107 = OpConstant %6 100
468        %130 = OpConstant %6 15
469        %132 = OpConstant %6 16
470        %137 = OpTypePointer Output %51
471        %138 = OpVariable %137 Output
472        %139 = OpConstant %13 16
473        %140 = OpTypeArray %51 %139
474        %141 = OpConstant %47 0
475        %142 = OpConstant %47 1
476        %143 = OpConstantComposite %51 %141 %141 %141 %142
477        %144 = OpConstant %47 0.5
478        %145 = OpConstantComposite %51 %144 %141 %141 %142
479        %146 = OpConstantComposite %51 %141 %144 %141 %142
480        %147 = OpConstantComposite %51 %144 %144 %141 %142
481        %148 = OpConstantComposite %51 %141 %141 %144 %142
482        %149 = OpConstantComposite %51 %144 %141 %144 %142
483        %150 = OpConstantComposite %51 %141 %144 %144 %142
484        %151 = OpConstantComposite %51 %144 %144 %144 %142
485        %152 = OpConstantComposite %51 %142 %141 %141 %142
486        %153 = OpConstantComposite %51 %141 %142 %141 %142
487        %154 = OpConstantComposite %51 %142 %142 %141 %142
488        %155 = OpConstantComposite %51 %141 %141 %142 %142
489        %156 = OpConstantComposite %51 %142 %141 %142 %142
490        %157 = OpConstantComposite %51 %141 %142 %142 %142
491        %158 = OpConstantComposite %51 %142 %142 %142 %142
492        %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158
493        %162 = OpTypePointer Function %140
494        %164 = OpTypePointer Function %51
495        %440 = OpConstant %47 0
496        %441 = OpConstantComposite %51 %440 %440 %440 %440
497        %442 = OpConstantComposite %140 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441
498          %4 = OpFunction %2 None %3
499          %5 = OpLabel
500        %163 = OpVariable %162 Function
501         %54 = OpLoad %51 %53
502         %55 = OpVectorShuffle %48 %54 %54 0 1
503         %60 = OpAccessChain %59 %58 %18
504         %61 = OpLoad %48 %60
505         %62 = OpFDiv %48 %55 %61
506         %66 = OpCompositeExtract %47 %62 0
507         %68 = OpFMul %47 %66 %67
508         %69 = OpConvertFToS %6 %68
509        %330 = OpAccessChain %162 %163
510         %71 = OpCompositeExtract %47 %62 1
511         %72 = OpFMul %47 %71 %67
512         %73 = OpConvertFToS %6 %72
513         %79 = OpBitwiseAnd %6 %69 %78
514         %83 = OpBitwiseAnd %6 %73 %82
515         %84 = OpBitwiseOr %6 %79 %83
516         %88 = OpBitwiseAnd %6 %73 %78
517         %91 = OpBitwiseAnd %6 %69 %82
518         %92 = OpBitwiseOr %6 %88 %91
519         %96 = OpIMul %6 %84 %95
520         %98 = OpIAdd %6 %96 %92
521         %99 = OpCompositeConstruct %7 %98 %18
522               OpBranch %101
523        %101 = OpLabel
524        %224 = OpPhi %7 %99 %5 %214 %104
525        %193 = OpPhi %6 %18 %5 %113 %104
526        %108 = OpSLessThan %19 %193 %107
527               OpLoopMerge %103 %104 None
528               OpBranchConditional %108 %102 %103
529        %102 = OpLabel
530        %170 = OpCompositeExtract %6 %224 0
531        %171 = OpSGreaterThan %19 %170 %18
532               OpSelectionMerge %176 None
533               OpBranchConditional %171 %172 %176
534        %172 = OpLabel
535        %174 = OpCompositeExtract %6 %224 1
536        %175 = OpISub %6 %174 %26
537        %206 = OpCompositeInsert %7 %175 %224 1
538               OpBranch %176
539        %176 = OpLabel
540        %227 = OpPhi %7 %224 %102 %206 %172
541        %178 = OpCompositeExtract %6 %227 0
542        %179 = OpSLessThan %19 %178 %18
543               OpSelectionMerge %184 None
544               OpBranchConditional %179 %180 %184
545        %180 = OpLabel
546        %182 = OpCompositeExtract %6 %227 1
547        %183 = OpIAdd %6 %182 %26
548        %210 = OpCompositeInsert %7 %183 %227 1
549               OpBranch %184
550        %184 = OpLabel
551        %228 = OpPhi %7 %227 %176 %210 %180
552        %186 = OpCompositeExtract %6 %228 1
553        %187 = OpSDiv %6 %186 %38
554        %189 = OpCompositeExtract %6 %228 0
555        %190 = OpIAdd %6 %189 %187
556        %214 = OpCompositeInsert %7 %190 %228 0
557               OpBranch %104
558        %104 = OpLabel
559        %113 = OpIAdd %6 %193 %26
560               OpBranch %101
561        %103 = OpLabel
562        %115 = OpCompositeExtract %6 %224 0
563        %116 = OpSLessThan %19 %115 %18
564               OpSelectionMerge %118 None
565               OpBranchConditional %116 %117 %118
566        %117 = OpLabel
567        %121 = OpSNegate %6 %115
568        %218 = OpCompositeInsert %7 %121 %224 0
569               OpBranch %118
570        %118 = OpLabel
571        %226 = OpPhi %7 %224 %103 %218 %117
572               OpBranch %123
573        %123 = OpLabel
574        %225 = OpPhi %7 %226 %118 %222 %124
575        %129 = OpCompositeExtract %6 %225 0
576        %131 = OpSGreaterThan %19 %129 %130
577               OpLoopMerge %125 %124 None
578               OpBranchConditional %131 %124 %125
579        %124 = OpLabel
580        %135 = OpISub %6 %129 %132
581        %222 = OpCompositeInsert %7 %135 %225 0
582               OpBranch %123
583        %125 = OpLabel
584               OpStore %163 %159
585        %165 = OpAccessChain %164 %163 %129
586        %166 = OpLoad %51 %165
587               OpStore %138 %166
588               OpReturn
589               OpFunctionEnd
590END
591
592# uniforms for variant_2
593
594# resolution
595BUFFER variant_2_resolution DATA_TYPE vec2<float> STD140 DATA
596 256.0 256.0
597END
598
599BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM
600
601PIPELINE graphics variant_2_pipeline
602  ATTACH variant_2_vertex_shader
603  ATTACH variant_2_fragment_shader
604  FRAMEBUFFER_SIZE 256 256
605  BIND BUFFER variant_2_framebuffer AS color LOCATION 0
606  BIND BUFFER variant_2_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
607END
608CLEAR_COLOR variant_2_pipeline 0 0 0 255
609
610CLEAR variant_2_pipeline
611RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256
612
613EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
614EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005
615