/*-------------------------------------------------------------------------
* 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