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