/*------------------------------------------------------------------------- * drawElements Quality Program EGL Utilities * ------------------------------------------ * * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief EGL API Library. *//*--------------------------------------------------------------------*/ #include "eglwLibrary.hpp" #include "tcuFunctionLibrary.hpp" #include "deDynamicLibrary.hpp" #if defined(DEQP_EGL_DIRECT_LINK) # include <EGL/egl.h> #endif namespace eglw { FuncPtrLibrary::FuncPtrLibrary (void) { } FuncPtrLibrary::~FuncPtrLibrary (void) { } #include "eglwFuncPtrLibraryImpl.inl" namespace { tcu::FunctionLibrary* createStaticLibrary (void) { #if defined(DEQP_EGL_DIRECT_LINK) static tcu::StaticFunctionLibrary::Entry s_staticEntries[] = { # if defined(EGL_VERSION_1_5) # include "eglwStaticLibrary15.inl" # elif defined(EGL_VERSION_1_4) # include "eglwStaticLibrary14.inl" # endif }; return new tcu::StaticFunctionLibrary(s_staticEntries, DE_LENGTH_OF_ARRAY(s_staticEntries)); #else return new tcu::StaticFunctionLibrary(DE_NULL, 0); #endif } class CoreLoader : public FunctionLoader { public: CoreLoader (const de::DynamicLibrary* dynLib) : m_staticLib (createStaticLibrary()) , m_dynLib (dynLib) , m_getProcAddress (DE_NULL) { // Try to obtain eglGetProcAddress m_getProcAddress = (eglGetProcAddressFunc)m_staticLib->getFunction("eglGetProcAddress"); if (!m_getProcAddress && m_dynLib) m_getProcAddress = (eglGetProcAddressFunc)m_dynLib->getFunction("eglGetProcAddress"); } ~CoreLoader (void) { delete m_staticLib; } GenericFuncType get (const char* name) const { GenericFuncType res = (GenericFuncType)DE_NULL; res = (GenericFuncType)m_staticLib->getFunction(name); if (!res && m_dynLib) res = (GenericFuncType)m_dynLib->getFunction(name); if (!res && m_getProcAddress) res = (GenericFuncType)m_getProcAddress(name); return res; } protected: tcu::FunctionLibrary* const m_staticLib; const de::DynamicLibrary* m_dynLib; eglGetProcAddressFunc m_getProcAddress; }; class ExtLoader : public FunctionLoader { public: ExtLoader (const eglGetProcAddressFunc getProcAddress) : m_getProcAddress(getProcAddress) { } GenericFuncType get (const char* name) const { return (GenericFuncType)m_getProcAddress(name); } protected: const eglGetProcAddressFunc m_getProcAddress; }; } // anonymous DefaultLibrary::DefaultLibrary (const char* dynamicLibraryName) : m_dynLib(DE_NULL) { if (dynamicLibraryName) m_dynLib = new de::DynamicLibrary(dynamicLibraryName); { const CoreLoader loader(m_dynLib); initCore(&m_egl, &loader); } if (m_egl.getProcAddress) { const ExtLoader loader(m_egl.getProcAddress); initExtensions(&m_egl, &loader); } } DefaultLibrary::~DefaultLibrary (void) { delete m_dynLib; } const char* DefaultLibrary::getLibraryFileName (void) { #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX) return "libEGL.so"; #elif (DE_OS == DE_OS_WIN32) return "libEGL.dll"; #else return DE_NULL; #endif } } // eglw