xref: /aosp_15_r20/external/deqp/framework/egl/wrapper/eglwLibrary.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program EGL Utilities
3*35238bceSAndroid Build Coastguard Worker  * ------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief EGL API Library.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "eglwLibrary.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuFunctionLibrary.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "deDynamicLibrary.hpp"
27*35238bceSAndroid Build Coastguard Worker 
28*35238bceSAndroid Build Coastguard Worker #if defined(DEQP_EGL_DIRECT_LINK)
29*35238bceSAndroid Build Coastguard Worker #include <EGL/egl.h>
30*35238bceSAndroid Build Coastguard Worker #endif
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker namespace eglw
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker 
FuncPtrLibrary(void)35*35238bceSAndroid Build Coastguard Worker FuncPtrLibrary::FuncPtrLibrary(void)
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker }
38*35238bceSAndroid Build Coastguard Worker 
~FuncPtrLibrary(void)39*35238bceSAndroid Build Coastguard Worker FuncPtrLibrary::~FuncPtrLibrary(void)
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker }
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker #include "eglwFuncPtrLibraryImpl.inl"
44*35238bceSAndroid Build Coastguard Worker 
45*35238bceSAndroid Build Coastguard Worker namespace
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker 
createStaticLibrary(void)48*35238bceSAndroid Build Coastguard Worker tcu::FunctionLibrary *createStaticLibrary(void)
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker #if defined(DEQP_EGL_DIRECT_LINK)
51*35238bceSAndroid Build Coastguard Worker     static tcu::StaticFunctionLibrary::Entry s_staticEntries[] = {
52*35238bceSAndroid Build Coastguard Worker #if defined(EGL_VERSION_1_5)
53*35238bceSAndroid Build Coastguard Worker #include "eglwStaticLibrary15.inl"
54*35238bceSAndroid Build Coastguard Worker #elif defined(EGL_VERSION_1_4)
55*35238bceSAndroid Build Coastguard Worker #include "eglwStaticLibrary14.inl"
56*35238bceSAndroid Build Coastguard Worker #endif
57*35238bceSAndroid Build Coastguard Worker     };
58*35238bceSAndroid Build Coastguard Worker     return new tcu::StaticFunctionLibrary(s_staticEntries, DE_LENGTH_OF_ARRAY(s_staticEntries));
59*35238bceSAndroid Build Coastguard Worker #else
60*35238bceSAndroid Build Coastguard Worker     return new tcu::StaticFunctionLibrary(DE_NULL, 0);
61*35238bceSAndroid Build Coastguard Worker #endif
62*35238bceSAndroid Build Coastguard Worker }
63*35238bceSAndroid Build Coastguard Worker 
64*35238bceSAndroid Build Coastguard Worker class CoreLoader : public FunctionLoader
65*35238bceSAndroid Build Coastguard Worker {
66*35238bceSAndroid Build Coastguard Worker public:
CoreLoader(const de::DynamicLibrary * dynLib)67*35238bceSAndroid Build Coastguard Worker     CoreLoader(const de::DynamicLibrary *dynLib)
68*35238bceSAndroid Build Coastguard Worker         : m_staticLib(createStaticLibrary())
69*35238bceSAndroid Build Coastguard Worker         , m_dynLib(dynLib)
70*35238bceSAndroid Build Coastguard Worker         , m_getProcAddress(DE_NULL)
71*35238bceSAndroid Build Coastguard Worker     {
72*35238bceSAndroid Build Coastguard Worker         // Try to obtain eglGetProcAddress
73*35238bceSAndroid Build Coastguard Worker         m_getProcAddress = (eglGetProcAddressFunc)m_staticLib->getFunction("eglGetProcAddress");
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker         if (!m_getProcAddress && m_dynLib)
76*35238bceSAndroid Build Coastguard Worker             m_getProcAddress = (eglGetProcAddressFunc)m_dynLib->getFunction("eglGetProcAddress");
77*35238bceSAndroid Build Coastguard Worker     }
78*35238bceSAndroid Build Coastguard Worker 
~CoreLoader(void)79*35238bceSAndroid Build Coastguard Worker     ~CoreLoader(void)
80*35238bceSAndroid Build Coastguard Worker     {
81*35238bceSAndroid Build Coastguard Worker         delete m_staticLib;
82*35238bceSAndroid Build Coastguard Worker     }
83*35238bceSAndroid Build Coastguard Worker 
get(const char * name) const84*35238bceSAndroid Build Coastguard Worker     GenericFuncType get(const char *name) const
85*35238bceSAndroid Build Coastguard Worker     {
86*35238bceSAndroid Build Coastguard Worker         GenericFuncType res = (GenericFuncType)DE_NULL;
87*35238bceSAndroid Build Coastguard Worker 
88*35238bceSAndroid Build Coastguard Worker         res = (GenericFuncType)m_staticLib->getFunction(name);
89*35238bceSAndroid Build Coastguard Worker 
90*35238bceSAndroid Build Coastguard Worker         if (!res && m_dynLib)
91*35238bceSAndroid Build Coastguard Worker             res = (GenericFuncType)m_dynLib->getFunction(name);
92*35238bceSAndroid Build Coastguard Worker 
93*35238bceSAndroid Build Coastguard Worker         if (!res && m_getProcAddress)
94*35238bceSAndroid Build Coastguard Worker             res = (GenericFuncType)m_getProcAddress(name);
95*35238bceSAndroid Build Coastguard Worker 
96*35238bceSAndroid Build Coastguard Worker         return res;
97*35238bceSAndroid Build Coastguard Worker     }
98*35238bceSAndroid Build Coastguard Worker 
99*35238bceSAndroid Build Coastguard Worker protected:
100*35238bceSAndroid Build Coastguard Worker     tcu::FunctionLibrary *const m_staticLib;
101*35238bceSAndroid Build Coastguard Worker     const de::DynamicLibrary *m_dynLib;
102*35238bceSAndroid Build Coastguard Worker     eglGetProcAddressFunc m_getProcAddress;
103*35238bceSAndroid Build Coastguard Worker };
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker class ExtLoader : public FunctionLoader
106*35238bceSAndroid Build Coastguard Worker {
107*35238bceSAndroid Build Coastguard Worker public:
ExtLoader(const eglGetProcAddressFunc getProcAddress)108*35238bceSAndroid Build Coastguard Worker     ExtLoader(const eglGetProcAddressFunc getProcAddress) : m_getProcAddress(getProcAddress)
109*35238bceSAndroid Build Coastguard Worker     {
110*35238bceSAndroid Build Coastguard Worker     }
111*35238bceSAndroid Build Coastguard Worker 
get(const char * name) const112*35238bceSAndroid Build Coastguard Worker     GenericFuncType get(const char *name) const
113*35238bceSAndroid Build Coastguard Worker     {
114*35238bceSAndroid Build Coastguard Worker         return (GenericFuncType)m_getProcAddress(name);
115*35238bceSAndroid Build Coastguard Worker     }
116*35238bceSAndroid Build Coastguard Worker 
117*35238bceSAndroid Build Coastguard Worker protected:
118*35238bceSAndroid Build Coastguard Worker     const eglGetProcAddressFunc m_getProcAddress;
119*35238bceSAndroid Build Coastguard Worker };
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker } // namespace
122*35238bceSAndroid Build Coastguard Worker 
DefaultLibrary(const char * dynamicLibraryName)123*35238bceSAndroid Build Coastguard Worker DefaultLibrary::DefaultLibrary(const char *dynamicLibraryName) : m_dynLib(DE_NULL)
124*35238bceSAndroid Build Coastguard Worker {
125*35238bceSAndroid Build Coastguard Worker     if (dynamicLibraryName)
126*35238bceSAndroid Build Coastguard Worker         m_dynLib = new de::DynamicLibrary(dynamicLibraryName);
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker     {
129*35238bceSAndroid Build Coastguard Worker         const CoreLoader loader(m_dynLib);
130*35238bceSAndroid Build Coastguard Worker         initCore(&m_egl, &loader);
131*35238bceSAndroid Build Coastguard Worker     }
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker     if (m_egl.getProcAddress)
134*35238bceSAndroid Build Coastguard Worker     {
135*35238bceSAndroid Build Coastguard Worker         const ExtLoader loader(m_egl.getProcAddress);
136*35238bceSAndroid Build Coastguard Worker         initExtensions(&m_egl, &loader);
137*35238bceSAndroid Build Coastguard Worker     }
138*35238bceSAndroid Build Coastguard Worker }
139*35238bceSAndroid Build Coastguard Worker 
~DefaultLibrary(void)140*35238bceSAndroid Build Coastguard Worker DefaultLibrary::~DefaultLibrary(void)
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker     delete m_dynLib;
143*35238bceSAndroid Build Coastguard Worker }
144*35238bceSAndroid Build Coastguard Worker 
getLibraryFileName(void)145*35238bceSAndroid Build Coastguard Worker const char *DefaultLibrary::getLibraryFileName(void)
146*35238bceSAndroid Build Coastguard Worker {
147*35238bceSAndroid Build Coastguard Worker #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
148*35238bceSAndroid Build Coastguard Worker     return "libEGL.so";
149*35238bceSAndroid Build Coastguard Worker #elif (DE_OS == DE_OS_WIN32)
150*35238bceSAndroid Build Coastguard Worker     return "libEGL.dll";
151*35238bceSAndroid Build Coastguard Worker #else
152*35238bceSAndroid Build Coastguard Worker     return DE_NULL;
153*35238bceSAndroid Build Coastguard Worker #endif
154*35238bceSAndroid Build Coastguard Worker }
155*35238bceSAndroid Build Coastguard Worker 
156*35238bceSAndroid Build Coastguard Worker } // namespace eglw
157