1e5c31af7Sopenharmony_ci#!amber
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci# Copyright 2020 Google LLC
4e5c31af7Sopenharmony_ci#
5e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
6e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
7e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
10e5c31af7Sopenharmony_ci#
11e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
12e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
13e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
15e5c31af7Sopenharmony_ci# limitations under the License.
16e5c31af7Sopenharmony_ci
17e5c31af7Sopenharmony_ci
18e5c31af7Sopenharmony_ci# A test for a bug found by GraphicsFuzz.
19e5c31af7Sopenharmony_ci
20e5c31af7Sopenharmony_ci# Short description: A fragment shader with push constant and nested min max
21e5c31af7Sopenharmony_ci
22e5c31af7Sopenharmony_ci# The test passes because both shaders render the same image.
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ciSHADER vertex reference_vertex_shader PASSTHROUGH
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci# reference_fragment_shader is derived from the following GLSL:
27e5c31af7Sopenharmony_ci# #version 320 es
28e5c31af7Sopenharmony_ci# precision highp float;
29e5c31af7Sopenharmony_ci#
30e5c31af7Sopenharmony_ci# precision highp int;
31e5c31af7Sopenharmony_ci#
32e5c31af7Sopenharmony_ci# layout(location = 0) out vec4 _GLF_color;
33e5c31af7Sopenharmony_ci#
34e5c31af7Sopenharmony_ci# layout(set = 0, binding = 0) uniform buf0 {
35e5c31af7Sopenharmony_ci#  vec2 resolution;
36e5c31af7Sopenharmony_ci# };
37e5c31af7Sopenharmony_ci# const vec4 pal[16] = vec4[16](vec4(0.0, 0.0, 0.0, 1.0), vec4(0.5, 0.0, 0.0, 1.0), vec4(0.0, 0.5, 0.0, 1.0), vec4(0.5, 0.5, 0.0, 1.0), vec4(0.0, 0.0, 0.5, 1.0), vec4(0.5, 0.0, 0.5, 1.0), vec4(0.0, 0.5, 0.5, 1.0), vec4(0.5, 0.5, 0.5, 1.0), vec4(0.0, 0.0, 0.0, 1.0), vec4(1.0, 0.0, 0.0, 1.0), vec4(0.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0), vec4(0.0, 0.0, 1.0, 1.0), vec4(1.0, 0.0, 1.0, 1.0), vec4(0.0, 1.0, 1.0, 1.0), vec4(1.0, 1.0, 1.0, 1.0));
38e5c31af7Sopenharmony_ci#
39e5c31af7Sopenharmony_ci# int collatz(int v)
40e5c31af7Sopenharmony_ci# {
41e5c31af7Sopenharmony_ci#  int count = 0;
42e5c31af7Sopenharmony_ci#  while(v > 1)
43e5c31af7Sopenharmony_ci#   {
44e5c31af7Sopenharmony_ci#    if((v & 1) == 1)
45e5c31af7Sopenharmony_ci#     {
46e5c31af7Sopenharmony_ci#      v = 3 * v + 1;
47e5c31af7Sopenharmony_ci#     }
48e5c31af7Sopenharmony_ci#    else
49e5c31af7Sopenharmony_ci#     {
50e5c31af7Sopenharmony_ci#      v /= 2;
51e5c31af7Sopenharmony_ci#     }
52e5c31af7Sopenharmony_ci#    count ++;
53e5c31af7Sopenharmony_ci#   }
54e5c31af7Sopenharmony_ci#  return count;
55e5c31af7Sopenharmony_ci# }
56e5c31af7Sopenharmony_ci# void main()
57e5c31af7Sopenharmony_ci# {
58e5c31af7Sopenharmony_ci#  vec2 lin = gl_FragCoord.xy / resolution;
59e5c31af7Sopenharmony_ci#  lin = floor(lin * 8.0);
60e5c31af7Sopenharmony_ci#  int v = int(lin.x) * 8 + int(lin.y);
61e5c31af7Sopenharmony_ci#  _GLF_color = pal[collatz(v) % 16];
62e5c31af7Sopenharmony_ci# }
63e5c31af7Sopenharmony_ciSHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
64e5c31af7Sopenharmony_ci; SPIR-V
65e5c31af7Sopenharmony_ci; Version: 1.0
66e5c31af7Sopenharmony_ci; Generator: Khronos Glslang Reference Front End; 10
67e5c31af7Sopenharmony_ci; Bound: 108
68e5c31af7Sopenharmony_ci; Schema: 0
69e5c31af7Sopenharmony_ci               OpCapability Shader
70e5c31af7Sopenharmony_ci          %1 = OpExtInstImport "GLSL.std.450"
71e5c31af7Sopenharmony_ci               OpMemoryModel Logical GLSL450
72e5c31af7Sopenharmony_ci               OpEntryPoint Fragment %4 "main" %47 %76
73e5c31af7Sopenharmony_ci               OpExecutionMode %4 OriginUpperLeft
74e5c31af7Sopenharmony_ci               OpSource ESSL 320
75e5c31af7Sopenharmony_ci               OpName %4 "main"
76e5c31af7Sopenharmony_ci               OpName %10 "collatz(i1;"
77e5c31af7Sopenharmony_ci               OpName %9 "v"
78e5c31af7Sopenharmony_ci               OpName %12 "count"
79e5c31af7Sopenharmony_ci               OpName %44 "lin"
80e5c31af7Sopenharmony_ci               OpName %47 "gl_FragCoord"
81e5c31af7Sopenharmony_ci               OpName %50 "buf0"
82e5c31af7Sopenharmony_ci               OpMemberName %50 0 "resolution"
83e5c31af7Sopenharmony_ci               OpName %52 ""
84e5c31af7Sopenharmony_ci               OpName %61 "v"
85e5c31af7Sopenharmony_ci               OpName %76 "_GLF_color"
86e5c31af7Sopenharmony_ci               OpName %98 "param"
87e5c31af7Sopenharmony_ci               OpName %104 "indexable"
88e5c31af7Sopenharmony_ci               OpDecorate %47 BuiltIn FragCoord
89e5c31af7Sopenharmony_ci               OpMemberDecorate %50 0 Offset 0
90e5c31af7Sopenharmony_ci               OpDecorate %50 Block
91e5c31af7Sopenharmony_ci               OpDecorate %52 DescriptorSet 0
92e5c31af7Sopenharmony_ci               OpDecorate %52 Binding 0
93e5c31af7Sopenharmony_ci               OpDecorate %76 Location 0
94e5c31af7Sopenharmony_ci          %2 = OpTypeVoid
95e5c31af7Sopenharmony_ci          %3 = OpTypeFunction %2
96e5c31af7Sopenharmony_ci          %6 = OpTypeInt 32 1
97e5c31af7Sopenharmony_ci          %7 = OpTypePointer Function %6
98e5c31af7Sopenharmony_ci          %8 = OpTypeFunction %6 %7
99e5c31af7Sopenharmony_ci         %13 = OpConstant %6 0
100e5c31af7Sopenharmony_ci         %20 = OpConstant %6 1
101e5c31af7Sopenharmony_ci         %21 = OpTypeBool
102e5c31af7Sopenharmony_ci         %28 = OpConstant %6 3
103e5c31af7Sopenharmony_ci         %33 = OpConstant %6 2
104e5c31af7Sopenharmony_ci         %41 = OpTypeFloat 32
105e5c31af7Sopenharmony_ci         %42 = OpTypeVector %41 2
106e5c31af7Sopenharmony_ci         %43 = OpTypePointer Function %42
107e5c31af7Sopenharmony_ci         %45 = OpTypeVector %41 4
108e5c31af7Sopenharmony_ci         %46 = OpTypePointer Input %45
109e5c31af7Sopenharmony_ci         %47 = OpVariable %46 Input
110e5c31af7Sopenharmony_ci         %50 = OpTypeStruct %42
111e5c31af7Sopenharmony_ci         %51 = OpTypePointer Uniform %50
112e5c31af7Sopenharmony_ci         %52 = OpVariable %51 Uniform
113e5c31af7Sopenharmony_ci         %53 = OpTypePointer Uniform %42
114e5c31af7Sopenharmony_ci         %58 = OpConstant %41 8
115e5c31af7Sopenharmony_ci         %62 = OpTypeInt 32 0
116e5c31af7Sopenharmony_ci         %63 = OpConstant %62 0
117e5c31af7Sopenharmony_ci         %64 = OpTypePointer Function %41
118e5c31af7Sopenharmony_ci         %68 = OpConstant %6 8
119e5c31af7Sopenharmony_ci         %70 = OpConstant %62 1
120e5c31af7Sopenharmony_ci         %75 = OpTypePointer Output %45
121e5c31af7Sopenharmony_ci         %76 = OpVariable %75 Output
122e5c31af7Sopenharmony_ci         %77 = OpConstant %62 16
123e5c31af7Sopenharmony_ci         %78 = OpTypeArray %45 %77
124e5c31af7Sopenharmony_ci         %79 = OpConstant %41 0
125e5c31af7Sopenharmony_ci         %80 = OpConstant %41 1
126e5c31af7Sopenharmony_ci         %81 = OpConstantComposite %45 %79 %79 %79 %80
127e5c31af7Sopenharmony_ci         %82 = OpConstant %41 0.5
128e5c31af7Sopenharmony_ci         %83 = OpConstantComposite %45 %82 %79 %79 %80
129e5c31af7Sopenharmony_ci         %84 = OpConstantComposite %45 %79 %82 %79 %80
130e5c31af7Sopenharmony_ci         %85 = OpConstantComposite %45 %82 %82 %79 %80
131e5c31af7Sopenharmony_ci         %86 = OpConstantComposite %45 %79 %79 %82 %80
132e5c31af7Sopenharmony_ci         %87 = OpConstantComposite %45 %82 %79 %82 %80
133e5c31af7Sopenharmony_ci         %88 = OpConstantComposite %45 %79 %82 %82 %80
134e5c31af7Sopenharmony_ci         %89 = OpConstantComposite %45 %82 %82 %82 %80
135e5c31af7Sopenharmony_ci         %90 = OpConstantComposite %45 %80 %79 %79 %80
136e5c31af7Sopenharmony_ci         %91 = OpConstantComposite %45 %79 %80 %79 %80
137e5c31af7Sopenharmony_ci         %92 = OpConstantComposite %45 %80 %80 %79 %80
138e5c31af7Sopenharmony_ci         %93 = OpConstantComposite %45 %79 %79 %80 %80
139e5c31af7Sopenharmony_ci         %94 = OpConstantComposite %45 %80 %79 %80 %80
140e5c31af7Sopenharmony_ci         %95 = OpConstantComposite %45 %79 %80 %80 %80
141e5c31af7Sopenharmony_ci         %96 = OpConstantComposite %45 %80 %80 %80 %80
142e5c31af7Sopenharmony_ci         %97 = OpConstantComposite %78 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96
143e5c31af7Sopenharmony_ci        %101 = OpConstant %6 16
144e5c31af7Sopenharmony_ci        %103 = OpTypePointer Function %78
145e5c31af7Sopenharmony_ci        %105 = OpTypePointer Function %45
146e5c31af7Sopenharmony_ci          %4 = OpFunction %2 None %3
147e5c31af7Sopenharmony_ci          %5 = OpLabel
148e5c31af7Sopenharmony_ci         %44 = OpVariable %43 Function
149e5c31af7Sopenharmony_ci         %61 = OpVariable %7 Function
150e5c31af7Sopenharmony_ci         %98 = OpVariable %7 Function
151e5c31af7Sopenharmony_ci        %104 = OpVariable %103 Function
152e5c31af7Sopenharmony_ci         %48 = OpLoad %45 %47
153e5c31af7Sopenharmony_ci         %49 = OpVectorShuffle %42 %48 %48 0 1
154e5c31af7Sopenharmony_ci         %54 = OpAccessChain %53 %52 %13
155e5c31af7Sopenharmony_ci         %55 = OpLoad %42 %54
156e5c31af7Sopenharmony_ci         %56 = OpFDiv %42 %49 %55
157e5c31af7Sopenharmony_ci               OpStore %44 %56
158e5c31af7Sopenharmony_ci         %57 = OpLoad %42 %44
159e5c31af7Sopenharmony_ci         %59 = OpVectorTimesScalar %42 %57 %58
160e5c31af7Sopenharmony_ci         %60 = OpExtInst %42 %1 Floor %59
161e5c31af7Sopenharmony_ci               OpStore %44 %60
162e5c31af7Sopenharmony_ci         %65 = OpAccessChain %64 %44 %63
163e5c31af7Sopenharmony_ci         %66 = OpLoad %41 %65
164e5c31af7Sopenharmony_ci         %67 = OpConvertFToS %6 %66
165e5c31af7Sopenharmony_ci         %69 = OpIMul %6 %67 %68
166e5c31af7Sopenharmony_ci         %71 = OpAccessChain %64 %44 %70
167e5c31af7Sopenharmony_ci         %72 = OpLoad %41 %71
168e5c31af7Sopenharmony_ci         %73 = OpConvertFToS %6 %72
169e5c31af7Sopenharmony_ci         %74 = OpIAdd %6 %69 %73
170e5c31af7Sopenharmony_ci               OpStore %61 %74
171e5c31af7Sopenharmony_ci         %99 = OpLoad %6 %61
172e5c31af7Sopenharmony_ci               OpStore %98 %99
173e5c31af7Sopenharmony_ci        %100 = OpFunctionCall %6 %10 %98
174e5c31af7Sopenharmony_ci        %102 = OpSMod %6 %100 %101
175e5c31af7Sopenharmony_ci               OpStore %104 %97
176e5c31af7Sopenharmony_ci        %106 = OpAccessChain %105 %104 %102
177e5c31af7Sopenharmony_ci        %107 = OpLoad %45 %106
178e5c31af7Sopenharmony_ci               OpStore %76 %107
179e5c31af7Sopenharmony_ci               OpReturn
180e5c31af7Sopenharmony_ci               OpFunctionEnd
181e5c31af7Sopenharmony_ci         %10 = OpFunction %6 None %8
182e5c31af7Sopenharmony_ci          %9 = OpFunctionParameter %7
183e5c31af7Sopenharmony_ci         %11 = OpLabel
184e5c31af7Sopenharmony_ci         %12 = OpVariable %7 Function
185e5c31af7Sopenharmony_ci               OpStore %12 %13
186e5c31af7Sopenharmony_ci               OpBranch %14
187e5c31af7Sopenharmony_ci         %14 = OpLabel
188e5c31af7Sopenharmony_ci               OpLoopMerge %16 %17 None
189e5c31af7Sopenharmony_ci               OpBranch %18
190e5c31af7Sopenharmony_ci         %18 = OpLabel
191e5c31af7Sopenharmony_ci         %19 = OpLoad %6 %9
192e5c31af7Sopenharmony_ci         %22 = OpSGreaterThan %21 %19 %20
193e5c31af7Sopenharmony_ci               OpBranchConditional %22 %15 %16
194e5c31af7Sopenharmony_ci         %15 = OpLabel
195e5c31af7Sopenharmony_ci         %23 = OpLoad %6 %9
196e5c31af7Sopenharmony_ci         %24 = OpBitwiseAnd %6 %23 %20
197e5c31af7Sopenharmony_ci         %25 = OpIEqual %21 %24 %20
198e5c31af7Sopenharmony_ci               OpSelectionMerge %27 None
199e5c31af7Sopenharmony_ci               OpBranchConditional %25 %26 %32
200e5c31af7Sopenharmony_ci         %26 = OpLabel
201e5c31af7Sopenharmony_ci         %29 = OpLoad %6 %9
202e5c31af7Sopenharmony_ci         %30 = OpIMul %6 %28 %29
203e5c31af7Sopenharmony_ci         %31 = OpIAdd %6 %30 %20
204e5c31af7Sopenharmony_ci               OpStore %9 %31
205e5c31af7Sopenharmony_ci               OpBranch %27
206e5c31af7Sopenharmony_ci         %32 = OpLabel
207e5c31af7Sopenharmony_ci         %34 = OpLoad %6 %9
208e5c31af7Sopenharmony_ci         %35 = OpSDiv %6 %34 %33
209e5c31af7Sopenharmony_ci               OpStore %9 %35
210e5c31af7Sopenharmony_ci               OpBranch %27
211e5c31af7Sopenharmony_ci         %27 = OpLabel
212e5c31af7Sopenharmony_ci         %36 = OpLoad %6 %12
213e5c31af7Sopenharmony_ci         %37 = OpIAdd %6 %36 %20
214e5c31af7Sopenharmony_ci               OpStore %12 %37
215e5c31af7Sopenharmony_ci               OpBranch %17
216e5c31af7Sopenharmony_ci         %17 = OpLabel
217e5c31af7Sopenharmony_ci               OpBranch %14
218e5c31af7Sopenharmony_ci         %16 = OpLabel
219e5c31af7Sopenharmony_ci         %38 = OpLoad %6 %12
220e5c31af7Sopenharmony_ci               OpReturnValue %38
221e5c31af7Sopenharmony_ci               OpFunctionEnd
222e5c31af7Sopenharmony_ciEND
223e5c31af7Sopenharmony_ci
224e5c31af7Sopenharmony_ci# uniforms for reference
225e5c31af7Sopenharmony_ci
226e5c31af7Sopenharmony_ci# resolution
227e5c31af7Sopenharmony_ciBUFFER reference_resolution DATA_TYPE vec2<float> DATA
228e5c31af7Sopenharmony_ci 256.0 256.0
229e5c31af7Sopenharmony_ciEND
230e5c31af7Sopenharmony_ci
231e5c31af7Sopenharmony_ciBUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
232e5c31af7Sopenharmony_ci
233e5c31af7Sopenharmony_ciPIPELINE graphics reference_pipeline
234e5c31af7Sopenharmony_ci  ATTACH reference_vertex_shader
235e5c31af7Sopenharmony_ci  ATTACH reference_fragment_shader
236e5c31af7Sopenharmony_ci  FRAMEBUFFER_SIZE 256 256
237e5c31af7Sopenharmony_ci  BIND BUFFER reference_framebuffer AS color LOCATION 0
238e5c31af7Sopenharmony_ci  BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
239e5c31af7Sopenharmony_ciEND
240e5c31af7Sopenharmony_ciCLEAR_COLOR reference_pipeline 0 0 0 255
241e5c31af7Sopenharmony_ci
242e5c31af7Sopenharmony_ciCLEAR reference_pipeline
243e5c31af7Sopenharmony_ciRUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
244e5c31af7Sopenharmony_ci
245e5c31af7Sopenharmony_ci
246e5c31af7Sopenharmony_ciSHADER vertex variant_vertex_shader PASSTHROUGH
247e5c31af7Sopenharmony_ci
248e5c31af7Sopenharmony_ci# variant_fragment_shader is derived from the following GLSL:
249e5c31af7Sopenharmony_ci# #version 320 es
250e5c31af7Sopenharmony_ci# precision highp float;
251e5c31af7Sopenharmony_ci#
252e5c31af7Sopenharmony_ci# precision highp int;
253e5c31af7Sopenharmony_ci#
254e5c31af7Sopenharmony_ci# layout(location = 0) out vec4 _GLF_color;
255e5c31af7Sopenharmony_ci#
256e5c31af7Sopenharmony_ci# layout(push_constant) uniform buf_push {
257e5c31af7Sopenharmony_ci#  vec2 resolution;
258e5c31af7Sopenharmony_ci# };
259e5c31af7Sopenharmony_ci# const vec4 pal[16] = vec4[16](vec4(0.0, 0.0, 0.0, 1.0), vec4(0.5, 0.0, 0.0, 1.0), vec4(0.0, 0.5, 0.0, 1.0), vec4(0.5, 0.5, 0.0, 1.0), vec4(0.0, 0.0, 0.5, 1.0), vec4(0.5, 0.0, 0.5, 1.0), vec4(0.0, 0.5, 0.5, 1.0), vec4(0.5, 0.5, 0.5, 1.0), vec4(0.0, 0.0, 0.0, 1.0), vec4(1.0, 0.0, 0.0, 1.0), vec4(0.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0), vec4(0.0, 0.0, 1.0, 1.0), vec4(1.0, 0.0, 1.0, 1.0), vec4(0.0, 1.0, 1.0, 1.0), vec4(1.0, 1.0, 1.0, 1.0));
260e5c31af7Sopenharmony_ci#
261e5c31af7Sopenharmony_ci# int collatz(int v)
262e5c31af7Sopenharmony_ci# {
263e5c31af7Sopenharmony_ci#  int count = 0;
264e5c31af7Sopenharmony_ci#  while(v > 1)
265e5c31af7Sopenharmony_ci#   {
266e5c31af7Sopenharmony_ci#    if((v & 1) == 1)
267e5c31af7Sopenharmony_ci#     {
268e5c31af7Sopenharmony_ci#      v = 3 * v + 1;
269e5c31af7Sopenharmony_ci#     }
270e5c31af7Sopenharmony_ci#    else
271e5c31af7Sopenharmony_ci#     {
272e5c31af7Sopenharmony_ci#      v /= 2;
273e5c31af7Sopenharmony_ci#     }
274e5c31af7Sopenharmony_ci#    count ++;
275e5c31af7Sopenharmony_ci#   }
276e5c31af7Sopenharmony_ci#  return count;
277e5c31af7Sopenharmony_ci# }
278e5c31af7Sopenharmony_ci# void main()
279e5c31af7Sopenharmony_ci# {
280e5c31af7Sopenharmony_ci#     // vec2 max_c == (gl_FragCoord.xy / resolution).
281e5c31af7Sopenharmony_ci#     vec2 max_c = max(   // This should return the same result.
282e5c31af7Sopenharmony_ci#                         gl_FragCoord.xy / resolution,
283e5c31af7Sopenharmony_ci#                         gl_FragCoord.xy / (vec2(resolution.x, resolution.y))
284e5c31af7Sopenharmony_ci#                     );
285e5c31af7Sopenharmony_ci#     // vec2 max_a == (gl_FragCoord.xy / resolution)
286e5c31af7Sopenharmony_ci#     vec2 max_a = max(
287e5c31af7Sopenharmony_ci#                         // gl_FragCoord.y < 0 is always false.
288e5c31af7Sopenharmony_ci#                         // mix operation returns vec2(0.0 , 0.0).
289e5c31af7Sopenharmony_ci#                         // cosine of 0 is 1.
290e5c31af7Sopenharmony_ci#                         // anything divided by 1 stays the same.
291e5c31af7Sopenharmony_ci#                         max_c / cos(mix(vec2(1.0, 0.0), vec2(0.0, 218.851), bvec2(true, (gl_FragCoord.y < 0.0)))),
292e5c31af7Sopenharmony_ci#                         gl_FragCoord.xy / resolution
293e5c31af7Sopenharmony_ci#                     );
294e5c31af7Sopenharmony_ci#     // vec2 max_d == vec2(1.0, 1.0)
295e5c31af7Sopenharmony_ci#     vec2 max_d = max(
296e5c31af7Sopenharmony_ci#                         // Same cosine fucntion as in max_a.
297e5c31af7Sopenharmony_ci#                         1.0 / cos(mix(vec2(1.0, 0.0), vec2(0.0, 218.851), bvec2(true, (gl_FragCoord.y < 0.0)))),
298e5c31af7Sopenharmony_ci#                         vec2(1.0, 1.0)
299e5c31af7Sopenharmony_ci#                     );
300e5c31af7Sopenharmony_ci#     // vec2 max_b == vec2(1.0, 1.0)
301e5c31af7Sopenharmony_ci#     vec2 max_b = max(
302e5c31af7Sopenharmony_ci#                         vec2(1.0, 1.0),
303e5c31af7Sopenharmony_ci#                         max_d // max_d == vec2(1.0, 1.0)
304e5c31af7Sopenharmony_ci#                     );
305e5c31af7Sopenharmony_ci#     // vec2 lin == (gl_FragCoord.xy / resolution)
306e5c31af7Sopenharmony_ci#     vec2 lin = min(
307e5c31af7Sopenharmony_ci#                     max_a,  // max_a == gl_FragCoord.xy / resolution
308e5c31af7Sopenharmony_ci#                     max_b   // max_b == vec2(1.0, 1.0)
309e5c31af7Sopenharmony_ci#                     );
310e5c31af7Sopenharmony_ci#  lin = floor(lin * 8.0);
311e5c31af7Sopenharmony_ci#  int v = int(lin.x) * 8 + int(lin.y);
312e5c31af7Sopenharmony_ci#  _GLF_color = pal[collatz(v) % 16];
313e5c31af7Sopenharmony_ci# }
314e5c31af7Sopenharmony_ciSHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
315e5c31af7Sopenharmony_ci; SPIR-V
316e5c31af7Sopenharmony_ci; Version: 1.0
317e5c31af7Sopenharmony_ci; Generator: Khronos Glslang Reference Front End; 10
318e5c31af7Sopenharmony_ci; Bound: 157
319e5c31af7Sopenharmony_ci; Schema: 0
320e5c31af7Sopenharmony_ci               OpCapability Shader
321e5c31af7Sopenharmony_ci          %1 = OpExtInstImport "GLSL.std.450"
322e5c31af7Sopenharmony_ci               OpMemoryModel Logical GLSL450
323e5c31af7Sopenharmony_ci               OpEntryPoint Fragment %4 "main" %47 %127
324e5c31af7Sopenharmony_ci               OpExecutionMode %4 OriginUpperLeft
325e5c31af7Sopenharmony_ci               OpSource ESSL 320
326e5c31af7Sopenharmony_ci               OpName %4 "main"
327e5c31af7Sopenharmony_ci               OpName %10 "collatz(i1;"
328e5c31af7Sopenharmony_ci               OpName %9 "v"
329e5c31af7Sopenharmony_ci               OpName %12 "count"
330e5c31af7Sopenharmony_ci               OpName %44 "max_c"
331e5c31af7Sopenharmony_ci               OpName %47 "gl_FragCoord"
332e5c31af7Sopenharmony_ci               OpName %50 "buf_push"
333e5c31af7Sopenharmony_ci               OpMemberName %50 0 "resolution"
334e5c31af7Sopenharmony_ci               OpName %52 ""
335e5c31af7Sopenharmony_ci               OpName %70 "max_a"
336e5c31af7Sopenharmony_ci               OpName %93 "max_d"
337e5c31af7Sopenharmony_ci               OpName %104 "max_b"
338e5c31af7Sopenharmony_ci               OpName %107 "lin"
339e5c31af7Sopenharmony_ci               OpName %115 "v"
340e5c31af7Sopenharmony_ci               OpName %127 "_GLF_color"
341e5c31af7Sopenharmony_ci               OpName %147 "param"
342e5c31af7Sopenharmony_ci               OpName %153 "indexable"
343e5c31af7Sopenharmony_ci               OpDecorate %47 BuiltIn FragCoord
344e5c31af7Sopenharmony_ci               OpMemberDecorate %50 0 Offset 0
345e5c31af7Sopenharmony_ci               OpDecorate %50 Block
346e5c31af7Sopenharmony_ci               OpDecorate %127 Location 0
347e5c31af7Sopenharmony_ci          %2 = OpTypeVoid
348e5c31af7Sopenharmony_ci          %3 = OpTypeFunction %2
349e5c31af7Sopenharmony_ci          %6 = OpTypeInt 32 1
350e5c31af7Sopenharmony_ci          %7 = OpTypePointer Function %6
351e5c31af7Sopenharmony_ci          %8 = OpTypeFunction %6 %7
352e5c31af7Sopenharmony_ci         %13 = OpConstant %6 0
353e5c31af7Sopenharmony_ci         %20 = OpConstant %6 1
354e5c31af7Sopenharmony_ci         %21 = OpTypeBool
355e5c31af7Sopenharmony_ci         %28 = OpConstant %6 3
356e5c31af7Sopenharmony_ci         %33 = OpConstant %6 2
357e5c31af7Sopenharmony_ci         %41 = OpTypeFloat 32
358e5c31af7Sopenharmony_ci         %42 = OpTypeVector %41 2
359e5c31af7Sopenharmony_ci         %43 = OpTypePointer Function %42
360e5c31af7Sopenharmony_ci         %45 = OpTypeVector %41 4
361e5c31af7Sopenharmony_ci         %46 = OpTypePointer Input %45
362e5c31af7Sopenharmony_ci         %47 = OpVariable %46 Input
363e5c31af7Sopenharmony_ci         %50 = OpTypeStruct %42
364e5c31af7Sopenharmony_ci         %51 = OpTypePointer PushConstant %50
365e5c31af7Sopenharmony_ci         %52 = OpVariable %51 PushConstant
366e5c31af7Sopenharmony_ci         %53 = OpTypePointer PushConstant %42
367e5c31af7Sopenharmony_ci         %59 = OpTypeInt 32 0
368e5c31af7Sopenharmony_ci         %60 = OpConstant %59 0
369e5c31af7Sopenharmony_ci         %61 = OpTypePointer PushConstant %41
370e5c31af7Sopenharmony_ci         %64 = OpConstant %59 1
371e5c31af7Sopenharmony_ci         %72 = OpConstant %41 1
372e5c31af7Sopenharmony_ci         %73 = OpConstant %41 0
373e5c31af7Sopenharmony_ci         %74 = OpConstantComposite %42 %72 %73
374e5c31af7Sopenharmony_ci         %75 = OpConstant %41 218.850998
375e5c31af7Sopenharmony_ci         %76 = OpConstantComposite %42 %73 %75
376e5c31af7Sopenharmony_ci         %77 = OpConstantTrue %21
377e5c31af7Sopenharmony_ci         %78 = OpTypePointer Input %41
378e5c31af7Sopenharmony_ci         %82 = OpTypeVector %21 2
379e5c31af7Sopenharmony_ci        %102 = OpConstantComposite %42 %72 %72
380e5c31af7Sopenharmony_ci        %112 = OpConstant %41 8
381e5c31af7Sopenharmony_ci        %116 = OpTypePointer Function %41
382e5c31af7Sopenharmony_ci        %120 = OpConstant %6 8
383e5c31af7Sopenharmony_ci        %126 = OpTypePointer Output %45
384e5c31af7Sopenharmony_ci        %127 = OpVariable %126 Output
385e5c31af7Sopenharmony_ci        %128 = OpConstant %59 16
386e5c31af7Sopenharmony_ci        %129 = OpTypeArray %45 %128
387e5c31af7Sopenharmony_ci        %130 = OpConstantComposite %45 %73 %73 %73 %72
388e5c31af7Sopenharmony_ci        %131 = OpConstant %41 0.5
389e5c31af7Sopenharmony_ci        %132 = OpConstantComposite %45 %131 %73 %73 %72
390e5c31af7Sopenharmony_ci        %133 = OpConstantComposite %45 %73 %131 %73 %72
391e5c31af7Sopenharmony_ci        %134 = OpConstantComposite %45 %131 %131 %73 %72
392e5c31af7Sopenharmony_ci        %135 = OpConstantComposite %45 %73 %73 %131 %72
393e5c31af7Sopenharmony_ci        %136 = OpConstantComposite %45 %131 %73 %131 %72
394e5c31af7Sopenharmony_ci        %137 = OpConstantComposite %45 %73 %131 %131 %72
395e5c31af7Sopenharmony_ci        %138 = OpConstantComposite %45 %131 %131 %131 %72
396e5c31af7Sopenharmony_ci        %139 = OpConstantComposite %45 %72 %73 %73 %72
397e5c31af7Sopenharmony_ci        %140 = OpConstantComposite %45 %73 %72 %73 %72
398e5c31af7Sopenharmony_ci        %141 = OpConstantComposite %45 %72 %72 %73 %72
399e5c31af7Sopenharmony_ci        %142 = OpConstantComposite %45 %73 %73 %72 %72
400e5c31af7Sopenharmony_ci        %143 = OpConstantComposite %45 %72 %73 %72 %72
401e5c31af7Sopenharmony_ci        %144 = OpConstantComposite %45 %73 %72 %72 %72
402e5c31af7Sopenharmony_ci        %145 = OpConstantComposite %45 %72 %72 %72 %72
403e5c31af7Sopenharmony_ci        %146 = OpConstantComposite %129 %130 %132 %133 %134 %135 %136 %137 %138 %130 %139 %140 %141 %142 %143 %144 %145
404e5c31af7Sopenharmony_ci        %150 = OpConstant %6 16
405e5c31af7Sopenharmony_ci        %152 = OpTypePointer Function %129
406e5c31af7Sopenharmony_ci        %154 = OpTypePointer Function %45
407e5c31af7Sopenharmony_ci          %4 = OpFunction %2 None %3
408e5c31af7Sopenharmony_ci          %5 = OpLabel
409e5c31af7Sopenharmony_ci         %44 = OpVariable %43 Function
410e5c31af7Sopenharmony_ci         %70 = OpVariable %43 Function
411e5c31af7Sopenharmony_ci         %93 = OpVariable %43 Function
412e5c31af7Sopenharmony_ci        %104 = OpVariable %43 Function
413e5c31af7Sopenharmony_ci        %107 = OpVariable %43 Function
414e5c31af7Sopenharmony_ci        %115 = OpVariable %7 Function
415e5c31af7Sopenharmony_ci        %147 = OpVariable %7 Function
416e5c31af7Sopenharmony_ci        %153 = OpVariable %152 Function
417e5c31af7Sopenharmony_ci         %48 = OpLoad %45 %47
418e5c31af7Sopenharmony_ci         %49 = OpVectorShuffle %42 %48 %48 0 1
419e5c31af7Sopenharmony_ci         %54 = OpAccessChain %53 %52 %13
420e5c31af7Sopenharmony_ci         %55 = OpLoad %42 %54
421e5c31af7Sopenharmony_ci         %56 = OpFDiv %42 %49 %55
422e5c31af7Sopenharmony_ci         %57 = OpLoad %45 %47
423e5c31af7Sopenharmony_ci         %58 = OpVectorShuffle %42 %57 %57 0 1
424e5c31af7Sopenharmony_ci         %62 = OpAccessChain %61 %52 %13 %60
425e5c31af7Sopenharmony_ci         %63 = OpLoad %41 %62
426e5c31af7Sopenharmony_ci         %65 = OpAccessChain %61 %52 %13 %64
427e5c31af7Sopenharmony_ci         %66 = OpLoad %41 %65
428e5c31af7Sopenharmony_ci         %67 = OpCompositeConstruct %42 %63 %66
429e5c31af7Sopenharmony_ci         %68 = OpFDiv %42 %58 %67
430e5c31af7Sopenharmony_ci         %69 = OpExtInst %42 %1 FMax %56 %68
431e5c31af7Sopenharmony_ci               OpStore %44 %69
432e5c31af7Sopenharmony_ci         %71 = OpLoad %42 %44
433e5c31af7Sopenharmony_ci         %79 = OpAccessChain %78 %47 %64
434e5c31af7Sopenharmony_ci         %80 = OpLoad %41 %79
435e5c31af7Sopenharmony_ci         %81 = OpFOrdLessThan %21 %80 %73
436e5c31af7Sopenharmony_ci         %83 = OpCompositeConstruct %82 %77 %81
437e5c31af7Sopenharmony_ci         %84 = OpSelect %42 %83 %76 %74
438e5c31af7Sopenharmony_ci         %85 = OpExtInst %42 %1 Cos %84
439e5c31af7Sopenharmony_ci         %86 = OpFDiv %42 %71 %85
440e5c31af7Sopenharmony_ci         %87 = OpLoad %45 %47
441e5c31af7Sopenharmony_ci         %88 = OpVectorShuffle %42 %87 %87 0 1
442e5c31af7Sopenharmony_ci         %89 = OpAccessChain %53 %52 %13
443e5c31af7Sopenharmony_ci         %90 = OpLoad %42 %89
444e5c31af7Sopenharmony_ci         %91 = OpFDiv %42 %88 %90
445e5c31af7Sopenharmony_ci         %92 = OpExtInst %42 %1 FMax %86 %91
446e5c31af7Sopenharmony_ci               OpStore %70 %92
447e5c31af7Sopenharmony_ci         %94 = OpAccessChain %78 %47 %64
448e5c31af7Sopenharmony_ci         %95 = OpLoad %41 %94
449e5c31af7Sopenharmony_ci         %96 = OpFOrdLessThan %21 %95 %73
450e5c31af7Sopenharmony_ci         %97 = OpCompositeConstruct %82 %77 %96
451e5c31af7Sopenharmony_ci         %98 = OpSelect %42 %97 %76 %74
452e5c31af7Sopenharmony_ci         %99 = OpExtInst %42 %1 Cos %98
453e5c31af7Sopenharmony_ci        %100 = OpCompositeConstruct %42 %72 %72
454e5c31af7Sopenharmony_ci        %101 = OpFDiv %42 %100 %99
455e5c31af7Sopenharmony_ci        %103 = OpExtInst %42 %1 FMax %101 %102
456e5c31af7Sopenharmony_ci               OpStore %93 %103
457e5c31af7Sopenharmony_ci        %105 = OpLoad %42 %93
458e5c31af7Sopenharmony_ci        %106 = OpExtInst %42 %1 FMax %102 %105
459e5c31af7Sopenharmony_ci               OpStore %104 %106
460e5c31af7Sopenharmony_ci        %108 = OpLoad %42 %70
461e5c31af7Sopenharmony_ci        %109 = OpLoad %42 %104
462e5c31af7Sopenharmony_ci        %110 = OpExtInst %42 %1 FMin %108 %109
463e5c31af7Sopenharmony_ci               OpStore %107 %110
464e5c31af7Sopenharmony_ci        %111 = OpLoad %42 %107
465e5c31af7Sopenharmony_ci        %113 = OpVectorTimesScalar %42 %111 %112
466e5c31af7Sopenharmony_ci        %114 = OpExtInst %42 %1 Floor %113
467e5c31af7Sopenharmony_ci               OpStore %107 %114
468e5c31af7Sopenharmony_ci        %117 = OpAccessChain %116 %107 %60
469e5c31af7Sopenharmony_ci        %118 = OpLoad %41 %117
470e5c31af7Sopenharmony_ci        %119 = OpConvertFToS %6 %118
471e5c31af7Sopenharmony_ci        %121 = OpIMul %6 %119 %120
472e5c31af7Sopenharmony_ci        %122 = OpAccessChain %116 %107 %64
473e5c31af7Sopenharmony_ci        %123 = OpLoad %41 %122
474e5c31af7Sopenharmony_ci        %124 = OpConvertFToS %6 %123
475e5c31af7Sopenharmony_ci        %125 = OpIAdd %6 %121 %124
476e5c31af7Sopenharmony_ci               OpStore %115 %125
477e5c31af7Sopenharmony_ci        %148 = OpLoad %6 %115
478e5c31af7Sopenharmony_ci               OpStore %147 %148
479e5c31af7Sopenharmony_ci        %149 = OpFunctionCall %6 %10 %147
480e5c31af7Sopenharmony_ci        %151 = OpSMod %6 %149 %150
481e5c31af7Sopenharmony_ci               OpStore %153 %146
482e5c31af7Sopenharmony_ci        %155 = OpAccessChain %154 %153 %151
483e5c31af7Sopenharmony_ci        %156 = OpLoad %45 %155
484e5c31af7Sopenharmony_ci               OpStore %127 %156
485e5c31af7Sopenharmony_ci               OpReturn
486e5c31af7Sopenharmony_ci               OpFunctionEnd
487e5c31af7Sopenharmony_ci         %10 = OpFunction %6 None %8
488e5c31af7Sopenharmony_ci          %9 = OpFunctionParameter %7
489e5c31af7Sopenharmony_ci         %11 = OpLabel
490e5c31af7Sopenharmony_ci         %12 = OpVariable %7 Function
491e5c31af7Sopenharmony_ci               OpStore %12 %13
492e5c31af7Sopenharmony_ci               OpBranch %14
493e5c31af7Sopenharmony_ci         %14 = OpLabel
494e5c31af7Sopenharmony_ci               OpLoopMerge %16 %17 None
495e5c31af7Sopenharmony_ci               OpBranch %18
496e5c31af7Sopenharmony_ci         %18 = OpLabel
497e5c31af7Sopenharmony_ci         %19 = OpLoad %6 %9
498e5c31af7Sopenharmony_ci         %22 = OpSGreaterThan %21 %19 %20
499e5c31af7Sopenharmony_ci               OpBranchConditional %22 %15 %16
500e5c31af7Sopenharmony_ci         %15 = OpLabel
501e5c31af7Sopenharmony_ci         %23 = OpLoad %6 %9
502e5c31af7Sopenharmony_ci         %24 = OpBitwiseAnd %6 %23 %20
503e5c31af7Sopenharmony_ci         %25 = OpIEqual %21 %24 %20
504e5c31af7Sopenharmony_ci               OpSelectionMerge %27 None
505e5c31af7Sopenharmony_ci               OpBranchConditional %25 %26 %32
506e5c31af7Sopenharmony_ci         %26 = OpLabel
507e5c31af7Sopenharmony_ci         %29 = OpLoad %6 %9
508e5c31af7Sopenharmony_ci         %30 = OpIMul %6 %28 %29
509e5c31af7Sopenharmony_ci         %31 = OpIAdd %6 %30 %20
510e5c31af7Sopenharmony_ci               OpStore %9 %31
511e5c31af7Sopenharmony_ci               OpBranch %27
512e5c31af7Sopenharmony_ci         %32 = OpLabel
513e5c31af7Sopenharmony_ci         %34 = OpLoad %6 %9
514e5c31af7Sopenharmony_ci         %35 = OpSDiv %6 %34 %33
515e5c31af7Sopenharmony_ci               OpStore %9 %35
516e5c31af7Sopenharmony_ci               OpBranch %27
517e5c31af7Sopenharmony_ci         %27 = OpLabel
518e5c31af7Sopenharmony_ci         %36 = OpLoad %6 %12
519e5c31af7Sopenharmony_ci         %37 = OpIAdd %6 %36 %20
520e5c31af7Sopenharmony_ci               OpStore %12 %37
521e5c31af7Sopenharmony_ci               OpBranch %17
522e5c31af7Sopenharmony_ci         %17 = OpLabel
523e5c31af7Sopenharmony_ci               OpBranch %14
524e5c31af7Sopenharmony_ci         %16 = OpLabel
525e5c31af7Sopenharmony_ci         %38 = OpLoad %6 %12
526e5c31af7Sopenharmony_ci               OpReturnValue %38
527e5c31af7Sopenharmony_ci               OpFunctionEnd
528e5c31af7Sopenharmony_ciEND
529e5c31af7Sopenharmony_ci
530e5c31af7Sopenharmony_ci# uniforms for variant
531e5c31af7Sopenharmony_ci
532e5c31af7Sopenharmony_ci# resolution
533e5c31af7Sopenharmony_ciBUFFER variant_resolution DATA_TYPE vec2<float> DATA
534e5c31af7Sopenharmony_ci 256.0 256.0
535e5c31af7Sopenharmony_ciEND
536e5c31af7Sopenharmony_ci
537e5c31af7Sopenharmony_ciBUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
538e5c31af7Sopenharmony_ci
539e5c31af7Sopenharmony_ciPIPELINE graphics variant_pipeline
540e5c31af7Sopenharmony_ci  ATTACH variant_vertex_shader
541e5c31af7Sopenharmony_ci  ATTACH variant_fragment_shader
542e5c31af7Sopenharmony_ci  FRAMEBUFFER_SIZE 256 256
543e5c31af7Sopenharmony_ci  BIND BUFFER variant_framebuffer AS color LOCATION 0
544e5c31af7Sopenharmony_ci  BIND BUFFER variant_resolution AS push_constant
545e5c31af7Sopenharmony_ciEND
546e5c31af7Sopenharmony_ciCLEAR_COLOR variant_pipeline 0 0 0 255
547e5c31af7Sopenharmony_ci
548e5c31af7Sopenharmony_ciCLEAR variant_pipeline
549e5c31af7Sopenharmony_ciRUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
550e5c31af7Sopenharmony_ci
551e5c31af7Sopenharmony_ciEXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
552