support loading EGL libraries from /vendor/lib/egl as well as /system/lib/egl
Change-Id: Idd9ca85ce3ba6c92234375071b53e5365e689062
This commit is contained in:
parent
1f6bf40676
commit
2b9e4f6a24
@ -136,30 +136,24 @@ void* Loader::open(EGLNativeDisplayType display, int impl, egl_connection_t* cnx
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void* dso;
|
void* dso;
|
||||||
char path[PATH_MAX];
|
|
||||||
int index = int(display);
|
int index = int(display);
|
||||||
driver_t* hnd = 0;
|
driver_t* hnd = 0;
|
||||||
const char* const format = "/system/lib/egl/lib%s_%s.so";
|
|
||||||
|
|
||||||
char const* tag = getTag(index, impl);
|
char const* tag = getTag(index, impl);
|
||||||
if (tag) {
|
if (tag) {
|
||||||
snprintf(path, PATH_MAX, format, "GLES", tag);
|
dso = load_driver("GLES", tag, cnx, EGL | GLESv1_CM | GLESv2);
|
||||||
dso = load_driver(path, cnx, EGL | GLESv1_CM | GLESv2);
|
|
||||||
if (dso) {
|
if (dso) {
|
||||||
hnd = new driver_t(dso);
|
hnd = new driver_t(dso);
|
||||||
} else {
|
} else {
|
||||||
// Always load EGL first
|
// Always load EGL first
|
||||||
snprintf(path, PATH_MAX, format, "EGL", tag);
|
dso = load_driver("EGL", tag, cnx, EGL);
|
||||||
dso = load_driver(path, cnx, EGL);
|
|
||||||
if (dso) {
|
if (dso) {
|
||||||
hnd = new driver_t(dso);
|
hnd = new driver_t(dso);
|
||||||
|
|
||||||
// TODO: make this more automated
|
// TODO: make this more automated
|
||||||
snprintf(path, PATH_MAX, format, "GLESv1_CM", tag);
|
hnd->set( load_driver("GLESv1_CM", tag, cnx, GLESv1_CM), GLESv1_CM );
|
||||||
hnd->set( load_driver(path, cnx, GLESv1_CM), GLESv1_CM );
|
|
||||||
|
|
||||||
snprintf(path, PATH_MAX, format, "GLESv2", tag);
|
hnd->set( load_driver("GLESv2", tag, cnx, GLESv2), GLESv2 );
|
||||||
hnd->set( load_driver(path, cnx, GLESv2), GLESv2 );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,12 +216,20 @@ void Loader::init_api(void* dso,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void *Loader::load_driver(const char* driver_absolute_path,
|
void *Loader::load_driver(const char* kind, const char *tag,
|
||||||
egl_connection_t* cnx, uint32_t mask)
|
egl_connection_t* cnx, uint32_t mask)
|
||||||
{
|
{
|
||||||
|
char driver_absolute_path[PATH_MAX];
|
||||||
|
const char* const search1 = "/vendor/lib/egl/lib%s_%s.so";
|
||||||
|
const char* const search2 = "/system/lib/egl/lib%s_%s.so";
|
||||||
|
|
||||||
|
snprintf(driver_absolute_path, PATH_MAX, search1, kind, tag);
|
||||||
if (access(driver_absolute_path, R_OK)) {
|
if (access(driver_absolute_path, R_OK)) {
|
||||||
// this happens often, we don't want to log an error
|
snprintf(driver_absolute_path, PATH_MAX, search2, kind, tag);
|
||||||
return 0;
|
if (access(driver_absolute_path, R_OK)) {
|
||||||
|
// this happens often, we don't want to log an error
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void* dso = dlopen(driver_absolute_path, RTLD_NOW | RTLD_LOCAL);
|
void* dso = dlopen(driver_absolute_path, RTLD_NOW | RTLD_LOCAL);
|
||||||
|
@ -74,7 +74,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Loader();
|
Loader();
|
||||||
void *load_driver(const char* driver, egl_connection_t* cnx, uint32_t mask);
|
void *load_driver(const char* kind, const char *tag, egl_connection_t* cnx, uint32_t mask);
|
||||||
|
|
||||||
static __attribute__((noinline))
|
static __attribute__((noinline))
|
||||||
void init_api(void* dso,
|
void init_api(void* dso,
|
||||||
|
Loading…
Reference in New Issue
Block a user