1 /*
2 * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "EGL/egl.h"
17 #include "EGL/eglext.h"
18 #include "drawing_bitmap.h"
19 #include "drawing_error_code.h"
20 #include "drawing_gpu_context.h"
21 #include "drawing_surface.h"
22 #include "gtest/gtest.h"
23
24 using namespace testing;
25 using namespace testing::ext;
26
27 namespace OHOS {
28 namespace Rosen {
29 namespace Drawing {
30 class DrawingNativeSurFaceTest : public testing::Test {
31 public:
32 static void SetUpTestCase();
33 static void TearDownTestCase();
34 void SetUp() override;
35 void TearDown() override;
36
37 protected:
38 EGLDisplay eglDisplay_ = EGL_NO_DISPLAY;
39 EGLConfig eglConfig_ = EGL_NO_CONFIG_KHR;
40 EGLContext eglContext_ = EGL_NO_CONTEXT;
41 EGLSurface eglSurface_ = EGL_NO_SURFACE;
42 OH_Drawing_GpuContext *gpuContext_ = nullptr;
43 OH_Drawing_Surface *surface_ = nullptr;
44 OH_Drawing_Canvas *canvas_ = nullptr;
45 };
46
SetUpTestCase()47 void DrawingNativeSurFaceTest::SetUpTestCase() {}
TearDownTestCase()48 void DrawingNativeSurFaceTest::TearDownTestCase() {}
SetUp()49 void DrawingNativeSurFaceTest::SetUp()
50 {
51 eglDisplay_ = eglGetDisplay(EGL_DEFAULT_DISPLAY);
52 EXPECT_NE(eglDisplay_, EGL_NO_DISPLAY);
53
54 EGLint eglMajVers;
55 EGLint eglMinVers;
56 EGLBoolean ret = eglInitialize(eglDisplay_, &eglMajVers, &eglMinVers);
57 EXPECT_EQ(ret, EGL_TRUE);
58
59 EGLint count;
60 EGLint configAttribs[] = {
61 EGL_SURFACE_TYPE,
62 EGL_WINDOW_BIT,
63 EGL_RED_SIZE,
64 8,
65 EGL_GREEN_SIZE,
66 8,
67 EGL_BLUE_SIZE,
68 8,
69 EGL_ALPHA_SIZE,
70 8,
71 EGL_RENDERABLE_TYPE,
72 EGL_OPENGL_ES3_BIT,
73 EGL_NONE,
74 };
75 ret = eglChooseConfig(eglDisplay_, configAttribs, &eglConfig_, 1, &count);
76 EXPECT_EQ(ret, EGL_TRUE);
77 EXPECT_GE(count, 1);
78
79 const EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
80 eglContext_ = eglCreateContext(eglDisplay_, eglConfig_, EGL_NO_CONTEXT, contextAttribs);
81 EXPECT_NE(eglContext_, EGL_NO_CONTEXT);
82
83 EGLint attribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE};
84 eglSurface_ = eglCreatePbufferSurface(eglDisplay_, eglConfig_, attribs);
85 EXPECT_NE(eglSurface_, EGL_NO_SURFACE);
86
87 ret = eglMakeCurrent(eglDisplay_, eglSurface_, eglSurface_, eglContext_);
88 EXPECT_EQ(ret, EGL_TRUE);
89 }
90
TearDown()91 void DrawingNativeSurFaceTest::TearDown()
92 {
93 EGLBoolean ret = eglDestroySurface(eglDisplay_, eglSurface_);
94 EXPECT_EQ(ret, EGL_TRUE);
95
96 ret = eglDestroyContext(eglDisplay_, eglContext_);
97 EXPECT_EQ(ret, EGL_TRUE);
98
99 ret = eglTerminate(eglDisplay_);
100 EXPECT_EQ(ret, EGL_TRUE);
101
102 eglSurface_ = EGL_NO_SURFACE;
103 eglContext_ = EGL_NO_CONTEXT;
104 eglDisplay_ = EGL_NO_DISPLAY;
105 }
106
107 /*
108 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_SURFACE_0100
109 * @tc.name: testSurfaceCreateFromGpuContextNormal
110 * @tc.desc: test for testSurfaceCreateFromGpuContextNormal.
111 * @tc.size : SmallTest
112 * @tc.type : Function
113 * @tc.level : Level 0
114 */
HWTEST_F(DrawingNativeSurFaceTest, testSurfaceCreateFromGpuContextNormal, TestSize.Level0)115 HWTEST_F(DrawingNativeSurFaceTest, testSurfaceCreateFromGpuContextNormal, TestSize.Level0) {
116 OH_Drawing_GpuContextOptions options{true};
117 gpuContext_ = OH_Drawing_GpuContextCreateFromGL(options);
118 EXPECT_NE(gpuContext_, nullptr);
119 const int32_t width = 500;
120 const int32_t height = 500;
121 OH_Drawing_Image_Info imageInfo = {width, height, COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
122 surface_ = OH_Drawing_SurfaceCreateFromGpuContext(gpuContext_, true, imageInfo);
123 EXPECT_NE(surface_, nullptr);
124 OH_Drawing_SurfaceDestroy(surface_);
125 surface_ = OH_Drawing_SurfaceCreateFromGpuContext(gpuContext_, false, imageInfo);
126 EXPECT_NE(surface_, nullptr);
127 OH_Drawing_SurfaceDestroy(surface_);
128 }
129
130 /*
131 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_SURFACE_0101
132 * @tc.name: testSurfaceCreateFromGpuContextNull
133 * @tc.desc: test for testSurfaceCreateFromGpuContextNull.
134 * @tc.size : SmallTest
135 * @tc.type : Function
136 * @tc.level : Level 3
137 */
HWTEST_F(DrawingNativeSurFaceTest, testSurfaceCreateFromGpuContextNull, TestSize.Level3)138 HWTEST_F(DrawingNativeSurFaceTest, testSurfaceCreateFromGpuContextNull, TestSize.Level3) {
139 OH_Drawing_GpuContextOptions options{true};
140 gpuContext_ = OH_Drawing_GpuContextCreateFromGL(options);
141 EXPECT_NE(gpuContext_, nullptr);
142 const int32_t width = 500;
143 const int32_t height = 500;
144 OH_Drawing_Image_Info imageInfo = {width, height, COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
145 // OH_Drawing_GpuContext is NULL, check error code using OH_Drawing_ErrorCodeGet
146 surface_ = OH_Drawing_SurfaceCreateFromGpuContext(nullptr, true, imageInfo);
147 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
148 // Exceptional parameter passing for OH_Drawing_Image_Info
149 OH_Drawing_Image_Info imageInfo2 = {0, 0, COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
150 surface_ = OH_Drawing_SurfaceCreateFromGpuContext(gpuContext_, false, imageInfo2);
151 EXPECT_EQ(surface_, nullptr);
152 OH_Drawing_SurfaceDestroy(surface_);
153 }
154
155 /*
156 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_SURFACE_0102
157 * @tc.name: testSurfaceCreateFromGpuContextBoundary
158 * @tc.desc: test for testSurfaceCreateFromGpuContextBoundary.
159 * @tc.size : SmallTest
160 * @tc.type : Function
161 * @tc.level : Level 0
162 */
HWTEST_F(DrawingNativeSurFaceTest, testSurfaceCreateFromGpuContextBoundary, TestSize.Level0)163 HWTEST_F(DrawingNativeSurFaceTest, testSurfaceCreateFromGpuContextBoundary, TestSize.Level0) {
164 OH_Drawing_GpuContextOptions options{true};
165 gpuContext_ = OH_Drawing_GpuContextCreateFromGL(options);
166 EXPECT_NE(gpuContext_, nullptr);
167 const int32_t width = 4096;
168 const int32_t height = 2160;
169 OH_Drawing_Image_Info imageInfo = {width, height, COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
170 surface_ = OH_Drawing_SurfaceCreateFromGpuContext(gpuContext_, true, imageInfo);
171 EXPECT_NE(surface_, nullptr);
172 OH_Drawing_SurfaceDestroy(surface_);
173 surface_ = OH_Drawing_SurfaceCreateFromGpuContext(gpuContext_, false, imageInfo);
174 EXPECT_NE(surface_, nullptr);
175 OH_Drawing_SurfaceDestroy(surface_);
176 }
177
178 /*
179 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_SURFACE_0200
180 * @tc.name: testSurfaceDestroyNormal
181 * @tc.desc: test for testSurfaceDestroyNormal.
182 * @tc.size : SmallTest
183 * @tc.type : Function
184 * @tc.level : Level 0
185 */
HWTEST_F(DrawingNativeSurFaceTest, testSurfaceDestroyNormal, TestSize.Level0)186 HWTEST_F(DrawingNativeSurFaceTest, testSurfaceDestroyNormal, TestSize.Level0) {
187 OH_Drawing_GpuContextOptions options{true};
188 gpuContext_ = OH_Drawing_GpuContextCreateFromGL(options);
189 EXPECT_NE(gpuContext_, nullptr);
190 const int32_t width = 500;
191 const int32_t height = 500;
192 OH_Drawing_Image_Info imageInfo = {width, height, COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
193 surface_ = OH_Drawing_SurfaceCreateFromGpuContext(gpuContext_, true, imageInfo);
194 EXPECT_NE(surface_, nullptr);
195 OH_Drawing_SurfaceDestroy(surface_);
196 }
197
198 /*
199 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_SURFACE_0201
200 * @tc.name: testSurfaceDestroyNull
201 * @tc.desc: test for testSurfaceDestroyNull.
202 * @tc.size : SmallTest
203 * @tc.type : Function
204 * @tc.level : Level 3
205 */
HWTEST_F(DrawingNativeSurFaceTest, testSurfaceDestroyNull, TestSize.Level3)206 HWTEST_F(DrawingNativeSurFaceTest, testSurfaceDestroyNull, TestSize.Level3) {
207 // free
208 OH_Drawing_SurfaceDestroy(nullptr);
209 }
210
211 /*
212 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_SURFACE_0300
213 * @tc.name: testSurfaceGetCanvasNormal
214 * @tc.desc: test for testSurfaceGetCanvasNormal.
215 * @tc.size : SmallTest
216 * @tc.type : Function
217 * @tc.level : Level 0
218 */
HWTEST_F(DrawingNativeSurFaceTest, testSurfaceGetCanvasNormal, TestSize.Level0)219 HWTEST_F(DrawingNativeSurFaceTest, testSurfaceGetCanvasNormal, TestSize.Level0) {
220 OH_Drawing_GpuContextOptions options{true};
221 gpuContext_ = OH_Drawing_GpuContextCreateFromGL(options);
222 EXPECT_NE(gpuContext_, nullptr);
223 // 1. OH_Drawing_SurfaceCreateFromGpuContext
224 const int32_t width = 500;
225 const int32_t height = 500;
226 OH_Drawing_Image_Info imageInfo = {width, height, COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
227 surface_ = OH_Drawing_SurfaceCreateFromGpuContext(gpuContext_, true, imageInfo);
228 EXPECT_NE(surface_, nullptr);
229 // 2. OH_Drawing_SurfaceGetCanvas, get the canvas object from the surface object, a pointer to the surface object,
230 // and call the drawing interface
231 canvas_ = OH_Drawing_SurfaceGetCanvas(surface_);
232 EXPECT_NE(canvas_, nullptr);
233 // 3. Free memory
234 OH_Drawing_SurfaceDestroy(surface_);
235 }
236
237 /*
238 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_SURFACE_0301
239 * @tc.name: testSurfaceGetCanvasNull
240 * @tc.desc: test for testSurfaceGetCanvasNull.
241 * @tc.size : SmallTest
242 * @tc.type : Function
243 * @tc.level : Level 3
244 */
HWTEST_F(DrawingNativeSurFaceTest, testSurfaceGetCanvasNull, TestSize.Level3)245 HWTEST_F(DrawingNativeSurFaceTest, testSurfaceGetCanvasNull, TestSize.Level3) {
246 OH_Drawing_GpuContextOptions options{true};
247 gpuContext_ = OH_Drawing_GpuContextCreateFromGL(options);
248 EXPECT_NE(gpuContext_, nullptr);
249 // 1. OH_Drawing_SurfaceCreateFromGpuContext
250 const int32_t width = 500;
251 const int32_t height = 500;
252 OH_Drawing_Image_Info imageInfo = {width, height, COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
253 surface_ = OH_Drawing_SurfaceCreateFromGpuContext(gpuContext_, true, imageInfo);
254 EXPECT_NE(surface_, nullptr);
255 // 2. OH_Drawing_SurfaceGetCanvas with null parameter, check error code using OH_Drawing_ErrorCodeGet
256 canvas_ = OH_Drawing_SurfaceGetCanvas(nullptr);
257 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
258 OH_Drawing_SurfaceDestroy(surface_);
259 }
260
261 /*
262 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_SURFACE_0302
263 * @tc.name: testSurfaceGetCanvasBoundary
264 * @tc.desc: test for testSurfaceGetCanvasBoundary.
265 * @tc.size : SmallTest
266 * @tc.type : Function
267 * @tc.level : Level 0
268 */
HWTEST_F(DrawingNativeSurFaceTest, testSurfaceGetCanvasBoundary, TestSize.Level0)269 HWTEST_F(DrawingNativeSurFaceTest, testSurfaceGetCanvasBoundary, TestSize.Level0) {
270 OH_Drawing_GpuContextOptions options{true};
271 gpuContext_ = OH_Drawing_GpuContextCreateFromGL(options);
272 EXPECT_NE(gpuContext_, nullptr);
273 // 1. OH_Drawing_SurfaceCreateFromGpuContext
274 const int32_t width = 4096;
275 const int32_t height = 2160;
276 OH_Drawing_Image_Info imageInfo = {width, height, COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
277 surface_ = OH_Drawing_SurfaceCreateFromGpuContext(gpuContext_, true, imageInfo);
278 EXPECT_NE(surface_, nullptr);
279 // 2. OH_Drawing_SurfaceGetCanvas, get the canvas object from the surface object, a pointer to the surface object,
280 // and call the drawing interface
281 canvas_ = OH_Drawing_SurfaceGetCanvas(surface_);
282 EXPECT_NE(canvas_, nullptr);
283 // 3. Free memory
284 OH_Drawing_SurfaceDestroy(surface_);
285 }
286 } // namespace Drawing
287 } // namespace Rosen
288 } // namespace OHOS