3 # Copyright 2020 Google LLC
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
9 # http://www.apache.org/licenses/LICENSE-2.0
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.
18 # A test for a bug found by GraphicsFuzz.
20 # Short description: A fragment shader with gl_FragCoord.x less than zero
22 # The test passes because both shaders render the same image.
24 SHADER vertex reference_vertex_shader PASSTHROUGH
26 # reference_fragment_shader is derived from the following GLSL:
28 # precision highp float;
30 # precision highp int;
32 # layout(location = 0) out vec4 _GLF_color;
42 # void makeTreeNode(inout BST tree, int data)
45 # tree.leftIndex = - 1;
46 # tree.rightIndex = - 1;
48 # void insert(int treeIndex, int data)
51 # while(baseIndex <= treeIndex)
53 # if(data <= tree[baseIndex].data)
55 # if(tree[baseIndex].leftIndex == - 1)
57 # tree[baseIndex].leftIndex = treeIndex;
58 # makeTreeNode(tree[treeIndex], data);
63 # baseIndex = tree[baseIndex].leftIndex;
69 # if(tree[baseIndex].rightIndex == - 1)
71 # tree[baseIndex].rightIndex = treeIndex;
72 # makeTreeNode(tree[treeIndex], data);
77 # baseIndex = tree[baseIndex].rightIndex;
83 # int search(int target)
89 # currentNode = tree[index];
90 # if(currentNode.data == target)
94 # index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex;
101 # makeTreeNode(tree[0], 9);
103 # insert(treeIndex, 5);
105 # insert(treeIndex, 12);
107 # insert(treeIndex, 15);
109 # insert(treeIndex, 7);
111 # insert(treeIndex, 8);
113 # insert(treeIndex, 2);
115 # insert(treeIndex, 6);
117 # insert(treeIndex, 17);
119 # insert(treeIndex, 13);
121 # for(int i = 0; i < 20; i ++)
123 # int result = search(i);
151 # _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
155 # _GLF_color = vec4(0.0, 0.0, 1.0, 1.0);
158 SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
161 ; Generator: Khronos Glslang Reference Front End; 10
165 %1 = OpExtInstImport "GLSL.std.450"
166 OpMemoryModel Logical GLSL450
167 OpEntryPoint Fragment %4 "main" %254
168 OpExecutionMode %4 OriginUpperLeft
172 OpMemberName %7 0 "data"
173 OpMemberName %7 1 "leftIndex"
174 OpMemberName %7 2 "rightIndex"
175 OpName %13 "makeTreeNode(struct-BST-i1-i1-i11;i1;"
178 OpName %18 "insert(i1;i1;"
179 OpName %16 "treeIndex"
181 OpName %22 "search(i1;"
183 OpName %32 "baseIndex"
190 OpName %113 "currentNode"
191 OpName %140 "treeIndex"
216 OpName %254 "_GLF_color"
217 OpDecorate %254 Location 0
219 %3 = OpTypeFunction %2
221 %7 = OpTypeStruct %6 %6 %6
222 %8 = OpTypePointer Function %7
223 %9 = OpTypePointer Function %6
224 %10 = OpTypeFunction %2 %8 %9
225 %15 = OpTypeFunction %2 %9 %9
226 %20 = OpTypeFunction %6 %9
227 %24 = OpConstant %6 0
228 %27 = OpConstant %6 1
229 %28 = OpConstant %6 -1
230 %30 = OpConstant %6 2
233 %44 = OpConstant %43 10
234 %45 = OpTypeArray %7 %44
235 %46 = OpTypePointer Private %45
236 %47 = OpVariable %46 Private
237 %49 = OpTypePointer Private %6
238 %66 = OpTypePointer Private %7
239 %141 = OpConstant %6 9
240 %151 = OpConstant %6 5
241 %158 = OpConstant %6 12
242 %165 = OpConstant %6 15
243 %172 = OpConstant %6 7
244 %179 = OpConstant %6 8
245 %192 = OpConstant %6 6
246 %199 = OpConstant %6 17
247 %206 = OpConstant %6 13
248 %219 = OpConstant %6 20
249 %251 = OpTypeFloat 32
250 %252 = OpTypeVector %251 4
251 %253 = OpTypePointer Output %252
252 %254 = OpVariable %253 Output
253 %255 = OpConstant %251 1
254 %256 = OpConstant %251 0
255 %257 = OpConstantComposite %252 %255 %256 %256 %255
256 %259 = OpConstantComposite %252 %256 %256 %255 %255
257 %4 = OpFunction %2 None %3
259 %140 = OpVariable %9 Function
260 %142 = OpVariable %8 Function
261 %145 = OpVariable %9 Function
262 %152 = OpVariable %9 Function
263 %154 = OpVariable %9 Function
264 %159 = OpVariable %9 Function
265 %161 = OpVariable %9 Function
266 %166 = OpVariable %9 Function
267 %168 = OpVariable %9 Function
268 %173 = OpVariable %9 Function
269 %175 = OpVariable %9 Function
270 %180 = OpVariable %9 Function
271 %182 = OpVariable %9 Function
272 %186 = OpVariable %9 Function
273 %188 = OpVariable %9 Function
274 %193 = OpVariable %9 Function
275 %195 = OpVariable %9 Function
276 %200 = OpVariable %9 Function
277 %202 = OpVariable %9 Function
278 %207 = OpVariable %9 Function
279 %209 = OpVariable %9 Function
280 %211 = OpVariable %9 Function
281 %212 = OpVariable %9 Function
282 %221 = OpVariable %9 Function
283 %222 = OpVariable %9 Function
285 %143 = OpAccessChain %66 %47 %24
286 %144 = OpLoad %7 %143
289 %146 = OpFunctionCall %2 %13 %142 %145
290 %147 = OpLoad %7 %142
291 %148 = OpAccessChain %66 %47 %24
293 %149 = OpLoad %6 %140
294 %150 = OpIAdd %6 %149 %27
296 %153 = OpLoad %6 %140
299 %155 = OpFunctionCall %2 %18 %152 %154
300 %156 = OpLoad %6 %140
301 %157 = OpIAdd %6 %156 %27
303 %160 = OpLoad %6 %140
306 %162 = OpFunctionCall %2 %18 %159 %161
307 %163 = OpLoad %6 %140
308 %164 = OpIAdd %6 %163 %27
310 %167 = OpLoad %6 %140
313 %169 = OpFunctionCall %2 %18 %166 %168
314 %170 = OpLoad %6 %140
315 %171 = OpIAdd %6 %170 %27
317 %174 = OpLoad %6 %140
320 %176 = OpFunctionCall %2 %18 %173 %175
321 %177 = OpLoad %6 %140
322 %178 = OpIAdd %6 %177 %27
324 %181 = OpLoad %6 %140
327 %183 = OpFunctionCall %2 %18 %180 %182
328 %184 = OpLoad %6 %140
329 %185 = OpIAdd %6 %184 %27
331 %187 = OpLoad %6 %140
334 %189 = OpFunctionCall %2 %18 %186 %188
335 %190 = OpLoad %6 %140
336 %191 = OpIAdd %6 %190 %27
338 %194 = OpLoad %6 %140
341 %196 = OpFunctionCall %2 %18 %193 %195
342 %197 = OpLoad %6 %140
343 %198 = OpIAdd %6 %197 %27
345 %201 = OpLoad %6 %140
348 %203 = OpFunctionCall %2 %18 %200 %202
349 %204 = OpLoad %6 %140
350 %205 = OpIAdd %6 %204 %27
352 %208 = OpLoad %6 %140
355 %210 = OpFunctionCall %2 %18 %207 %209
360 OpLoopMerge %215 %216 None
363 %218 = OpLoad %6 %212
364 %220 = OpSLessThan %40 %218 %219
365 OpBranchConditional %220 %214 %215
367 %223 = OpLoad %6 %212
369 %224 = OpFunctionCall %6 %22 %222
371 %225 = OpLoad %6 %212
372 OpSelectionMerge %228 None
373 OpSwitch %225 %227 9 %226 5 %226 12 %226 15 %226 7 %226 8 %226 2 %226 6 %226 17 %226 13 %226
375 %237 = OpLoad %6 %221
376 %238 = OpIEqual %40 %237 %28
377 OpSelectionMerge %240 None
378 OpBranchConditional %238 %239 %240
380 %241 = OpLoad %6 %211
381 %242 = OpIAdd %6 %241 %27
387 %229 = OpLoad %6 %221
388 %230 = OpLoad %6 %212
389 %231 = OpIEqual %40 %229 %230
390 OpSelectionMerge %233 None
391 OpBranchConditional %231 %232 %233
393 %234 = OpLoad %6 %211
394 %235 = OpIAdd %6 %234 %27
402 %245 = OpLoad %6 %212
403 %246 = OpIAdd %6 %245 %27
407 %247 = OpLoad %6 %211
408 %248 = OpIEqual %40 %247 %219
409 OpSelectionMerge %250 None
410 OpBranchConditional %248 %249 %258
420 %13 = OpFunction %2 None %10
421 %11 = OpFunctionParameter %8
422 %12 = OpFunctionParameter %9
425 %26 = OpAccessChain %9 %11 %24
427 %29 = OpAccessChain %9 %11 %27
429 %31 = OpAccessChain %9 %11 %30
433 %18 = OpFunction %2 None %15
434 %16 = OpFunctionParameter %9
435 %17 = OpFunctionParameter %9
437 %32 = OpVariable %9 Function
438 %65 = OpVariable %8 Function
439 %69 = OpVariable %9 Function
440 %91 = OpVariable %8 Function
441 %94 = OpVariable %9 Function
445 OpLoopMerge %35 %36 None
450 %41 = OpSLessThanEqual %40 %38 %39
451 OpBranchConditional %41 %34 %35
455 %50 = OpAccessChain %49 %47 %48 %24
457 %52 = OpSLessThanEqual %40 %42 %51
458 OpSelectionMerge %54 None
459 OpBranchConditional %52 %53 %80
462 %56 = OpAccessChain %49 %47 %55 %27
464 %58 = OpIEqual %40 %57 %28
465 OpSelectionMerge %60 None
466 OpBranchConditional %58 %59 %75
470 %63 = OpAccessChain %49 %47 %61 %27
473 %67 = OpAccessChain %66 %47 %64
478 %71 = OpFunctionCall %2 %13 %65 %69
480 %73 = OpAccessChain %66 %47 %64
485 %77 = OpAccessChain %49 %47 %76 %27
493 %82 = OpAccessChain %49 %47 %81 %30
495 %84 = OpIEqual %40 %83 %28
496 OpSelectionMerge %86 None
497 OpBranchConditional %84 %85 %100
501 %89 = OpAccessChain %49 %47 %87 %30
504 %92 = OpAccessChain %66 %47 %90
509 %96 = OpFunctionCall %2 %13 %91 %94
511 %98 = OpAccessChain %66 %47 %90
516 %102 = OpAccessChain %49 %47 %101 %30
517 %103 = OpLoad %6 %102
529 %22 = OpFunction %6 None %20
530 %21 = OpFunctionParameter %9
532 %105 = OpVariable %9 Function
533 %113 = OpVariable %8 Function
534 %129 = OpVariable %9 Function
538 OpLoopMerge %108 %109 None
541 %111 = OpLoad %6 %105
542 %112 = OpINotEqual %40 %111 %28
543 OpBranchConditional %112 %107 %108
545 %114 = OpLoad %6 %105
546 %115 = OpAccessChain %66 %47 %114
547 %116 = OpLoad %7 %115
549 %117 = OpAccessChain %9 %113 %24
550 %118 = OpLoad %6 %117
552 %120 = OpIEqual %40 %118 %119
553 OpSelectionMerge %122 None
554 OpBranchConditional %120 %121 %122
560 %126 = OpAccessChain %9 %113 %24
561 %127 = OpLoad %6 %126
562 %128 = OpSGreaterThan %40 %125 %127
563 OpSelectionMerge %131 None
564 OpBranchConditional %128 %130 %134
566 %132 = OpAccessChain %9 %113 %30
567 %133 = OpLoad %6 %132
571 %135 = OpAccessChain %9 %113 %27
572 %136 = OpLoad %6 %135
576 %137 = OpLoad %6 %129
587 BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
589 PIPELINE graphics reference_pipeline
590 ATTACH reference_vertex_shader
591 ATTACH reference_fragment_shader
592 FRAMEBUFFER_SIZE 256 256
593 BIND BUFFER reference_framebuffer AS color LOCATION 0
595 CLEAR_COLOR reference_pipeline 0 0 0 255
597 CLEAR reference_pipeline
598 RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
601 SHADER vertex variant_vertex_shader PASSTHROUGH
603 # variant_fragment_shader is derived from the following GLSL:
605 # precision highp float;
607 # precision highp int;
609 # layout(location = 0) out vec4 _GLF_color;
619 # void makeTreeNode(inout BST tree, int data)
622 # tree.leftIndex = - 1;
623 # tree.rightIndex = - 1;
625 # void insert(int treeIndex, int data)
628 # while(baseIndex <= treeIndex)
630 # if(data <= tree[baseIndex].data)
632 # if(tree[baseIndex].leftIndex == - 1)
634 # tree[baseIndex].leftIndex = treeIndex;
635 # makeTreeNode(tree[treeIndex], data);
640 # baseIndex = tree[baseIndex].leftIndex;
646 # if(tree[baseIndex].rightIndex == - 1)
648 # tree[baseIndex].rightIndex = treeIndex;
649 # makeTreeNode(tree[treeIndex], data);
654 # baseIndex = tree[baseIndex].rightIndex;
660 # int search(int target)
664 # while(index != - 1)
666 # currentNode = tree[index];
667 # if(currentNode.data == target)
671 # index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex;
678 # makeTreeNode(tree[0], 9);
680 # insert(treeIndex, 5);
682 # insert(treeIndex, 12);
684 # insert(treeIndex, 15);
686 # insert(treeIndex, 7);
688 # insert(treeIndex, 8);
690 # insert(treeIndex, 2);
692 # insert(treeIndex, 6);
694 # insert(treeIndex, 17);
696 # insert(treeIndex, 13);
698 # for(int i = 0; i < 20; i ++)
700 # int result = search(i);
713 # // Always false: gl_Frag_Coord.x < 0.0
714 # // Thus, the end result is the same as in the reference shader.
715 # if((result == i) || (gl_FragCoord.x < 0.0))
730 # _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
734 # _GLF_color = vec4(0.0, 0.0, 1.0, 1.0);
737 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
740 ; Generator: Khronos Glslang Reference Front End; 10
744 %1 = OpExtInstImport "GLSL.std.450"
745 OpMemoryModel Logical GLSL450
746 OpEntryPoint Fragment %4 "main" %238 %266
747 OpExecutionMode %4 OriginUpperLeft
751 OpMemberName %7 0 "data"
752 OpMemberName %7 1 "leftIndex"
753 OpMemberName %7 2 "rightIndex"
754 OpName %13 "makeTreeNode(struct-BST-i1-i1-i11;i1;"
757 OpName %18 "insert(i1;i1;"
758 OpName %16 "treeIndex"
760 OpName %22 "search(i1;"
762 OpName %32 "baseIndex"
769 OpName %113 "currentNode"
770 OpName %140 "treeIndex"
795 OpName %238 "gl_FragCoord"
796 OpName %266 "_GLF_color"
797 OpDecorate %238 BuiltIn FragCoord
798 OpDecorate %266 Location 0
800 %3 = OpTypeFunction %2
802 %7 = OpTypeStruct %6 %6 %6
803 %8 = OpTypePointer Function %7
804 %9 = OpTypePointer Function %6
805 %10 = OpTypeFunction %2 %8 %9
806 %15 = OpTypeFunction %2 %9 %9
807 %20 = OpTypeFunction %6 %9
808 %24 = OpConstant %6 0
809 %27 = OpConstant %6 1
810 %28 = OpConstant %6 -1
811 %30 = OpConstant %6 2
814 %44 = OpConstant %43 10
815 %45 = OpTypeArray %7 %44
816 %46 = OpTypePointer Private %45
817 %47 = OpVariable %46 Private
818 %49 = OpTypePointer Private %6
819 %66 = OpTypePointer Private %7
820 %141 = OpConstant %6 9
821 %151 = OpConstant %6 5
822 %158 = OpConstant %6 12
823 %165 = OpConstant %6 15
824 %172 = OpConstant %6 7
825 %179 = OpConstant %6 8
826 %192 = OpConstant %6 6
827 %199 = OpConstant %6 17
828 %206 = OpConstant %6 13
829 %219 = OpConstant %6 20
830 %235 = OpTypeFloat 32
831 %236 = OpTypeVector %235 4
832 %237 = OpTypePointer Input %236
833 %238 = OpVariable %237 Input
834 %239 = OpConstant %43 0
835 %240 = OpTypePointer Input %235
836 %243 = OpConstant %235 0
837 %265 = OpTypePointer Output %236
838 %266 = OpVariable %265 Output
839 %267 = OpConstant %235 1
840 %268 = OpConstantComposite %236 %267 %243 %243 %267
841 %270 = OpConstantComposite %236 %243 %243 %267 %267
842 %4 = OpFunction %2 None %3
844 %140 = OpVariable %9 Function
845 %142 = OpVariable %8 Function
846 %145 = OpVariable %9 Function
847 %152 = OpVariable %9 Function
848 %154 = OpVariable %9 Function
849 %159 = OpVariable %9 Function
850 %161 = OpVariable %9 Function
851 %166 = OpVariable %9 Function
852 %168 = OpVariable %9 Function
853 %173 = OpVariable %9 Function
854 %175 = OpVariable %9 Function
855 %180 = OpVariable %9 Function
856 %182 = OpVariable %9 Function
857 %186 = OpVariable %9 Function
858 %188 = OpVariable %9 Function
859 %193 = OpVariable %9 Function
860 %195 = OpVariable %9 Function
861 %200 = OpVariable %9 Function
862 %202 = OpVariable %9 Function
863 %207 = OpVariable %9 Function
864 %209 = OpVariable %9 Function
865 %211 = OpVariable %9 Function
866 %212 = OpVariable %9 Function
867 %221 = OpVariable %9 Function
868 %222 = OpVariable %9 Function
870 %143 = OpAccessChain %66 %47 %24
871 %144 = OpLoad %7 %143
874 %146 = OpFunctionCall %2 %13 %142 %145
875 %147 = OpLoad %7 %142
876 %148 = OpAccessChain %66 %47 %24
878 %149 = OpLoad %6 %140
879 %150 = OpIAdd %6 %149 %27
881 %153 = OpLoad %6 %140
884 %155 = OpFunctionCall %2 %18 %152 %154
885 %156 = OpLoad %6 %140
886 %157 = OpIAdd %6 %156 %27
888 %160 = OpLoad %6 %140
891 %162 = OpFunctionCall %2 %18 %159 %161
892 %163 = OpLoad %6 %140
893 %164 = OpIAdd %6 %163 %27
895 %167 = OpLoad %6 %140
898 %169 = OpFunctionCall %2 %18 %166 %168
899 %170 = OpLoad %6 %140
900 %171 = OpIAdd %6 %170 %27
902 %174 = OpLoad %6 %140
905 %176 = OpFunctionCall %2 %18 %173 %175
906 %177 = OpLoad %6 %140
907 %178 = OpIAdd %6 %177 %27
909 %181 = OpLoad %6 %140
912 %183 = OpFunctionCall %2 %18 %180 %182
913 %184 = OpLoad %6 %140
914 %185 = OpIAdd %6 %184 %27
916 %187 = OpLoad %6 %140
919 %189 = OpFunctionCall %2 %18 %186 %188
920 %190 = OpLoad %6 %140
921 %191 = OpIAdd %6 %190 %27
923 %194 = OpLoad %6 %140
926 %196 = OpFunctionCall %2 %18 %193 %195
927 %197 = OpLoad %6 %140
928 %198 = OpIAdd %6 %197 %27
930 %201 = OpLoad %6 %140
933 %203 = OpFunctionCall %2 %18 %200 %202
934 %204 = OpLoad %6 %140
935 %205 = OpIAdd %6 %204 %27
937 %208 = OpLoad %6 %140
940 %210 = OpFunctionCall %2 %18 %207 %209
945 OpLoopMerge %215 %216 None
948 %218 = OpLoad %6 %212
949 %220 = OpSLessThan %40 %218 %219
950 OpBranchConditional %220 %214 %215
952 %223 = OpLoad %6 %212
954 %224 = OpFunctionCall %6 %22 %222
956 %225 = OpLoad %6 %212
957 OpSelectionMerge %228 None
958 OpSwitch %225 %227 9 %226 5 %226 12 %226 15 %226 7 %226 8 %226 2 %226 6 %226 17 %226 13 %226
960 %251 = OpLoad %6 %221
961 %252 = OpIEqual %40 %251 %28
962 OpSelectionMerge %254 None
963 OpBranchConditional %252 %253 %254
965 %255 = OpLoad %6 %211
966 %256 = OpIAdd %6 %255 %27
972 %229 = OpLoad %6 %221
973 %230 = OpLoad %6 %212
974 %231 = OpIEqual %40 %229 %230
975 %232 = OpLogicalNot %40 %231
976 OpSelectionMerge %234 None
977 OpBranchConditional %232 %233 %234
979 %241 = OpAccessChain %240 %238 %239
980 %242 = OpLoad %235 %241
981 %244 = OpFOrdLessThan %40 %242 %243
984 %245 = OpPhi %40 %231 %226 %244 %233
985 OpSelectionMerge %247 None
986 OpBranchConditional %245 %246 %247
988 %248 = OpLoad %6 %211
989 %249 = OpIAdd %6 %248 %27
997 %259 = OpLoad %6 %212
998 %260 = OpIAdd %6 %259 %27
1002 %261 = OpLoad %6 %211
1003 %262 = OpIEqual %40 %261 %219
1004 OpSelectionMerge %264 None
1005 OpBranchConditional %262 %263 %269
1015 %13 = OpFunction %2 None %10
1016 %11 = OpFunctionParameter %8
1017 %12 = OpFunctionParameter %9
1020 %26 = OpAccessChain %9 %11 %24
1022 %29 = OpAccessChain %9 %11 %27
1024 %31 = OpAccessChain %9 %11 %30
1028 %18 = OpFunction %2 None %15
1029 %16 = OpFunctionParameter %9
1030 %17 = OpFunctionParameter %9
1032 %32 = OpVariable %9 Function
1033 %65 = OpVariable %8 Function
1034 %69 = OpVariable %9 Function
1035 %91 = OpVariable %8 Function
1036 %94 = OpVariable %9 Function
1040 OpLoopMerge %35 %36 None
1045 %41 = OpSLessThanEqual %40 %38 %39
1046 OpBranchConditional %41 %34 %35
1050 %50 = OpAccessChain %49 %47 %48 %24
1052 %52 = OpSLessThanEqual %40 %42 %51
1053 OpSelectionMerge %54 None
1054 OpBranchConditional %52 %53 %80
1057 %56 = OpAccessChain %49 %47 %55 %27
1059 %58 = OpIEqual %40 %57 %28
1060 OpSelectionMerge %60 None
1061 OpBranchConditional %58 %59 %75
1065 %63 = OpAccessChain %49 %47 %61 %27
1068 %67 = OpAccessChain %66 %47 %64
1073 %71 = OpFunctionCall %2 %13 %65 %69
1075 %73 = OpAccessChain %66 %47 %64
1080 %77 = OpAccessChain %49 %47 %76 %27
1088 %82 = OpAccessChain %49 %47 %81 %30
1090 %84 = OpIEqual %40 %83 %28
1091 OpSelectionMerge %86 None
1092 OpBranchConditional %84 %85 %100
1096 %89 = OpAccessChain %49 %47 %87 %30
1099 %92 = OpAccessChain %66 %47 %90
1104 %96 = OpFunctionCall %2 %13 %91 %94
1106 %98 = OpAccessChain %66 %47 %90
1110 %101 = OpLoad %6 %32
1111 %102 = OpAccessChain %49 %47 %101 %30
1112 %103 = OpLoad %6 %102
1124 %22 = OpFunction %6 None %20
1125 %21 = OpFunctionParameter %9
1127 %105 = OpVariable %9 Function
1128 %113 = OpVariable %8 Function
1129 %129 = OpVariable %9 Function
1133 OpLoopMerge %108 %109 None
1136 %111 = OpLoad %6 %105
1137 %112 = OpINotEqual %40 %111 %28
1138 OpBranchConditional %112 %107 %108
1140 %114 = OpLoad %6 %105
1141 %115 = OpAccessChain %66 %47 %114
1142 %116 = OpLoad %7 %115
1144 %117 = OpAccessChain %9 %113 %24
1145 %118 = OpLoad %6 %117
1146 %119 = OpLoad %6 %21
1147 %120 = OpIEqual %40 %118 %119
1148 OpSelectionMerge %122 None
1149 OpBranchConditional %120 %121 %122
1151 %123 = OpLoad %6 %21
1154 %125 = OpLoad %6 %21
1155 %126 = OpAccessChain %9 %113 %24
1156 %127 = OpLoad %6 %126
1157 %128 = OpSGreaterThan %40 %125 %127
1158 OpSelectionMerge %131 None
1159 OpBranchConditional %128 %130 %134
1161 %132 = OpAccessChain %9 %113 %30
1162 %133 = OpLoad %6 %132
1166 %135 = OpAccessChain %9 %113 %27
1167 %136 = OpLoad %6 %135
1171 %137 = OpLoad %6 %129
1182 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
1184 PIPELINE graphics variant_pipeline
1185 ATTACH variant_vertex_shader
1186 ATTACH variant_fragment_shader
1187 FRAMEBUFFER_SIZE 256 256
1188 BIND BUFFER variant_framebuffer AS color LOCATION 0
1190 CLEAR_COLOR variant_pipeline 0 0 0 255
1192 CLEAR variant_pipeline
1193 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
1195 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005