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