Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 181e5ea8 authored by Brian Swetland's avatar Brian Swetland Committed by Android (Google) Code Review
Browse files

Merge "support loading EGL libraries from /vendor/lib/egl as well as...

Merge "support loading EGL libraries from /vendor/lib/egl as well as /system/lib/egl" into gingerbread
parents 8544560c a21c2009
Loading
Loading
Loading
Loading
+15 −13
Original line number Diff line number Diff line
@@ -136,30 +136,24 @@ void* Loader::open(EGLNativeDisplayType display, int impl, egl_connection_t* cnx
     */
    
    void* dso;
    char path[PATH_MAX];
    int index = int(display);
    driver_t* hnd = 0;
    const char* const format = "/system/lib/egl/lib%s_%s.so";
    
    char const* tag = getTag(index, impl);
    if (tag) {
        snprintf(path, PATH_MAX, format, "GLES", tag);
        dso = load_driver(path, cnx, EGL | GLESv1_CM | GLESv2);
        dso = load_driver("GLES", tag, cnx, EGL | GLESv1_CM | GLESv2);
        if (dso) {
            hnd = new driver_t(dso);
        } else {
            // Always load EGL first
            snprintf(path, PATH_MAX, format, "EGL", tag);
            dso = load_driver(path, cnx, EGL);
            dso = load_driver("EGL", tag, cnx, EGL);
            if (dso) {
                hnd = new driver_t(dso);

                // TODO: make this more automated
                snprintf(path, PATH_MAX, format, "GLESv1_CM", tag);
                hnd->set( load_driver(path, cnx, GLESv1_CM), GLESv1_CM );
                hnd->set( load_driver("GLESv1_CM", tag, cnx, GLESv1_CM), GLESv1_CM );

                snprintf(path, PATH_MAX, format, "GLESv2", tag);
                hnd->set( load_driver(path, cnx, GLESv2), GLESv2 );
                hnd->set( load_driver("GLESv2", tag, cnx, GLESv2), GLESv2 );
            }
        }
    }
@@ -222,13 +216,21 @@ 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)
{
    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)) {
        snprintf(driver_absolute_path, PATH_MAX, search2, kind, tag);
        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);
    if (dso == 0) {
+1 −1
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ public:
    
private:
    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))
    void init_api(void* dso,