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