#include <dlfcn.h>
#endif
+#include <string>
+
void *getLibraryHandle(const char *path);
void *loadLibrary(const char *path);
void freeLibrary(void *library);
void *getProcAddress(void *library, const char *name);
template<int n>
-void *loadLibrary(const char *(&names)[n], const char *mustContainSymbol = nullptr)
+void *loadLibrary(const std::string &libraryDirectory, const char *(&names)[n], const char *mustContainSymbol = nullptr)
{
+ if(!libraryDirectory.empty())
+ {
+ for(int i = 0; i < n; i++)
+ {
+ std::string nameWithPath = libraryDirectory + names[i];
+ void *library = getLibraryHandle(nameWithPath.c_str());
+
+ if(library)
+ {
+ if(!mustContainSymbol || getProcAddress(library, mustContainSymbol))
+ {
+ return library;
+ }
+
+ freeLibrary(library);
+ }
+ }
+ }
+
for(int i = 0; i < n; i++)
{
void *library = getLibraryHandle(names[i]);
{
return (void*)GetProcAddress((HMODULE)library, name);
}
+
+ inline std::string getLibraryDirectoryFromSymbol(void* symbol)
+ {
+ HMODULE module = NULL;
+ GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)symbol, &module);
+ char filename[1024];
+ if(module && (GetModuleFileName(module, filename, sizeof(filename)) != 0))
+ {
+ std::string directory(filename);
+ return directory.substr(0, directory.find_last_of("\\/") + 1).c_str();
+ }
+ else
+ {
+ return "";
+ }
+ }
#else
inline void *loadLibrary(const char *path)
{
return symbol;
}
+
+ inline std::string getLibraryDirectoryFromSymbol(void* symbol)
+ {
+ Dl_info dl_info;
+ if(dladdr(symbol, &dl_info) != 0)
+ {
+ std::string directory(dl_info.dli_fname);
+ return directory.substr(0, directory.find_last_of("\\/") + 1).c_str();
+ }
+ else
+ {
+ return "";
+ }
+ }
#endif
#endif // SharedLibrary_hpp
class LibEGL
{
public:
- LibEGL()
+ LibEGL(const std::string libraryDirectory) : libraryDirectory(libraryDirectory)
{
- libEGL = nullptr;
- libEGLexports = nullptr;
}
~LibEGL()
#error "libEGL::loadExports unimplemented for this platform"
#endif
- libEGL = loadLibrary(libEGL_lib, "libEGL_swiftshader");
+ libEGL = loadLibrary(libraryDirectory, libEGL_lib, "libEGL_swiftshader");
if(libEGL)
{
return libEGLexports;
}
- void *libEGL;
- LibEGLexports *libEGLexports;
+ void *libEGL = nullptr;
+ LibEGLexports *libEGLexports = nullptr;
+ const std::string libraryDirectory;
};
#endif // libEGL_hpp
return &libEGL;
}
-LibGLES_CM libGLES_CM;
-LibGLESv2 libGLESv2;
+LibGLES_CM libGLES_CM(getLibraryDirectoryFromSymbol((void*)libEGL_swiftshader));
+LibGLESv2 libGLESv2(getLibraryDirectoryFromSymbol((void*)libEGL_swiftshader));
class LibGLES_CM
{
public:
- LibGLES_CM()
+ LibGLES_CM(const std::string libraryDirectory) : libraryDirectory(libraryDirectory)
{
- libGLES_CM = nullptr;
- libGLES_CMexports = nullptr;
}
~LibGLES_CM()
#error "libGLES_CM::loadExports unimplemented for this platform"
#endif
- libGLES_CM = loadLibrary(libGLES_CM_lib, "libGLES_CM_swiftshader");
+ libGLES_CM = loadLibrary(libraryDirectory, libGLES_CM_lib, "libGLES_CM_swiftshader");
if(libGLES_CM)
{
return libGLES_CMexports;
}
- void *libGLES_CM;
- LibGLES_CMexports *libGLES_CMexports;
+ void *libGLES_CM = nullptr;
+ LibGLES_CMexports *libGLES_CMexports = nullptr;
+ const std::string libraryDirectory;
};
#endif // libGLES_CM_hpp
return &libGLES_CM;
}
-LibEGL libEGL;
+LibEGL libEGL(getLibraryDirectoryFromSymbol((void*)libGLES_CM_swiftshader));
return &libGLESv2;
}
-LibEGL libEGL;
-LibGLES_CM libGLES_CM;
+LibEGL libEGL(getLibraryDirectoryFromSymbol((void*)libGLESv2_swiftshader));
+LibGLES_CM libGLES_CM(getLibraryDirectoryFromSymbol((void*)libGLESv2_swiftshader));
class LibGLESv2
{
public:
- LibGLESv2()
+ LibGLESv2(const std::string libraryDirectory) : libraryDirectory(libraryDirectory)
{
- libGLESv2 = nullptr;
- libGLESv2exports = nullptr;
}
~LibGLESv2()
#error "libGLESv2::loadExports unimplemented for this platform"
#endif
- libGLESv2 = loadLibrary(libGLESv2_lib, "libGLESv2_swiftshader");
+ libGLESv2 = loadLibrary(libraryDirectory, libGLESv2_lib, "libGLESv2_swiftshader");
if(libGLESv2)
{
return libGLESv2exports;
}
- void *libGLESv2;
- LibGLESv2exports *libGLESv2exports;
+ void *libGLESv2 = nullptr;
+ LibGLESv2exports *libGLESv2exports = nullptr;
+ const std::string libraryDirectory;
};
#endif // libGLESv2_hpp