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 #undef CALL_HOOK_API
21 #define CALL_HOOK_API(api, ...) \
22 do { \
23 if (OHOS::EglCoreInit() && OHOS::CheckEglWrapperApi(#api)) { \
24 OHOS::gWrapperHook.wrapper.api(__VA_ARGS__); \
25 } else { \
26 WLOGE("%{public}s is invalid.", #api); \
27 } \
28 } while (0); \
29 }
30
31 #undef CALL_HOOK_API_RET
32 #define CALL_HOOK_API_RET(api, ...) \
33 do { \
34 if (OHOS::EglCoreInit() && OHOS::CheckEglWrapperApi(#api)) { \
35 return OHOS::gWrapperHook.wrapper.api(__VA_ARGS__); \
36 } else { \
37 WLOGE("%{public}s is invalid.", #api); \
38 return 0; \
39 } \
40 } while (0); \
41 }
42
43 #undef HOOK_API_ENTRY
44 #define HOOK_API_ENTRY(r, api, ...) r api(__VA_ARGS__) { \
45
46 extern "C" {
47 #pragma GCC diagnostic ignored "-Wunused-parameter"
48 #include "egl_hook_entries.in"
49
GetHookTable()50 OHOS::GlHookTable *GetHookTable()
51 {
52 auto hookTable = OHOS::ThreadPrivateDataCtl::GetGlHookTable();
53 if (__builtin_expect(hookTable == nullptr, 0)) {
54 OHOS::ThreadPrivateDataCtl::SetGlHookTable(&OHOS::gWrapperHook.gl);
55 return &OHOS::gWrapperHook.gl;
56 }
57 return hookTable;
58 }
59
GetHookTableKey()60 pthread_key_t GetHookTableKey()
61 {
62 return OHOS::ThreadPrivateDataCtl::GetGlHookTableKey();
63 }
64
65 #pragma GCC diagnostic warning "-Wunused-parameter"
66 }
67
68 namespace OHOS {
69 const std::map<std::string, EglWrapperFuncPointer> gExtensionMap = {
70 { "eglLockSurfaceKHR", (EglWrapperFuncPointer)&eglLockSurfaceKHR },
71 { "eglUnlockSurfaceKHR", (EglWrapperFuncPointer)&eglUnlockSurfaceKHR },
72
73 // EGL_KHR_image, EGL_KHR_image_base
74 { "eglCreateImageKHR", (EglWrapperFuncPointer)&eglCreateImageKHR },
75 { "eglDestroyImageKHR", (EglWrapperFuncPointer)&eglDestroyImageKHR },
76
77 // EGL_KHR_reusable_sync, EGL_KHR_fence_sync
78 { "eglCreateSyncKHR", (EglWrapperFuncPointer)&eglCreateSyncKHR },
79 { "eglDestroySyncKHR", (EglWrapperFuncPointer)&eglDestroySyncKHR },
80 { "eglClientWaitSyncKHR", (EglWrapperFuncPointer)&eglClientWaitSyncKHR },
81 { "eglSignalSyncKHR", (EglWrapperFuncPointer)&eglSignalSyncKHR },
82 { "eglGetSyncAttribKHR", (EglWrapperFuncPointer)&eglGetSyncAttribKHR },
83
84 // EGL_KHR_wait_sync
85 { "eglWaitSyncKHR", (EglWrapperFuncPointer)&eglWaitSyncKHR },
86
87 // EGL_KHR_swap_buffers_with_damage
88 { "eglSwapBuffersWithDamageKHR", (EglWrapperFuncPointer)&eglSwapBuffersWithDamageKHR },
89
90 // EGL_KHR_partial_update
91 { "eglSetDamageRegionKHR", (EglWrapperFuncPointer)&eglSetDamageRegionKHR },
92
93 { "eglCreateStreamKHR", (EglWrapperFuncPointer)&eglCreateStreamKHR },
94 { "eglDestroyStreamKHR", (EglWrapperFuncPointer)&eglDestroyStreamKHR },
95 { "eglStreamAttribKHR", (EglWrapperFuncPointer)&eglStreamAttribKHR },
96 { "eglQueryStreamKHR", (EglWrapperFuncPointer)&eglQueryStreamKHR },
97 { "eglQueryStreamu64KHR", (EglWrapperFuncPointer)&eglQueryStreamu64KHR },
98 { "eglQueryStreamTimeKHR", (EglWrapperFuncPointer)&eglQueryStreamTimeKHR },
99 { "eglCreateStreamProducerSurfaceKHR", (EglWrapperFuncPointer)&eglCreateStreamProducerSurfaceKHR },
100 { "eglStreamConsumerGLTextureExternalKHR", (EglWrapperFuncPointer)&eglStreamConsumerGLTextureExternalKHR },
101 { "eglStreamConsumerAcquireKHR", (EglWrapperFuncPointer)&eglStreamConsumerAcquireKHR },
102 { "eglStreamConsumerReleaseKHR", (EglWrapperFuncPointer)&eglStreamConsumerReleaseKHR },
103 { "eglGetStreamFileDescriptorKHR", (EglWrapperFuncPointer)&eglGetStreamFileDescriptorKHR },
104 { "eglCreateStreamFromFileDescriptorKHR", (EglWrapperFuncPointer)&eglCreateStreamFromFileDescriptorKHR },
105 };
106 }
107