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

Commit 2661b73e authored by Peiyong Lin's avatar Peiyong Lin
Browse files

[Cherry-pick] Load native GLES driver when specified.

Since ANGLE and native GLES drivers can coexist, when native is
specified, the loader must load the native GLES drivers specified in
ro.hardware.egl. This patch adds the support to load native GLES drivers
when specified.

Bug: b/283858001
Test: atest CtsAngleDeveloperOptionHostTest -c with ANGLE being default
Test: atest CtsAngleDeveloperOptionHostTest -c with native being default
Change-Id: I85840811d9586bd9f2765b47f3cd1a94c9a8580a
Merged-In: I85840811d9586bd9f2765b47f3cd1a94c9a8580a
parent c699f8ff
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -420,7 +420,11 @@ bool GraphicsEnv::shouldUseAngle() {
    return mShouldUseAngle;
}

void GraphicsEnv::setAngleInfo(const std::string& path, const bool shouldUseSystemAngle,
// Set ANGLE information.
// If path is "system", it means system ANGLE must be used for the process.
// If shouldUseNativeDriver is true, it means native GLES drivers must be used for the process.
// If path is set to nonempty and shouldUseNativeDriver is true, ANGLE will be used regardless.
void GraphicsEnv::setAngleInfo(const std::string& path, const bool shouldUseNativeDriver,
                               const std::string& packageName,
                               const std::vector<std::string> eglFeatures) {
    if (mShouldUseAngle) {
@@ -437,8 +441,13 @@ void GraphicsEnv::setAngleInfo(const std::string& path, const bool shouldUseSyst
    mAnglePath = std::move(path);
    ALOGV("setting app package name to '%s'", packageName.c_str());
    mPackageName = std::move(packageName);
    if (path == "system") {
        mShouldUseSystemAngle = true;
    }
    if (!path.empty()) {
        mShouldUseAngle = true;
    mShouldUseSystemAngle = shouldUseSystemAngle;
    }
    mShouldUseNativeDriver = shouldUseNativeDriver;
}

void GraphicsEnv::setLayerPaths(NativeLoaderNamespace* appNamespace,
@@ -564,7 +573,7 @@ android_namespace_t* GraphicsEnv::getDriverNamespace() {
        return nullptr;
    }

    mDriverNamespace = android_create_namespace("gfx driver",
    mDriverNamespace = android_create_namespace("updatable gfx driver",
                                                mDriverPath.c_str(), // ld_library_path
                                                mDriverPath.c_str(), // default_library_path
                                                ANDROID_NAMESPACE_TYPE_ISOLATED,
@@ -648,4 +657,8 @@ bool GraphicsEnv::shouldUseSystemAngle() {
    return mShouldUseSystemAngle;
}

bool GraphicsEnv::shouldUseNativeDriver() {
    return mShouldUseNativeDriver;
}

} // namespace android
+7 −1
Original line number Diff line number Diff line
@@ -108,7 +108,10 @@ public:
    // (libraries must be stored uncompressed and page aligned); such elements
    // in the search path must have a '!' after the zip filename, e.g.
    //     /system/app/ANGLEPrebuilt/ANGLEPrebuilt.apk!/lib/arm64-v8a
    void setAngleInfo(const std::string& path, const bool useSystemAngle,
    // If the search patch is "system", then it means the system ANGLE should be used.
    // If shouldUseNativeDriver is true, it means native GLES drivers must be used for the process.
    // If path is set to nonempty and shouldUseNativeDriver is true, ANGLE will be used regardless.
    void setAngleInfo(const std::string& path, const bool shouldUseNativeDriver,
                      const std::string& packageName, const std::vector<std::string> eglFeatures);
    // Get the ANGLE driver namespace.
    android_namespace_t* getAngleNamespace();
@@ -118,6 +121,7 @@ public:
    // Set the persist.graphics.egl system property value.
    void nativeToggleAngleAsSystemDriver(bool enabled);
    bool shouldUseSystemAngle();
    bool shouldUseNativeDriver();

    /*
     * Apis for debug layer
@@ -175,6 +179,8 @@ private:
    bool mShouldUseAngle = false;
    // Whether loader should load system ANGLE.
    bool mShouldUseSystemAngle = false;
    // Whether loader should load native GLES driver.
    bool mShouldUseNativeDriver = false;
    // ANGLE namespace.
    android_namespace_t* mAngleNamespace = nullptr;

+23 −6
Original line number Diff line number Diff line
@@ -169,6 +169,11 @@ static bool should_unload_system_driver(egl_connection_t* cnx) {
        }
    }

    // Return true if native GLES drivers should be used and ANGLE is already loaded.
    if (android::GraphicsEnv::getInstance().shouldUseNativeDriver() && cnx->angleLoaded) {
        return true;
    }

    // Return true if updated driver namespace is set.
    ns = android::GraphicsEnv::getInstance().getDriverNamespace();
    if (ns) {
@@ -240,16 +245,28 @@ void* Loader::open(egl_connection_t* cnx) {
    if (!hnd) {
        // Secondly, try to load from driver apk.
        hnd = attempt_to_load_updated_driver(cnx);
    }

    bool failToLoadFromDriverSuffixProperty = false;
    if (!hnd) {
        // If updated driver apk is set but fail to load, abort here.
        if (android::GraphicsEnv::getInstance().getDriverNamespace()) {
            LOG_ALWAYS_FATAL("couldn't find an OpenGL ES implementation from %s",
        LOG_ALWAYS_FATAL_IF(android::GraphicsEnv::getInstance().getDriverNamespace(),
                            "couldn't find an OpenGL ES implementation from %s",
                            android::GraphicsEnv::getInstance().getDriverPath().c_str());
    }
        // Finally, try to load system driver.

    // Attempt to load native GLES drivers specified by ro.hardware.egl if native is selected.
    // If native is selected but fail to load, abort.
    if (!hnd && android::GraphicsEnv::getInstance().shouldUseNativeDriver()) {
        auto driverSuffix = base::GetProperty(RO_DRIVER_SUFFIX_PROPERTY, "");
        LOG_ALWAYS_FATAL_IF(driverSuffix.empty(),
                            "Native GLES driver is selected but not specified in %s",
                            RO_DRIVER_SUFFIX_PROPERTY);
        hnd = attempt_to_load_system_driver(cnx, driverSuffix.c_str(), true);
        LOG_ALWAYS_FATAL_IF(!hnd, "Native GLES driver is selected but failed to load. %s=%s",
                            RO_DRIVER_SUFFIX_PROPERTY, driverSuffix.c_str());
    }

    // Finally, try to load default driver.
    bool failToLoadFromDriverSuffixProperty = false;
    if (!hnd) {
        // Start by searching for the library name appended by the system
        // properties of the GLES userspace driver in both locations.
        // i.e.: