1e5c31af7Sopenharmony_ci#!amber
2e5c31af7Sopenharmony_ci# Copyright 2021 The Amber Authors.
3e5c31af7Sopenharmony_ci#
4e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
5e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
6e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
7e5c31af7Sopenharmony_ci#
8e5c31af7Sopenharmony_ci#     https://www.apache.org/licenses/LICENSE-2.0
9e5c31af7Sopenharmony_ci#
10e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
11e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
12e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
14e5c31af7Sopenharmony_ci# limitations under the License.
15e5c31af7Sopenharmony_ci
16e5c31af7Sopenharmony_ciDEVICE_FEATURE tessellationShader
17e5c31af7Sopenharmony_ci
18e5c31af7Sopenharmony_ciSHADER vertex vert GLSL
19e5c31af7Sopenharmony_ci#version 450
20e5c31af7Sopenharmony_ci
21e5c31af7Sopenharmony_cilayout (location = 0) in vec3 inPosition;
22e5c31af7Sopenharmony_ci
23e5c31af7Sopenharmony_civoid main(void)
24e5c31af7Sopenharmony_ci{
25e5c31af7Sopenharmony_ci    gl_Position = vec4(inPosition, 1.0);
26e5c31af7Sopenharmony_ci}
27e5c31af7Sopenharmony_ciEND
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_ciSHADER tessellation_control tesc GLSL
30e5c31af7Sopenharmony_ci#version 450
31e5c31af7Sopenharmony_ci
32e5c31af7Sopenharmony_cilayout (vertices = 4) out;
33e5c31af7Sopenharmony_ci
34e5c31af7Sopenharmony_civoid main(void)
35e5c31af7Sopenharmony_ci{
36e5c31af7Sopenharmony_ci    gl_TessLevelOuter[0] = 6.0;
37e5c31af7Sopenharmony_ci    gl_TessLevelOuter[1] = 2.0;
38e5c31af7Sopenharmony_ci
39e5c31af7Sopenharmony_ci    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
40e5c31af7Sopenharmony_ci}
41e5c31af7Sopenharmony_ciEND
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_ciSHADER tessellation_evaluation tese GLSL
44e5c31af7Sopenharmony_ci#version 450
45e5c31af7Sopenharmony_ci
46e5c31af7Sopenharmony_cilayout (isolines, equal_spacing, cw) in;
47e5c31af7Sopenharmony_ci
48e5c31af7Sopenharmony_civoid main(void)
49e5c31af7Sopenharmony_ci{
50e5c31af7Sopenharmony_ci    vec4 p1 = mix(gl_in[0].gl_Position,
51e5c31af7Sopenharmony_ci            gl_in[1].gl_Position,
52e5c31af7Sopenharmony_ci            gl_TessCoord.x);
53e5c31af7Sopenharmony_ci
54e5c31af7Sopenharmony_ci    vec4 p2 = mix(gl_in[2].gl_Position,
55e5c31af7Sopenharmony_ci            gl_in[3].gl_Position,
56e5c31af7Sopenharmony_ci            gl_TessCoord.x);
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ci    gl_Position = mix(p1, p2, gl_TessCoord.y);
59e5c31af7Sopenharmony_ci}
60e5c31af7Sopenharmony_ciEND
61e5c31af7Sopenharmony_ci
62e5c31af7Sopenharmony_ciSHADER fragment frag GLSL
63e5c31af7Sopenharmony_ci#version 450
64e5c31af7Sopenharmony_ci
65e5c31af7Sopenharmony_cilayout (location = 0) out vec4 outColor;
66e5c31af7Sopenharmony_ci
67e5c31af7Sopenharmony_civoid main(void)
68e5c31af7Sopenharmony_ci{
69e5c31af7Sopenharmony_ci    outColor = vec4(1, 0, 0, 1);
70e5c31af7Sopenharmony_ci}
71e5c31af7Sopenharmony_ciEND
72e5c31af7Sopenharmony_ci
73e5c31af7Sopenharmony_ciSHADER compute comp_shader GLSL
74e5c31af7Sopenharmony_ci#version 450
75e5c31af7Sopenharmony_cilayout(local_size_x=10,local_size_y=10) in;
76e5c31af7Sopenharmony_ciuniform layout(set=0, binding=0, rgba8) image2D resultImage;
77e5c31af7Sopenharmony_ci
78e5c31af7Sopenharmony_cilayout(set = 0, binding = 1) buffer block0
79e5c31af7Sopenharmony_ci{
80e5c31af7Sopenharmony_ci    int counter;
81e5c31af7Sopenharmony_ci};
82e5c31af7Sopenharmony_ci
83e5c31af7Sopenharmony_civoid main()
84e5c31af7Sopenharmony_ci{
85e5c31af7Sopenharmony_ci    ivec2 uv = ivec2(gl_GlobalInvocationID.xy);
86e5c31af7Sopenharmony_ci    vec4 color = imageLoad(resultImage, uv);
87e5c31af7Sopenharmony_ci    if(color.r > 0.0) atomicAdd(counter, 1);
88e5c31af7Sopenharmony_ci}
89e5c31af7Sopenharmony_ciEND
90e5c31af7Sopenharmony_ci
91e5c31af7Sopenharmony_ciBUFFER vertexPosition DATA_TYPE vec3<float> DATA
92e5c31af7Sopenharmony_ci-1.0 -1.0  0.0
93e5c31af7Sopenharmony_ci 1.0 -1.0  0.0
94e5c31af7Sopenharmony_ci-1.0  1.0  0.0
95e5c31af7Sopenharmony_ci 1.0  1.0  0.0
96e5c31af7Sopenharmony_ciEND
97e5c31af7Sopenharmony_ci
98e5c31af7Sopenharmony_ciBUFFER counter DATA_TYPE int32 DATA 0 END
99e5c31af7Sopenharmony_ci
100e5c31af7Sopenharmony_ciBUFFER framebuffer FORMAT B8G8R8A8_UNORM
101e5c31af7Sopenharmony_ci
102e5c31af7Sopenharmony_ciPIPELINE graphics pipeline
103e5c31af7Sopenharmony_ci  ATTACH vert
104e5c31af7Sopenharmony_ci  ATTACH tesc
105e5c31af7Sopenharmony_ci  ATTACH tese
106e5c31af7Sopenharmony_ci  ATTACH frag
107e5c31af7Sopenharmony_ci
108e5c31af7Sopenharmony_ci  PATCH_CONTROL_POINTS 4
109e5c31af7Sopenharmony_ci
110e5c31af7Sopenharmony_ci  FRAMEBUFFER_SIZE 100 100
111e5c31af7Sopenharmony_ci  VERTEX_DATA vertexPosition LOCATION 0
112e5c31af7Sopenharmony_ci  BIND BUFFER framebuffer AS color LOCATION 0
113e5c31af7Sopenharmony_ciEND
114e5c31af7Sopenharmony_ci
115e5c31af7Sopenharmony_ciCLEAR_COLOR pipeline 0 0 0 255
116e5c31af7Sopenharmony_ciCLEAR pipeline
117e5c31af7Sopenharmony_ci
118e5c31af7Sopenharmony_ciRUN pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 4
119e5c31af7Sopenharmony_ci
120e5c31af7Sopenharmony_ciPIPELINE compute verify_pipeline
121e5c31af7Sopenharmony_ci  ATTACH comp_shader
122e5c31af7Sopenharmony_ci  BIND BUFFER framebuffer AS storage_image DESCRIPTOR_SET 0 BINDING 0
123e5c31af7Sopenharmony_ci  BIND BUFFER counter AS storage DESCRIPTOR_SET 0 BINDING 1
124e5c31af7Sopenharmony_ci  FRAMEBUFFER_SIZE 100 100
125e5c31af7Sopenharmony_ciEND
126e5c31af7Sopenharmony_ci
127e5c31af7Sopenharmony_ci# Count the number of red pixels as the line position might differ between implementations.
128e5c31af7Sopenharmony_ciRUN verify_pipeline 10 10 1
129e5c31af7Sopenharmony_ci
130e5c31af7Sopenharmony_ciEXPECT counter IDX 0 TOLERANCE 50 EQ 500
131