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