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