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