GraphicsEnv.cpp revision 7a8d83ef77b31097cbccfc89ee93414b3f2c2d03
190b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall/*
290b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall * Copyright 2017 The Android Open Source Project
390b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall *
490b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall * Licensed under the Apache License, Version 2.0 (the "License");
590b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall * you may not use this file except in compliance with the License.
690b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall * You may obtain a copy of the License at
790b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall *
890b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall *      http://www.apache.org/licenses/LICENSE-2.0
990b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall *
1090b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall * Unless required by applicable law or agreed to in writing, software
1190b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall * distributed under the License is distributed on an "AS IS" BASIS,
1290b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1390b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall * See the License for the specific language governing permissions and
1490b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall * limitations under the License.
1590b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall */
1690b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall
1790b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall//#define LOG_NDEBUG 1
1890b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall#define LOG_TAG "GraphicsEnv"
1990b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall#include <gui/GraphicsEnv.h>
2090b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall
2153457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall#include <mutex>
2253457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall
2390b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall#include <log/log.h>
2453457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall#include <nativeloader/dlext_namespaces.h>
2590b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall
2690b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hallnamespace android {
2790b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall
2890b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall/*static*/ GraphicsEnv& GraphicsEnv::getInstance() {
2990b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    static GraphicsEnv env;
3090b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    return env;
3190b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall}
3290b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall
3390b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hallvoid GraphicsEnv::setDriverPath(const std::string path) {
3490b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    if (!mDriverPath.empty()) {
3590b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall        ALOGV("ignoring attempt to change driver path from '%s' to '%s'",
3690b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall                mDriverPath.c_str(), path.c_str());
3790b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall        return;
3890b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    }
3990b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    ALOGV("setting driver path to '%s'", path.c_str());
4090b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    mDriverPath = path;
4190b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall}
4290b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall
4353457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hallandroid_namespace_t* GraphicsEnv::getDriverNamespace() {
4453457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall    static std::once_flag once;
4553457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall    std::call_once(once, [this]() {
4653457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        // TODO; In the next version of Android, all graphics drivers will be
4753457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        // loaded into a custom namespace. To minimize risk for this release,
4853457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        // only updated drivers use a custom namespace.
4953457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        //
5053457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        // Additionally, the custom namespace will be
5153457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        // ANDROID_NAMESPACE_TYPE_ISOLATED, and will only have access to a
5253457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        // subset of the system.
5353457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        if (mDriverPath.empty())
5453457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall            return;
5553457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall
5653457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        char defaultPath[PATH_MAX];
5753457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        android_get_LD_LIBRARY_PATH(defaultPath, sizeof(defaultPath));
5853457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        size_t defaultPathLen = strlen(defaultPath);
5953457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall
6053457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        std::string path;
6153457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        path.reserve(mDriverPath.size() + 1 + defaultPathLen);
6253457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        path.append(mDriverPath);
6353457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        path.push_back(':');
6453457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        path.append(defaultPath, defaultPathLen);
6553457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall
6653457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        mDriverNamespace = android_create_namespace(
6753457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall                "gfx driver",
6853457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall                nullptr,                    // ld_library_path
6953457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall                path.c_str(),               // default_library_path
7053457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall                ANDROID_NAMESPACE_TYPE_SHARED,
7153457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall                nullptr,                    // permitted_when_isolated_path
7253457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall                nullptr);                   // parent
7353457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall    });
7453457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall    return mDriverNamespace;
7553457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall}
7653457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall
7790b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall} // namespace android
787a8d83ef77b31097cbccfc89ee93414b3f2c2d03Jesse Hall
797a8d83ef77b31097cbccfc89ee93414b3f2c2d03Jesse Hallextern "C" android_namespace_t* android_getDriverNamespace() {
807a8d83ef77b31097cbccfc89ee93414b3f2c2d03Jesse Hall    return android::GraphicsEnv::getInstance().getDriverNamespace();
817a8d83ef77b31097cbccfc89ee93414b3f2c2d03Jesse Hall}
82