Commit e2540106 by Nicolas Capens

Load libraries from a list of possible names.

BUG=18208440 Change-Id: Ie57bf7c6fa40ec1f9d0c3780c360d281d84a8c56
parent f6b6d273
......@@ -15,12 +15,45 @@
#include <dlfcn.h>
#endif
template<int n>
void *loadLibrary(const char *(&names)[n])
{
for(int i = 0; i < n; i++)
{
void *library = getLibraryHandle(names[i]);
if(library)
{
return library;
}
}
for(int i = 0; i < n; i++)
{
void *library = loadLibrary(names[i]);
if(library)
{
return library;
}
}
return 0;
}
#if defined(_WIN32)
inline void *loadLibrary(const char *path)
{
return (void*)LoadLibrary(path);
}
inline void *getLibraryHandle(const char *path)
{
HMODULE module = 0;
GetModuleHandleEx(0, path, &module);
return (void*)module;
}
inline void freeLibrary(void *library)
{
FreeLibrary((HMODULE)library);
......@@ -36,6 +69,18 @@
return dlopen(path, RTLD_LAZY);
}
inline void *getLibraryHandle(const char *path)
{
bool resident = (dlopen(names[i], RTLD_NOLOAD) != 0);
if(resident)
{
return dlopen(path, RTLD_LAZY); // Increment reference count
}
return 0;
}
inline void freeLibrary(void *library)
{
dlclose(library);
......
......@@ -89,7 +89,9 @@
</Link>
<PostBuildEvent>
<Command>mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\"
copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Command>
copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"
mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\"
copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\libEGL_translator.dll"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
......@@ -116,7 +118,9 @@ copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Comman
</Link>
<PostBuildEvent>
<Command>mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\"
copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Command>
copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"
mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\"
copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\libEGL_translator.dll"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">
......@@ -144,7 +148,9 @@ copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Comman
</Link>
<PostBuildEvent>
<Command>mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\"
copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Command>
copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"
mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\"
copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\libEGL_translator.dll"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
......
......@@ -84,21 +84,21 @@ CONSTRUCTOR static bool eglAttachProcess()
eglAttachThread();
#if defined(_WIN32)
const char *libGLES_CM_lib = "libGLES_CM.dll";
const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "libGLES_CM_translator.dll"};
#else
const char *libGLES_CM_lib = "libGLES_CM.so.1";
const char *libGLES_CM_lib[] = {"libGLES_CM.so.1", "libGLES_CM.so"};
#endif
libGLES_CM = loadLibrary(libGLES_CM_lib);
es1::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*))getProcAddress(libGLES_CM, "glCreateContext");
es1::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLES_CM, "glGetProcAddress");
#if defined(_WIN32)
const char *libGLESv2_lib = "libGLESv2.dll";
const char *libGLESv2_lib[] = {"libGLESv2.dll", "libGLES_V2_translator.dll"};
#else
const char *libGLESv2_lib = "libGLESv2.so.2";
const char *libGLESv2_lib[] = {"libGLESv2.so.2", "libGLESv2.so"};
#endif
libGLESv2 = loadLibrary(libGLESv2_lib);
es2::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*))getProcAddress(libGLESv2, "glCreateContext");
es2::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLESv2, "glGetProcAddress");
......
......@@ -91,7 +91,9 @@
</Link>
<PostBuildEvent>
<Command>mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\"
copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Command>
copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"
mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\"
copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\libGLES_CM_translator.dll"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
......@@ -124,7 +126,9 @@ copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Co
</Link>
<PostBuildEvent>
<Command>mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\"
copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Command>
copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"
mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\"
copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\libGLES_CM_translator.dll"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">
......@@ -156,7 +160,9 @@ copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Co
</Link>
<PostBuildEvent>
<Command>mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\"
copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Command>
copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"
mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\"
copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\libGLES_CM_translator.dll"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
......
......@@ -44,9 +44,9 @@ CONSTRUCTOR static bool glAttachProcess()
glAttachThread();
#if defined(_WIN32)
const char *libEGL_lib = "libEGL.dll";
const char *libEGL_lib[] = {"libEGL.dll", "libEGL_translator.dll"};
#else
const char *libEGL_lib = "libEGL.so.1";
const char *libEGL_lib[] = {"libEGL.so.1", "libEGL.so"};
#endif
libEGL = loadLibrary(libEGL_lib);
......
......@@ -91,7 +91,9 @@
</Link>
<PostBuildEvent>
<Command>mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\"
copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Command>
copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"
mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\translator"
copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\libGLES_V2_translator.dll"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
......@@ -124,7 +126,9 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Com
</Link>
<PostBuildEvent>
<Command>mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\"
copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Command>
copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"
mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\translator"
copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\libGLES_V2_translator.dll"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">
......@@ -156,7 +160,9 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Com
</Link>
<PostBuildEvent>
<Command>mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\"
copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"</Command>
copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\"
mkdir "$(ProjectDir)..\..\..\lib\$(Configuration)\translator"
copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)\translator\libGLES_V2_translator.dll"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
......
......@@ -43,10 +43,10 @@ CONSTRUCTOR static bool glAttachProcess()
glAttachThread();
#if defined(_WIN32)
const char *libEGL_lib = "libEGL.dll";
#if defined(_WIN32)
const char *libEGL_lib[] = {"libEGL.dll", "libEGL_translator.dll"};
#else
const char *libEGL_lib = "libEGL.so.1";
const char *libEGL_lib[] = {"libEGL.so.1", "libEGL.so"};
#endif
libEGL = loadLibrary(libEGL_lib);
......@@ -54,9 +54,9 @@ CONSTRUCTOR static bool glAttachProcess()
egl::getCurrentDisplay = (egl::Display *(*)())getProcAddress(libEGL, "eglGetCurrentDisplay");
#if defined(_WIN32)
const char *libGLES_CM_lib = "libGLES_CM.dll";
const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "libGLES_CM_translator.dll"};
#else
const char *libGLES_CM_lib = "libGLES_CM.so.1";
const char *libGLES_CM_lib[] = {"libGLES_CM.so.1", "libGLES_CM.so"};
#endif
libGLES_CM = loadLibrary(libGLES_CM_lib);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment