• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device 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 #include "egl_core.h"
16 #include "egl_defs.h"
17 #include "wrapper_log.h"
18 #include "thread_private_data_ctl.h"
19 
20 #ifdef OPENGL_WRAPPER_ENABLE_GL4
21 #undef CALL_HOOK_API
22 #define CALL_HOOK_API(api, ...)                                         \
23     do {                                                                \
24         bool eglCoreInitRet = OHOS::EglCoreInit();                      \
25         if (eglCoreInitRet && OHOS::gWrapperHook.useMesa) {             \
26             OHOS::gWrapperHook.egl.api(__VA_ARGS__);                    \
27         } else if (eglCoreInitRet && OHOS::CheckEglWrapperApi(#api)) {  \
28             OHOS::gWrapperHook.wrapper.api(__VA_ARGS__);                \
29         } else {                                                        \
30             WLOGE("%{public}s is invalid.", #api);                      \
31         }                                                               \
32     } while (0);                                                        \
33 }
34 
35 #undef CALL_HOOK_API_RET
36 #define CALL_HOOK_API_RET(api, ...)                                     \
37     do {                                                                \
38         bool eglCoreInitRet = OHOS::EglCoreInit();                      \
39         if (eglCoreInitRet && OHOS::gWrapperHook.useMesa) {             \
40             return OHOS::gWrapperHook.egl.api(__VA_ARGS__);             \
41         } else if (eglCoreInitRet && OHOS::CheckEglWrapperApi(#api)) {  \
42             return OHOS::gWrapperHook.wrapper.api(__VA_ARGS__);         \
43         } else {                                                        \
44             WLOGE("%{public}s is invalid.", #api);                      \
45             return 0;                                                   \
46         }                                                               \
47     } while (0);                                                        \
48 }
49 #else
50 #undef CALL_HOOK_API
51 #define CALL_HOOK_API(api, ...)                                         \
52     do {                                                                \
53         if (OHOS::EglCoreInit() && OHOS::CheckEglWrapperApi(#api)) {    \
54             OHOS::gWrapperHook.wrapper.api(__VA_ARGS__);                \
55         } else {                                                        \
56             WLOGE("%{public}s is invalid.", #api);                      \
57         }                                                               \
58     } while (0);                                                        \
59 }
60 
61 #undef CALL_HOOK_API_RET
62 #define CALL_HOOK_API_RET(api, ...)                                     \
63     do {                                                                \
64         if (OHOS::EglCoreInit() && OHOS::CheckEglWrapperApi(#api)) {    \
65             return OHOS::gWrapperHook.wrapper.api(__VA_ARGS__);         \
66         } else {                                                        \
67             WLOGE("%{public}s is invalid.", #api);                      \
68             return 0;                                                   \
69         }                                                               \
70     } while (0);                                                        \
71 }
72 #endif
73 
74 #undef HOOK_API_ENTRY
75 #define HOOK_API_ENTRY(r, api, ...) r api(__VA_ARGS__) {                \
76 
77 extern "C" {
78 #pragma GCC diagnostic ignored "-Wunused-parameter"
79 #include "egl_hook_entries.in"
80 
GetHookTable()81 OHOS::GlHookTable *GetHookTable()
82 {
83     auto hookTable = OHOS::ThreadPrivateDataCtl::GetGlHookTable();
84     if (__builtin_expect(hookTable == nullptr, 0)) {
85         OHOS::ThreadPrivateDataCtl::SetGlHookTable(&OHOS::gWrapperHook.gl);
86         return &OHOS::gWrapperHook.gl;
87     }
88     return hookTable;
89 }
90 
GetHookTableKey()91 pthread_key_t GetHookTableKey()
92 {
93     return OHOS::ThreadPrivateDataCtl::GetGlHookTableKey();
94 }
95 
96 #pragma GCC diagnostic warning "-Wunused-parameter"
97 }
98 
99 namespace OHOS {
100 const std::map<std::string, EglWrapperFuncPointer> gExtensionMap = {
101     { "eglLockSurfaceKHR", (EglWrapperFuncPointer)&eglLockSurfaceKHR },
102     { "eglUnlockSurfaceKHR", (EglWrapperFuncPointer)&eglUnlockSurfaceKHR },
103 
104     // EGL_KHR_image, EGL_KHR_image_base
105     { "eglCreateImageKHR", (EglWrapperFuncPointer)&eglCreateImageKHR },
106     { "eglDestroyImageKHR", (EglWrapperFuncPointer)&eglDestroyImageKHR },
107 
108     // EGL_KHR_reusable_sync, EGL_KHR_fence_sync
109     { "eglCreateSyncKHR", (EglWrapperFuncPointer)&eglCreateSyncKHR },
110     { "eglDestroySyncKHR", (EglWrapperFuncPointer)&eglDestroySyncKHR },
111     { "eglClientWaitSyncKHR", (EglWrapperFuncPointer)&eglClientWaitSyncKHR },
112     { "eglSignalSyncKHR", (EglWrapperFuncPointer)&eglSignalSyncKHR },
113     { "eglGetSyncAttribKHR", (EglWrapperFuncPointer)&eglGetSyncAttribKHR },
114 
115     // EGL_KHR_wait_sync
116     { "eglWaitSyncKHR", (EglWrapperFuncPointer)&eglWaitSyncKHR },
117 
118     // EGL_KHR_swap_buffers_with_damage
119     { "eglSwapBuffersWithDamageKHR", (EglWrapperFuncPointer)&eglSwapBuffersWithDamageKHR },
120 
121     // EGL_KHR_partial_update
122     { "eglSetDamageRegionKHR", (EglWrapperFuncPointer)&eglSetDamageRegionKHR },
123 
124     { "eglCreateStreamKHR", (EglWrapperFuncPointer)&eglCreateStreamKHR },
125     { "eglDestroyStreamKHR", (EglWrapperFuncPointer)&eglDestroyStreamKHR },
126     { "eglStreamAttribKHR", (EglWrapperFuncPointer)&eglStreamAttribKHR },
127     { "eglQueryStreamKHR", (EglWrapperFuncPointer)&eglQueryStreamKHR },
128     { "eglQueryStreamu64KHR", (EglWrapperFuncPointer)&eglQueryStreamu64KHR },
129     { "eglQueryStreamTimeKHR", (EglWrapperFuncPointer)&eglQueryStreamTimeKHR },
130     { "eglCreateStreamProducerSurfaceKHR", (EglWrapperFuncPointer)&eglCreateStreamProducerSurfaceKHR },
131     { "eglStreamConsumerGLTextureExternalKHR", (EglWrapperFuncPointer)&eglStreamConsumerGLTextureExternalKHR },
132     { "eglStreamConsumerAcquireKHR", (EglWrapperFuncPointer)&eglStreamConsumerAcquireKHR },
133     { "eglStreamConsumerReleaseKHR", (EglWrapperFuncPointer)&eglStreamConsumerReleaseKHR },
134     { "eglGetStreamFileDescriptorKHR", (EglWrapperFuncPointer)&eglGetStreamFileDescriptorKHR },
135     { "eglCreateStreamFromFileDescriptorKHR", (EglWrapperFuncPointer)&eglCreateStreamFromFileDescriptorKHR },
136     { "eglGetNativeClientBufferANDROID", (EglWrapperFuncPointer)&eglGetNativeClientBufferANDROID },
137     { "eglDupNativeFenceFDANDROID", (EglWrapperFuncPointer)&eglDupNativeFenceFDANDROID },
138 };
139 }
140