blob: 9ae5e83f28c390d09d635ae266de091a81b0ae03 [file] [log] [blame]
/*-------------------------------------------------------------------------
* 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(nullptr, 0);
#endif
}
class CoreLoader : public FunctionLoader
{
public:
CoreLoader(const de::DynamicLibrary *dynLib)
: m_staticLib(createStaticLibrary())
, m_dynLib(dynLib)
, m_getProcAddress(nullptr)
{
// 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 = nullptr;
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;
};
} // namespace
DefaultLibrary::DefaultLibrary(const char *dynamicLibraryName) : m_dynLib(nullptr)
{
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 nullptr;
#endif
}
} // namespace eglw