1 /*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2020-2023. All rights reserved.
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 <dlfcn.h>
17 #include <iostream>
18 #include "util.h"
19
20 using namespace std;
21
22 #if (!defined(SYSTEM_32_BIT))
23 static vector<string> syms = {
24 "eglGetProcAddress",
25 "eglChooseConfig",
26 "eglCopyBuffers",
27 "eglCreateContext",
28 "eglCreatePbufferSurface",
29 "eglDestroySurface",
30 "eglGetConfigs",
31 "eglGetCurrentSurface",
32 "eglGetError",
33 "eglGetProcAddress",
34 "eglMakeCurrent",
35 "eglQueryString",
36 "eglSwapBuffers",
37 "glGetFloatv",
38 "glGetLightfv",
39 "glGetTexEnvfv",
40 "glLightModelf",
41 "glLightModelfv",
42 "glLightf",
43 "glLightfv",
44 "glLineWidth",
45 "glOrthof",
46 "glPointParameterfv",
47 "glPolygonOffset",
48 "glColor4x",
49 "glCompressedTexImage2D",
50 "glEnableClientState",
51 "glFlush",
52 "glFogxv",
53 "glGetLightxv",
54 "glGetTexEnviv",
55 "glShadeModel",
56 "glStencilOp",
57 "glTexEnvi",
58 "glTexEnvx",
59 "glTexImage2D",
60 "glTexParameterx",
61 "glPointSizePointerOES",
62 "glEGLImageTargetTexture2DOES",
63 "glEGLImageTargetRenderbufferStorageOES",
64 "glBlendEquationSeparateOES",
65 "glBlendFuncSeparateOES",
66 "glDrawTexxOES",
67 "glDrawTexivOES",
68 "glDrawTexxvOES",
69 "glDrawTexfvOES",
70 "glClearColorxOES",
71 "glFogxvOES",
72 "glGetClipPlanexOES",
73 "glMaterialxOES",
74 "glMultMatrixxOES",
75 "glNormal3xOES",
76 "glPointParameterxvOES",
77 "glTexEnvxOES",
78 "glTexParameterxOES",
79 "glTranslatexOES",
80 "glGetMaterialxvOES",
81 "glSampleCoveragexOES",
82 "glBindFramebufferOES",
83 "glGenFramebuffersOES",
84 "glFramebufferRenderbufferOES",
85 "glGetFramebufferAttachmentParameterivOES",
86 "glGenerateMipmapOES",
87 "glUnmapBufferOES",
88 "glCurrentPaletteMatrixOES",
89 "glLoadPaletteFromModelViewMatrixOES",
90 "glWeightPointerOES",
91 "glClearDepthfOES",
92 "glClipPlanefOES",
93 "glFrustumfOES",
94 "glGetClipPlanefOES",
95 "glTexGenfOES",
96 "glTexGenfvOES",
97 "glTexGenivOES",
98 "glGetTexGenivOES",
99 "glBindVertexArrayOES",
100 "glGenVertexArraysOES",
101 "glDiscardFramebufferEXT",
102 "glRenderbufferStorageMultisampleEXT",
103 "glGetnUniformfvEXT",
104 "glGetnUniformivEXT",
105 "glTexStorage2DEXT",
106 "glTexStorage3DEXT",
107 "glColorMask",
108 "glCompressedTexImage2D",
109 "glCompressedTexSubImage2D",
110 "glCopyTexImage2D",
111 "glCreateProgram",
112 "glDrawElements",
113 "glGenBuffers",
114 "glGenFramebuffers",
115 "glGenRenderbuffers",
116 "glGenTextures",
117 "glObjectLabelKHR",
118 "glGetObjectLabelKHR",
119 "glGetnUniformivKHR",
120 "glDrawElementsBaseVertexOES",
121 "glDrawElementsInstancedBaseVertexOES",
122 "glPrimitiveBoundingBoxOES",
123 "glMinSampleShadingOES",
124 "glTexImage3DOES",
125 "glTexSubImage3DOES",
126 "glCompressedTexImage3DOES",
127 "glCompressedTexSubImage3DOES",
128 "glTexParameterIivOES",
129 "glGetTexParameterIivOES",
130 "glGetTexParameterIuivOES",
131 "glBindVertexArrayOES",
132 "glEGLImageTargetTexStorageEXT",
133 "glBufferStorageEXT",
134 "glCopyImageSubDataEXT",
135 "glDiscardFramebufferEXT",
136 "glGenQueriesEXT",
137 "glDeleteQueriesEXT",
138 "glQueryCounterEXT",
139 "glGetQueryObjectivEXT",
140 "glGetQueryObjectuivEXT",
141 "glGetQueryObjecti64vEXT",
142 "glGetQueryObjectui64vEXT",
143 "glEnableiEXT",
144 "glDisableiEXT",
145 "glBlendEquationiEXT",
146 "glColorMaskiEXT",
147 "glIsEnablediEXT",
148 "glRenderbufferStorageMultisampleEXT",
149 "glGetGraphicsResetStatusEXT",
150 "glGetnUniformfvEXT",
151 "glGetnUniformivEXT",
152 "glPatchParameteriEXT",
153 "glTexParameterIuivEXT",
154 "glGetSamplerParameterIivEXT",
155 "glTexBufferEXT",
156 "glTexBufferRangeEXT",
157 "glTexStorage2DEXT",
158 "glTexStorage3DEXT",
159 "glFramebufferTextureMultiviewOVR",
160 "glFramebufferTextureMultisampleMultiviewOVR",
161 "glBindBuffer",
162 "glBufferData",
163 "glCheckFramebufferStatus",
164 "glClear",
165 "glClearColor",
166 "glClearDepthf",
167 "glClearStencil",
168 "glCompileShader",
169 "glCompressedTexImage2D",
170 "glCompressedTexSubImage2D",
171 "glCopyTexImage2D",
172 "glCopyTexSubImage2D",
173 "glCreateProgram",
174 "glCreateShader",
175 "glDeleteBuffers",
176 "glDeleteFramebuffers",
177 "glDeleteProgram",
178 "glDeleteShader",
179 "glDeleteTextures",
180 "glDepthFunc",
181 "glDepthRangef",
182 "glDetachShader",
183 "glDisable",
184 "glDrawArrays",
185 "glDrawElements",
186 "glEnable",
187 "glEnableVertexAttribArray",
188 "glFlush",
189 "glFramebufferRenderbuffer",
190 "glFrontFace",
191 "glGenBuffers",
192 "glGenTextures",
193 "glGetActiveUniform",
194 "glGetAttachedShaders",
195 "glGetError",
196 "glGetFramebufferAttachmentParameteriv",
197 "glGetIntegerv",
198 "glGetProgramiv",
199 "glGetRenderbufferParameteriv",
200 "glGetShaderiv",
201 "glGetShaderPrecisionFormat",
202 "glGetShaderSource",
203 "glGetString",
204 "glGetTexParameterfv",
205 "glGetUniformfv",
206 "glGetUniformiv",
207 "glGetUniformLocation",
208 "glGetVertexAttribiv",
209 "glGetVertexAttribPointerv",
210 "glVertexAttribI4iv",
211 "glGetUniformuiv",
212 "glClearBufferfv",
213 "glGetStringi",
214 "glCopyBufferSubData",
215 "glGetUniformIndices",
216 "glGetActiveUniformsiv",
217 "glGetUniformBlockIndex",
218 "glIsSync",
219 "glClientWaitSync",
220 "glWaitSync",
221 "glGetInteger64v",
222 "glGetInteger64i_v",
223 "glGetBufferParameteri64v",
224 "glGetSamplerParameteriv",
225 "glInvalidateSubFramebuffer",
226 "glTexStorage3D",
227 "glDispatchCompute",
228 "glDispatchComputeIndirect",
229 "glDrawElementsIndirect",
230 "glFramebufferParameteri",
231 "glGetProgramInterfaceiv",
232 "glGetProgramResourceIndex",
233 "glGetProgramResourceiv",
234 "glUseProgramStages",
235 "glActiveShaderProgram",
236 "glBindProgramPipeline",
237 "glGetPointerv",
238 "glBlendEquationi",
239 "glBlendFuncSeparatei",
240 "glDrawElementsBaseVertex",
241 "glDrawElementsInstancedBaseVertex",
242 "glPrimitiveBoundingBox",
243 "glGetGraphicsResetStatus",
244 "glGetnUniformiv",
245 "glGetnUniformuiv",
246 "glPatchParameteri",
247 "glTexParameterIuiv",
248 "glGetTexParameterIiv",
249 "glSamplerParameterIiv",
250 "glBlendBarrierKHR",
251 "glDebugMessageControlKHR",
252 "glDebugMessageCallbackKHR",
253 "glGetDebugMessageLogKHR",
254 "glPopDebugGroupKHR",
255 "glGetObjectLabelKHR",
256 "glGetObjectPtrLabelKHR",
257 "glGetPointervKHR",
258 "glGetGraphicsResetStatusKHR",
259 "glReadnPixelsKHR",
260 "glGetnUniformfvKHR",
261 "glCopyImageSubDataOES",
262 "glDisableiOES",
263 "glBlendEquationiOES",
264 "glIsQueryEXT",
265 "glGetQueryivEXT",
266 "glEnableiEXT",
267 "glBlendEquationSeparateiEXT",
268 "glBlendFunciEXT",
269 "glTexStorage2DEXT",
270 "eglChooseConfig",
271 "eglCopyBuffers",
272 "eglCreateContext",
273 "eglCreatePbufferSurface",
274 "eglCreatePixmapSurface",
275 "eglCreateWindowSurface",
276 "eglDestroyContext",
277 "eglDestroySurface",
278 "eglGetConfigAttrib",
279 "eglGetConfigs",
280 "eglGetCurrentDisplay",
281 "eglGetCurrentSurface",
282 "eglGetDisplay",
283 "eglGetError",
284 "eglInitialize",
285 "eglMakeCurrent",
286 "eglQueryContext",
287 "eglQueryString",
288 "eglQuerySurface",
289 "eglSwapBuffers",
290 "eglTerminate",
291 "eglWaitGL",
292 "eglWaitNative",
293 "eglBindTexImage",
294 "eglReleaseTexImage",
295 "eglSurfaceAttrib",
296 "eglSwapInterval",
297 "eglBindAPI",
298 "eglCreatePbufferFromClientBuffer",
299 "eglReleaseThread",
300 "eglGetCurrentContext",
301 "glClearColor",
302 "glClearStencil",
303 "glColorMask",
304 "glCompileShader",
305 "glCompressedTexImage2D",
306 "glCompressedTexSubImage2D",
307 "glDepthFunc",
308 "glDepthRangef",
309 "glDetachShader",
310 "glDisableVertexAttribArray",
311 "glDrawArrays",
312 "glDrawElements",
313 "glEnable",
314 "glEnableVertexAttribArray",
315 "glFinish",
316 "glFlush",
317 "glGetBufferParameteriv",
318 "glGetFramebufferAttachmentParameteriv",
319 "glIsBuffer",
320 "glIsFramebuffer",
321 "glIsRenderbuffer",
322 "glIsShader",
323 "glIsTexture",
324 "glLineWidth",
325 "glLinkProgram",
326 "glPolygonOffset",
327 "glReadPixels",
328 "glReleaseShaderCompiler",
329 "glRenderbufferStorage",
330 "glSampleCoverage",
331 "glScissor",
332 "glShaderSource",
333 "glStencilFunc",
334 "glStencilMask",
335 "glStencilMaskSeparate",
336 "glStencilOp",
337 "glStencilOpSeparate",
338 "glTexImage2D",
339 "glTexParameterf",
340 "glUniform2f",
341 "glUniform2i",
342 "glUniform3f",
343 "glUniform3i",
344 "glUniform4i",
345 "glUniformMatrix2fv",
346 "glUniformMatrix4fv",
347 "glUseProgram",
348 "glValidateProgram",
349 "glVertexAttrib1f",
350 "glVertexAttrib1fv",
351 "glVertexAttrib2f",
352 "glVertexAttrib2fv",
353 "glVertexAttrib3fv",
354 "glVertexAttrib4f",
355 "glVertexAttrib4fv",
356 "glViewport",
357 "glBufferStorageEXT",
358 "glDiscardFramebufferEXT",
359 "glGenQueriesEXT",
360 "glDeleteQueriesEXT",
361 "glIsQueryEXT",
362 "glBeginQueryEXT",
363 "glEndQueryEXT",
364 "glQueryCounterEXT",
365 "glGetQueryivEXT",
366 "glGetQueryObjectivEXT",
367 "glGetQueryObjectuivEXT",
368 "glGetQueryObjecti64vEXT",
369 "glGetQueryObjectui64vEXT",
370 "glEnableiEXT",
371 "glDisableiEXT",
372 "glBlendEquationiEXT",
373 "glBlendEquationSeparateiEXT",
374 "glBlendFunciEXT",
375 "glBlendFuncSeparateiEXT",
376 "glColorMaskiEXT",
377 "glIsEnablediEXT",
378 "glDrawElementsBaseVertexEXT",
379 "glDrawRangeElementsBaseVertexEXT",
380 "glDrawElementsInstancedBaseVertexEXT",
381 "glBufferStorageExternalEXT",
382 "glFramebufferTextureEXT",
383 "glRenderbufferStorageMultisampleEXT",
384 "glPrimitiveBoundingBoxEXT",
385 "glGetSamplerParameterIivEXT",
386 "glGetSamplerParameterIuivEXT",
387 "glTexBufferEXT",
388 "glTexBufferRangeEXT",
389 "glTexStorage2DEXT",
390 "glTexStorage3DEXT",
391 "glDebugMessageControlKHR",
392 "glDebugMessageInsertKHR",
393 "glGetObjectLabelKHR",
394 "glObjectPtrLabelKHR",
395 "glEGLImageTargetTexture2DOES",
396 "glEGLImageTargetRenderbufferStorageOES",
397 "glCopyImageSubDataOES",
398 "glEnableiOES",
399 "glDisableiOES",
400 "glBlendEquationiOES",
401 "glBlendEquationSeparateiOES",
402 "glBlendFunciOES",
403 "glBlendFuncSeparateiOES",
404 "glColorMaskiOES",
405 "glIsEnablediOES",
406 "glDrawElementsBaseVertexOES",
407 "glDrawRangeElementsBaseVertexOES",
408 "glDrawElementsInstancedBaseVertexOES",
409 "glFramebufferTextureOES",
410 "glGetProgramBinaryOES",
411 "glProgramBinaryOES",
412 "glUnmapBufferOES",
413 "glGetBufferPointervOES",
414 "glPrimitiveBoundingBoxOES",
415 "glCopyTexSubImage3DOES",
416 "glCompressedTexSubImage3DOES",
417 "glTexParameterIuivOES",
418 "glGetTexParameterIivOES",
419 "glGetTexParameterIuivOES",
420 "glSamplerParameterIivOES",
421 "glSamplerParameterIuivOES",
422 "glGetSamplerParameterIivOES",
423 "glGetSamplerParameterIuivOES",
424 "glTexBufferOES",
425 "glTexBufferRangeOES",
426 "glTexStorage3DMultisampleOES",
427 "glBindVertexArrayOES",
428 "glDeleteVertexArraysOES",
429 "glGenVertexArraysOES",
430 "glIsVertexArrayOES",
431 "glFramebufferTextureMultiviewOVR",
432 "glDrawRangeElements",
433 "glTexSubImage3D",
434 "glCopyTexSubImage3D",
435 "glCompressedTexSubImage3D",
436 "glGenQueries",
437 "glGetBufferPointerv",
438 "glBlitFramebuffer",
439 "glGenVertexArrays",
440 "glIsVertexArray",
441 "glGetIntegeri_v",
442 "glVertexAttribI4i",
443 "glVertexAttribI4iv",
444 "glClearBufferiv",
445 "glClearBufferfv",
446 "glClearBufferfi",
447 "glGetStringi",
448 "glGetUniformIndices",
449 "glGetActiveUniformsiv",
450 "glWaitSync",
451 "glGetInteger64v",
452 "glDeleteTransformFeedbacks",
453 "glIsTransformFeedback",
454 "glInvalidateSubFramebuffer",
455 "glGetInternalformativ",
456 "glGetFramebufferParameteriv",
457 "glProgramUniform4f",
458 "glProgramUniform2iv",
459 "glProgramUniform4iv",
460 "glProgramUniform2uiv",
461 "glProgramUniform3uiv",
462 "glProgramUniform4uiv",
463 "glProgramUniform2fv",
464 "glProgramUniform4fv",
465 "glProgramUniformMatrix2fv",
466 "glProgramUniformMatrix3fv",
467 "glProgramUniformMatrix2x3fv",
468 "glProgramUniformMatrix3x2fv",
469 "glProgramUniformMatrix2x4fv",
470 "glProgramUniformMatrix4x2fv",
471 "glProgramUniformMatrix3x4fv",
472 "glProgramUniformMatrix4x3fv",
473 "glValidateProgramPipeline",
474 "glGetProgramPipelineInfoLog",
475 "glBindImageTexture",
476 "glVertexAttribBinding",
477 "glBlendBarrier",
478 "glDebugMessageControl",
479 "glDebugMessageInsert",
480 "glDebugMessageCallback",
481 "glGetDebugMessageLog",
482 "glPushDebugGroup",
483 "glPopDebugGroup",
484 "glObjectLabel",
485 "glGetObjectPtrLabel",
486 "glEnablei",
487 "glBlendEquationi",
488 "glBlendFunci",
489 "glGetnUniformuiv",
490 "glPatchParameteri",
491 "glTexParameterIiv",
492 "glGetTexParameterIiv",
493 "glGetTexParameterIuiv",
494 "glSamplerParameterIiv",
495 };
496
DoDlsym(void *handle)497 static void DoDlsym(void *handle)
498 {
499 for (auto &s :syms) {
500 void *res = dlsym(handle, s.c_str());
501 if (res == nullptr) {
502 printf("dlsym failed: %s.n", dlerror());
503 exit(-1);
504 }
505 }
506 }
507
Bm_function_dlsym_libGLES_mali(benchmark::State &state)508 static void Bm_function_dlsym_libGLES_mali(benchmark::State &state)
509 {
510 void *handle = dlopen(LIBGLES_MALI_PATH, RTLD_LAZY);
511 if (handle == nullptr) {
512 printf("dlopen %s failed: %s.n", LIBGLES_MALI_PATH, dlerror());
513 exit(-1);
514 }
515 for (auto _ : state) {
516 DoDlsym(handle);
517 }
518 }
519
Bm_function_dlclose(benchmark::State &state)520 static void Bm_function_dlclose(benchmark::State &state)
521 {
522 const char* libace = "libace.z.so";
523 void *handle;
524 for (auto _ : state) {
525 state.PauseTiming();
526 handle = dlopen(libace, RTLD_LAZY);
527 if (handle == nullptr) {
528 printf("dlopen %s failed: %s.n", libace, dlerror());
529 exit(-1);
530 }
531 state.ResumeTiming();
532 dlclose(handle);
533 }
534 }
535 MUSL_BENCHMARK(Bm_function_dlsym_libGLES_mali);
536 MUSL_BENCHMARK(Bm_function_dlclose);
537 #endif
538