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

Commit a7733136 authored by Yiwei Zhang's avatar Yiwei Zhang
Browse files

OpenGL: fix initializeAnglePlatform with built-in ANGLE driver

When ANGLE namespace doesn't exist and initializeAnglePlatform is
called, ANGLE driver is loaded as built-in gl driver in sphal namespace.
This change fixes the fallback path here.

Bug: 154237217
Test: atest CtsAngleIntegrationHostTestCases
Change-Id: I0e4ecf65fac0d91b5542d475439e1e6f9541b629
Merged-In: I0e4ecf65fac0d91b5542d475439e1e6f9541b629
parent 4aec9746
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -29,9 +29,13 @@
#include <graphicsenv/GraphicsEnv.h>
#include <time.h>
#include <log/log.h>
#include <vndksupport/linker.h>

namespace angle {

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

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

@@ -101,11 +105,22 @@ static void assignAnglePlatformMethods(PlatformMethods* platformMethods) {
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,
        };
    void* so = android_dlopen_ext("libGLESv2_angle.so", RTLD_LOCAL | RTLD_NOW, &dlextinfo);
        so = android_dlopen_ext(kAngleEs2Lib, kAngleDlFlags, &dlextinfo);
    } else {
        // If we are here, ANGLE is loaded as built-in gl driver in the sphal.
        so = android_load_sphal_library(kAngleEs2Lib, kAngleDlFlags);
    }
    if (!so) {
        ALOGE("%s failed to dlopen %s!", __FUNCTION__, kAngleEs2Lib);
        return false;
    }

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