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

Commit 6c5e8837 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Avoid double initialization of ANGLE platform." into main am:...

Merge "Avoid double initialization of ANGLE platform." into main am: 940e127e am: 540b30ab am: 3b5b21eb

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2815886



Change-Id: I3e97b1a435c02d192d0bbb4a825b52a8e0b96b0c
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents eb3ccd6f 3b5b21eb
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -613,8 +613,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];