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"
19991d2545afb325a3ebb8679519c4b0c13e29fadaMathias Agopian#include <ui/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
2657de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall// TODO(b/37049319) Get this from a header once one exists
2757de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hallextern "C" {
2857de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall  android_namespace_t* android_get_exported_namespace(const char*);
2957de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall}
3057de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall
3190b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hallnamespace android {
3290b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall
3390b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall/*static*/ GraphicsEnv& GraphicsEnv::getInstance() {
3490b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    static GraphicsEnv env;
3590b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    return env;
3690b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall}
3790b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall
3890b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hallvoid GraphicsEnv::setDriverPath(const std::string path) {
3990b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    if (!mDriverPath.empty()) {
4090b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall        ALOGV("ignoring attempt to change driver path from '%s' to '%s'",
4190b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall                mDriverPath.c_str(), path.c_str());
4290b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall        return;
4390b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    }
4490b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    ALOGV("setting driver path to '%s'", path.c_str());
4590b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall    mDriverPath = path;
4690b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall}
4790b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall
4853457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hallandroid_namespace_t* GraphicsEnv::getDriverNamespace() {
4953457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall    static std::once_flag once;
5053457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall    std::call_once(once, [this]() {
5153457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall        if (mDriverPath.empty())
5253457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall            return;
5357de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall        // If the sphal namespace isn't configured for a device, don't support updatable drivers.
5457de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall        // We need a parent namespace to inherit the default search path from.
5557de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall        auto sphalNamespace = android_get_exported_namespace("sphal");
5657de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall        if (!sphalNamespace) return;
5757de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall        mDriverNamespace = android_create_namespace("gfx driver",
5857de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall                                                    nullptr,             // ld_library_path
5957de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall                                                    mDriverPath.c_str(), // default_library_path
6057de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall                                                    ANDROID_NAMESPACE_TYPE_SHARED |
6157de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall                                                            ANDROID_NAMESPACE_TYPE_ISOLATED,
6257de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall                                                    nullptr, // permitted_when_isolated_path
6357de0ff6270835f3470e0420fcd1835146a2beb0Jesse Hall                                                    sphalNamespace);
6453457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall    });
6553457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall    return mDriverNamespace;
6653457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall}
6753457dbae92cb6fb12fac06cf0e874ff3c49528dJesse Hall
6890b25ed559f3d04777dbbc195ad5c95287990bf7Jesse Hall} // namespace android
697a8d83ef77b31097cbccfc89ee93414b3f2c2d03Jesse Hall
707a8d83ef77b31097cbccfc89ee93414b3f2c2d03Jesse Hallextern "C" android_namespace_t* android_getDriverNamespace() {
717a8d83ef77b31097cbccfc89ee93414b3f2c2d03Jesse Hall    return android::GraphicsEnv::getInstance().getDriverNamespace();
727a8d83ef77b31097cbccfc89ee93414b3f2c2d03Jesse Hall}
73