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

Commit 9fc4cf3f authored by Peiyong Lin's avatar Peiyong Lin
Browse files

Avoid double initialization of ANGLE platform.

Previously when ANGLE libraries were loaded, the loader already
attempted to dlsym the ANGLEGetDisplayPlatform method, but when
EGLDisplay is called everytime, it will always call into open the ANGLE
library again and attempt to dlsym ANGLEGetDisplayPlatform and
ANGLEResetDisplayPlatform, since ANGLE is already opened, the loader
should just dlsym once and bookkeep the results.

Bug: b/236050939
Test: trace no longer shows duplicate display platform call
Change-Id: I8ce2596c3b0968a4a2e9f7651f59d2ad67efbc64
parent aa21941f
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -608,8 +608,10 @@ Loader::driver_t* Loader::attempt_to_load_angle(egl_connection_t* cnx) {
}

void Loader::attempt_to_init_angle_backend(void* dso, egl_connection_t* cnx) {
    void* pANGLEGetDisplayPlatform = dlsym(dso, "ANGLEGetDisplayPlatform");
    if (pANGLEGetDisplayPlatform) {
    cnx->angleGetDisplayPlatformFunc = dlsym(dso, "ANGLEGetDisplayPlatform");
    cnx->angleResetDisplayPlatformFunc = dlsym(dso, "ANGLEResetDisplayPlatform");

    if (cnx->angleGetDisplayPlatformFunc) {
        ALOGV("ANGLE GLES library loaded");
        cnx->angleLoaded = true;
        android::GraphicsEnv::getInstance().setDriverToLoad(android::GpuStatsInfo::Driver::ANGLE);
+9 −44
Original line number Diff line number Diff line
@@ -35,12 +35,6 @@

namespace angle {

constexpr char kAngleEs2Lib[] = "libGLESv2_angle.so";
constexpr int kAngleDlFlags = RTLD_LOCAL | RTLD_NOW;

static GetDisplayPlatformFunc angleGetDisplayPlatform = nullptr;
static ResetDisplayPlatformFunc angleResetDisplayPlatform = nullptr;

static time_t startTime = time(nullptr);

static const unsigned char* getTraceCategoryEnabledFlag(PlatformMethods* /*platform*/,
@@ -111,50 +105,19 @@ static void assignAnglePlatformMethods(PlatformMethods* platformMethods) {
}

// Initialize function ptrs for ANGLE PlatformMethods struct, used for systrace
bool initializeAnglePlatform(EGLDisplay dpy) {
    // Since we're inside libEGL, use dlsym to lookup fptr for ANGLEGetDisplayPlatform
    android_namespace_t* ns = android::GraphicsEnv::getInstance().getAngleNamespace();
    void* so = nullptr;
    if (ns) {
        const android_dlextinfo dlextinfo = {
                .flags = ANDROID_DLEXT_USE_NAMESPACE,
                .library_namespace = ns,
        };
        so = android_dlopen_ext(kAngleEs2Lib, kAngleDlFlags, &dlextinfo);
        if (so) {
            ALOGD("dlopen_ext from APK (%s) success at %p", kAngleEs2Lib, so);
        } else {
            ALOGE("dlopen_ext(\"%s\") failed: %s", kAngleEs2Lib, dlerror());
            return false;
        }
    } else {
        // If we are here, ANGLE is loaded as the default OpenGL ES driver.
        so = dlopen(kAngleEs2Lib, kAngleDlFlags);
        if (so) {
            ALOGD("dlopen (%s) success at %p", kAngleEs2Lib, so);
        } else {
            ALOGE("%s failed to dlopen %s: %s!", __FUNCTION__, kAngleEs2Lib, dlerror());
            return false;
        }
    }

    angleGetDisplayPlatform =
            reinterpret_cast<GetDisplayPlatformFunc>(dlsym(so, "ANGLEGetDisplayPlatform"));

    if (!angleGetDisplayPlatform) {
        ALOGE("dlsym lookup of ANGLEGetDisplayPlatform in libEGL_angle failed!");
        dlclose(so);
bool initializeAnglePlatform(EGLDisplay dpy, android::egl_connection_t* const cnx) {
    if (cnx->angleGetDisplayPlatformFunc == nullptr) {
        ALOGE("ANGLEGetDisplayPlatform is not initialized!");
        return false;
    }

    angleResetDisplayPlatform =
            reinterpret_cast<ResetDisplayPlatformFunc>(dlsym(so, "ANGLEResetDisplayPlatform"));
    GetDisplayPlatformFunc angleGetDisplayPlatform =
            reinterpret_cast<GetDisplayPlatformFunc>(cnx->angleGetDisplayPlatformFunc);

    PlatformMethods* platformMethods = nullptr;
    if (!((angleGetDisplayPlatform)(dpy, g_PlatformMethodNames, g_NumPlatformMethods, nullptr,
                                    &platformMethods))) {
        ALOGE("ANGLEGetDisplayPlatform call failed!");
        dlclose(so);
        return false;
    }
    if (platformMethods) {
@@ -166,8 +129,10 @@ bool initializeAnglePlatform(EGLDisplay dpy) {
    return true;
}

void resetAnglePlatform(EGLDisplay dpy) {
    if (angleResetDisplayPlatform) {
void resetAnglePlatform(EGLDisplay dpy, android::egl_connection_t* const cnx) {
    if (cnx->angleResetDisplayPlatformFunc) {
        ResetDisplayPlatformFunc angleResetDisplayPlatform =
                reinterpret_cast<ResetDisplayPlatformFunc>(cnx->angleResetDisplayPlatformFunc);
        angleResetDisplayPlatform(dpy);
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -25,8 +25,8 @@

namespace angle {

bool initializeAnglePlatform(EGLDisplay dpy);
void resetAnglePlatform(EGLDisplay dpy);
bool initializeAnglePlatform(EGLDisplay dpy, android::egl_connection_t* const cnx);
void resetAnglePlatform(EGLDisplay dpy, android::egl_connection_t* const cnx);

}; // namespace angle

+2 −2
Original line number Diff line number Diff line
@@ -168,7 +168,7 @@ static EGLDisplay getPlatformDisplayAngle(EGLNativeDisplayType display, egl_conn
        if (dpy == EGL_NO_DISPLAY) {
            ALOGE("eglGetPlatformDisplay failed!");
        } else {
            if (!angle::initializeAnglePlatform(dpy)) {
            if (!angle::initializeAnglePlatform(dpy, cnx)) {
                ALOGE("initializeAnglePlatform failed!");
            }
        }
@@ -433,7 +433,7 @@ EGLBoolean egl_display_t::terminate() {
        if (cnx->dso && disp.state == egl_display_t::INITIALIZED) {
            // If we're using ANGLE reset any custom DisplayPlatform
            if (cnx->angleLoaded) {
                angle::resetAnglePlatform(disp.dpy);
                angle::resetAnglePlatform(disp.dpy, cnx);
            }
            if (cnx->egl.eglTerminate(disp.dpy) == EGL_FALSE) {
                ALOGW("eglTerminate(%p) failed (%s)", disp.dpy,
+6 −1
Original line number Diff line number Diff line
@@ -42,7 +42,9 @@ struct egl_connection_t {
            libGles1(nullptr),
            libGles2(nullptr),
            systemDriverUnloaded(false),
            angleLoaded(false) {
            angleLoaded(false),
            angleGetDisplayPlatformFunc(nullptr),
            angleResetDisplayPlatformFunc(nullptr) {
        const char* const* entries = platform_names;
        EGLFuncPointer* curr = reinterpret_cast<EGLFuncPointer*>(&platform);
        while (*entries) {
@@ -75,6 +77,9 @@ struct egl_connection_t {

    bool systemDriverUnloaded;
    bool angleLoaded; // Was ANGLE successfully loaded

    void* angleGetDisplayPlatformFunc;
    void* angleResetDisplayPlatformFunc;
};

extern gl_hooks_t gHooks[2];