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