diff options
| -rw-r--r-- | libs/graphicsenv/GraphicsEnv.cpp | 74 | ||||
| -rw-r--r-- | libs/graphicsenv/include/graphicsenv/GraphicsEnv.h | 76 | ||||
| -rw-r--r-- | opengl/libs/EGL/Loader.cpp | 23 | ||||
| -rw-r--r-- | opengl/libs/EGL/Loader.h | 2 | ||||
| -rw-r--r-- | opengl/libs/EGL/egl_display.cpp | 6 | ||||
| -rw-r--r-- | opengl/libs/EGL/egl_object.cpp | 2 | ||||
| -rw-r--r-- | opengl/libs/EGL/egl_platform_entries.cpp | 16 | ||||
| -rw-r--r-- | opengl/libs/EGL/egldefs.h | 5 |
8 files changed, 96 insertions, 108 deletions
diff --git a/libs/graphicsenv/GraphicsEnv.cpp b/libs/graphicsenv/GraphicsEnv.cpp index 16315ed858..1a638c1e5b 100644 --- a/libs/graphicsenv/GraphicsEnv.cpp +++ b/libs/graphicsenv/GraphicsEnv.cpp @@ -160,8 +160,8 @@ bool GraphicsEnv::isDebuggable() { return appDebuggable || platformDebuggable; } -void GraphicsEnv::setDriverPathAndSphalLibraries(const std::string path, - const std::string sphalLibraries) { +void GraphicsEnv::setDriverPathAndSphalLibraries(const std::string& path, + const std::string& sphalLibraries) { if (!mDriverPath.empty() || !mSphalLibraries.empty()) { ALOGV("ignoring attempt to change driver path from '%s' to '%s' or change sphal libraries " "from '%s' to '%s'", @@ -410,55 +410,24 @@ bool GraphicsEnv::setInjectLayersPrSetDumpable() { return true; } -void* GraphicsEnv::loadLibrary(std::string name) { - const android_dlextinfo dlextinfo = { - .flags = ANDROID_DLEXT_USE_NAMESPACE, - .library_namespace = getAngleNamespace(), - }; - - std::string libName = std::string("lib") + name + "_angle.so"; - - void* so = android_dlopen_ext(libName.c_str(), RTLD_LOCAL | RTLD_NOW, &dlextinfo); - - if (so) { - ALOGD("dlopen_ext from APK (%s) success at %p", libName.c_str(), so); - return so; - } else { - ALOGE("dlopen_ext(\"%s\") failed: %s", libName.c_str(), dlerror()); - } - - return nullptr; -} - -bool GraphicsEnv::shouldUseAngle(std::string appName) { - if (appName != mAngleAppName) { - // Make sure we are checking the app we were init'ed for - ALOGE("App name does not match: expected '%s', got '%s'", mAngleAppName.c_str(), - appName.c_str()); - return false; - } - - return shouldUseAngle(); -} - bool GraphicsEnv::shouldUseAngle() { // Make sure we are init'ed - if (mAngleAppName.empty()) { - ALOGV("App name is empty. setAngleInfo() has not been called to enable ANGLE."); + if (mPackageName.empty()) { + ALOGV("Package name is empty. setAngleInfo() has not been called to enable ANGLE."); return false; } - return (mUseAngle == YES) ? true : false; + return (mShouldUseAngle == YES) ? true : false; } -void GraphicsEnv::updateUseAngle() { +void GraphicsEnv::updateShouldUseAngle() { const char* ANGLE_PREFER_ANGLE = "angle"; const char* ANGLE_PREFER_NATIVE = "native"; - mUseAngle = NO; + mShouldUseAngle = NO; if (mAngleDeveloperOptIn == ANGLE_PREFER_ANGLE) { ALOGV("User set \"Developer Options\" to force the use of ANGLE"); - mUseAngle = YES; + mShouldUseAngle = YES; } else if (mAngleDeveloperOptIn == ANGLE_PREFER_NATIVE) { ALOGV("User set \"Developer Options\" to force the use of Native"); } else { @@ -466,13 +435,13 @@ void GraphicsEnv::updateUseAngle() { } } -void GraphicsEnv::setAngleInfo(const std::string path, const std::string appName, - const std::string developerOptIn, +void GraphicsEnv::setAngleInfo(const std::string& path, const std::string& packageName, + const std::string& developerOptIn, const std::vector<std::string> eglFeatures) { - if (mUseAngle != UNKNOWN) { + if (mShouldUseAngle != UNKNOWN) { // We've already figured out an answer for this app, so just return. - ALOGV("Already evaluated the rules file for '%s': use ANGLE = %s", appName.c_str(), - (mUseAngle == YES) ? "true" : "false"); + ALOGV("Already evaluated the rules file for '%s': use ANGLE = %s", packageName.c_str(), + (mShouldUseAngle == YES) ? "true" : "false"); return; } @@ -480,16 +449,17 @@ void GraphicsEnv::setAngleInfo(const std::string path, const std::string appName ALOGV("setting ANGLE path to '%s'", path.c_str()); mAnglePath = path; - ALOGV("setting ANGLE app name to '%s'", appName.c_str()); - mAngleAppName = appName; + ALOGV("setting app package name to '%s'", packageName.c_str()); + mPackageName = packageName; ALOGV("setting ANGLE application opt-in to '%s'", developerOptIn.c_str()); mAngleDeveloperOptIn = developerOptIn; // Update the current status of whether we should use ANGLE or not - updateUseAngle(); + updateShouldUseAngle(); } -void GraphicsEnv::setLayerPaths(NativeLoaderNamespace* appNamespace, const std::string layerPaths) { +void GraphicsEnv::setLayerPaths(NativeLoaderNamespace* appNamespace, + const std::string& layerPaths) { if (mLayerPaths.empty()) { mLayerPaths = layerPaths; mAppNamespace = appNamespace; @@ -503,8 +473,8 @@ NativeLoaderNamespace* GraphicsEnv::getAppNamespace() { return mAppNamespace; } -std::string& GraphicsEnv::getAngleAppName() { - return mAngleAppName; +std::string& GraphicsEnv::getPackageName() { + return mPackageName; } const std::vector<std::string>& GraphicsEnv::getAngleEglFeatures() { @@ -523,11 +493,11 @@ const std::string& GraphicsEnv::getDebugLayersGLES() { return mDebugLayersGLES; } -void GraphicsEnv::setDebugLayers(const std::string layers) { +void GraphicsEnv::setDebugLayers(const std::string& layers) { mDebugLayers = layers; } -void GraphicsEnv::setDebugLayersGLES(const std::string layers) { +void GraphicsEnv::setDebugLayersGLES(const std::string& layers) { mDebugLayersGLES = layers; } diff --git a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h index f9b234a047..a1b5e50c93 100644 --- a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h +++ b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h @@ -55,7 +55,7 @@ public: // Also set additional required sphal libraries to the linker for loading // graphics drivers. The string is a list of libraries separated by ':', // which is required by android_link_namespaces. - void setDriverPathAndSphalLibraries(const std::string path, const std::string sphalLibraries); + void setDriverPathAndSphalLibraries(const std::string& path, const std::string& sphalLibraries); // Get the updatable driver namespace. android_namespace_t* getDriverNamespace(); std::string getDriverPath() const; @@ -96,8 +96,6 @@ public: /* * Apis for ANGLE */ - // Check if the requested app should use ANGLE. - bool shouldUseAngle(std::string appName); // Check if this app process should use ANGLE. bool shouldUseAngle(); // Set a search path for loading ANGLE libraries. The path is a list of @@ -105,42 +103,39 @@ 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 std::string appName, std::string devOptIn, - const std::vector<std::string> eglFeatures); + void setAngleInfo(const std::string& path, const std::string& packageName, + const std::string& devOptIn, const std::vector<std::string> eglFeatures); // Get the ANGLE driver namespace. android_namespace_t* getAngleNamespace(); - // Get the app name for ANGLE debug message. - std::string& getAngleAppName(); - + // Get the app package name. + std::string& getPackageName(); const std::vector<std::string>& getAngleEglFeatures(); + // Set the persist.graphics.egl system property value. + void nativeToggleAngleAsSystemDriver(bool enabled); /* * Apis for debug layer */ // Set additional layer search paths. - void setLayerPaths(NativeLoaderNamespace* appNamespace, const std::string layerPaths); + void setLayerPaths(NativeLoaderNamespace* appNamespace, const std::string& layerPaths); // Get the app namespace for loading layers. NativeLoaderNamespace* getAppNamespace(); // Get additional layer search paths. const std::string& getLayerPaths(); // Set the Vulkan debug layers. - void setDebugLayers(const std::string layers); + void setDebugLayers(const std::string& layers); // Set the GL debug layers. - void setDebugLayersGLES(const std::string layers); + void setDebugLayersGLES(const std::string& layers); // Get the debug layers to load. const std::string& getDebugLayers(); // Get the debug layers to load. const std::string& getDebugLayersGLES(); - // Set the persist.graphics.egl system property value. - void nativeToggleAngleAsSystemDriver(bool enabled); private: enum UseAngle { UNKNOWN, YES, NO }; - // Load requested ANGLE library. - void* loadLibrary(std::string name); // Update whether ANGLE should be used. - void updateUseAngle(); + void updateShouldUseAngle(); // Link updatable driver namespace with llndk and vndk-sp libs. bool linkDriverNamespaceLocked(android_namespace_t* vndkNamespace); // Check whether this process is ready to send stats. @@ -149,39 +144,56 @@ private: void sendGpuStatsLocked(GpuStatsInfo::Api api, bool isDriverLoaded, int64_t driverLoadingTime); GraphicsEnv() = default; + + // This mutex protects the namespace creation. + std::mutex mNamespaceMutex; + + /** + * Updatable driver variables. + */ // Path to updatable driver libs. std::string mDriverPath; // Path to additional sphal libs linked to updatable driver namespace. std::string mSphalLibraries; - // This mutex protects mGpuStats and get gpuservice call. - std::mutex mStatsLock; - // Cache the activity launch info - bool mActivityLaunched = false; - // Information bookkept for GpuStats. - GpuStatsInfo mGpuStats; + // Updatable driver namespace. + android_namespace_t* mDriverNamespace = nullptr; + + /** + * ANGLE variables. + */ // Path to ANGLE libs. std::string mAnglePath; - // This App's name. - std::string mAngleAppName; + // App's package name. + std::string mPackageName; // ANGLE developer opt in status. std::string mAngleDeveloperOptIn; // ANGLE EGL features; std::vector<std::string> mAngleEglFeatures; // Use ANGLE flag. - UseAngle mUseAngle = UNKNOWN; + UseAngle mShouldUseAngle = UNKNOWN; + // ANGLE namespace. + android_namespace_t* mAngleNamespace = nullptr; + + /** + * GPU metrics. + */ + // This mutex protects mGpuStats and get gpuservice call. + std::mutex mStatsLock; + // Cache the activity launch info + bool mActivityLaunched = false; + // Information bookkept for GpuStats. + GpuStatsInfo mGpuStats; + + /** + * Debug layers. + */ // Vulkan debug layers libs. std::string mDebugLayers; // GL debug layers libs. std::string mDebugLayersGLES; // Additional debug layers search path. std::string mLayerPaths; - // This mutex protects the namespace creation. - std::mutex mNamespaceMutex; - // Updatable driver namespace. - android_namespace_t* mDriverNamespace = nullptr; - // ANGLE namespace. - android_namespace_t* mAngleNamespace = nullptr; - // This App's namespace. + // This App's namespace to open native libraries. NativeLoaderNamespace* mAppNamespace = nullptr; }; diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp index bb3b43abb5..b4fc5f0dd2 100644 --- a/opengl/libs/EGL/Loader.cpp +++ b/opengl/libs/EGL/Loader.cpp @@ -147,13 +147,18 @@ static const char* HAL_SUBNAME_KEY_PROPERTIES[3] = { RO_BOARD_PLATFORM_PROPERTY, }; +// Check whether the loaded system drivers should be unloaded in order to +// load ANGLE or the updatable graphics drivers. +// If ANGLE namespace is set, it means the application is identified to run on top of ANGLE. +// If updatable graphics driver namespace is set, it means the application is identified to +// run on top of updatable graphics drivers. static bool should_unload_system_driver(egl_connection_t* cnx) { // Return false if the system driver has been unloaded once. if (cnx->systemDriverUnloaded) { return false; } - // Return true if Angle namespace is set. + // Return true if ANGLE namespace is set. android_namespace_t* ns = android::GraphicsEnv::getInstance().getAngleNamespace(); if (ns) { return true; @@ -279,10 +284,10 @@ void* Loader::open(egl_connection_t* cnx) false, systemTime() - openTime); } else { // init_angle_backend will check if loaded driver is ANGLE or not, - // will set cnx->useAngle appropriately. + // will set cnx->angleLoaded appropriately. // Do this here so that we use ANGLE path when driver is ANGLE (e.g. loaded as native), // not just loading ANGLE as option. - init_angle_backend(hnd->dso[2], cnx); + attempt_to_init_angle_backend(hnd->dso[2], cnx); } LOG_ALWAYS_FATAL_IF(!hnd, @@ -324,7 +329,7 @@ void Loader::close(egl_connection_t* cnx) delete hnd; cnx->dso = nullptr; - cnx->useAngle = false; + cnx->angleLoaded = false; } void Loader::init_api(void* dso, @@ -565,14 +570,14 @@ Loader::driver_t* Loader::attempt_to_load_angle(egl_connection_t* cnx) { return hnd; } -void Loader::init_angle_backend(void* dso, egl_connection_t* cnx) { +void Loader::attempt_to_init_angle_backend(void* dso, egl_connection_t* cnx) { void* pANGLEGetDisplayPlatform = dlsym(dso, "ANGLEGetDisplayPlatform"); if (pANGLEGetDisplayPlatform) { - ALOGV("ANGLE GLES library in use"); - cnx->useAngle = true; + ALOGV("ANGLE GLES library loaded"); + cnx->angleLoaded = true; } else { - ALOGV("Native GLES library in use"); - cnx->useAngle = false; + ALOGV("Native GLES library loaded"); + cnx->angleLoaded = false; } } diff --git a/opengl/libs/EGL/Loader.h b/opengl/libs/EGL/Loader.h index 81742ab9ae..cadbd4639b 100644 --- a/opengl/libs/EGL/Loader.h +++ b/opengl/libs/EGL/Loader.h @@ -57,7 +57,7 @@ private: driver_t* attempt_to_load_system_driver(egl_connection_t* cnx, const char* suffix, const bool exact); void unload_system_driver(egl_connection_t* cnx); void initialize_api(void* dso, egl_connection_t* cnx, uint32_t mask); - void init_angle_backend(void* dso, egl_connection_t* cnx); + void attempt_to_init_angle_backend(void* dso, egl_connection_t* cnx); static __attribute__((noinline)) void init_api(void* dso, const char* const* api, const char* const* ref_api, diff --git a/opengl/libs/EGL/egl_display.cpp b/opengl/libs/EGL/egl_display.cpp index 525fed115d..3317347066 100644 --- a/opengl/libs/EGL/egl_display.cpp +++ b/opengl/libs/EGL/egl_display.cpp @@ -191,7 +191,7 @@ EGLDisplay egl_display_t::getPlatformDisplay(EGLNativeDisplayType display, if (cnx->dso) { EGLDisplay dpy = EGL_NO_DISPLAY; - if (cnx->useAngle) { + if (cnx->angleLoaded) { EGLint error; dpy = getPlatformDisplayAngle(display, cnx, attrib_list, &error); if (error != EGL_NONE) { @@ -324,7 +324,7 @@ EGLBoolean egl_display_t::initialize(EGLint* major, EGLint* minor) { // b/269060366 Conditionally enabled EGL_ANDROID_get_frame_timestamps extension if the // device's present timestamps are reliable (which may not be the case on emulators). - if (cnx->useAngle) { + if (cnx->angleLoaded) { if (android::base::GetBoolProperty("service.sf.present_timestamp", false)) { mExtensionString.append("EGL_ANDROID_get_frame_timestamps "); } @@ -432,7 +432,7 @@ EGLBoolean egl_display_t::terminate() { egl_connection_t* const cnx = &gEGLImpl; if (cnx->dso && disp.state == egl_display_t::INITIALIZED) { // If we're using ANGLE reset any custom DisplayPlatform - if (cnx->useAngle) { + if (cnx->angleLoaded) { angle::resetAnglePlatform(disp.dpy); } if (cnx->egl.eglTerminate(disp.dpy) == EGL_FALSE) { diff --git a/opengl/libs/EGL/egl_object.cpp b/opengl/libs/EGL/egl_object.cpp index efbe613542..33a77c4470 100644 --- a/opengl/libs/EGL/egl_object.cpp +++ b/opengl/libs/EGL/egl_object.cpp @@ -84,7 +84,7 @@ void egl_surface_t::disconnect() { if (win != nullptr && connected) { // NOTE: When using Vulkan backend, the Vulkan runtime makes all the // native_window_* calls, so don't do them here. - if (!cnx->useAngle) { + if (!cnx->angleLoaded) { native_window_set_buffers_format(win, 0); if (native_window_api_disconnect(win, NATIVE_WINDOW_API_EGL)) { ALOGW("EGLNativeWindowType %p disconnect failed", win); diff --git a/opengl/libs/EGL/egl_platform_entries.cpp b/opengl/libs/EGL/egl_platform_entries.cpp index aefa1f0db5..440eb17873 100644 --- a/opengl/libs/EGL/egl_platform_entries.cpp +++ b/opengl/libs/EGL/egl_platform_entries.cpp @@ -685,7 +685,7 @@ EGLSurface eglCreateWindowSurfaceTmpl(egl_display_t* dp, egl_connection_t* cnx, // NOTE: When using Vulkan backend, the Vulkan runtime makes all the // native_window_* calls, so don't do them here. - if (!cnx->useAngle) { + if (!cnx->angleLoaded) { int result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL); if (result < 0) { ALOGE("eglCreateWindowSurface: native_window_api_connect (win=%p) " @@ -704,14 +704,14 @@ EGLSurface eglCreateWindowSurfaceTmpl(egl_display_t* dp, egl_connection_t* cnx, std::vector<AttrType> strippedAttribList; if (!processAttributes<AttrType>(dp, window, attrib_list, &colorSpace, &strippedAttribList)) { ALOGE("error invalid colorspace: %d", colorSpace); - if (!cnx->useAngle) { + if (!cnx->angleLoaded) { native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL); } return EGL_NO_SURFACE; } attrib_list = strippedAttribList.data(); - if (!cnx->useAngle) { + if (!cnx->angleLoaded) { int err = native_window_set_buffers_format(window, static_cast<int>(format)); if (err != 0) { ALOGE("error setting native window pixel format: %s (%d)", strerror(-err), err); @@ -743,7 +743,7 @@ EGLSurface eglCreateWindowSurfaceTmpl(egl_display_t* dp, egl_connection_t* cnx, } // EGLSurface creation failed - if (!cnx->useAngle) { + if (!cnx->angleLoaded) { native_window_set_buffers_format(window, 0); native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL); } @@ -1354,7 +1354,7 @@ EGLBoolean eglSwapBuffersWithDamageKHRImpl(EGLDisplay dpy, EGLSurface draw, EGLi } } - if (!s->cnx->useAngle) { + if (!s->cnx->angleLoaded) { if (!sendSurfaceMetadata(s)) { native_window_api_disconnect(s->getNativeWindow(), NATIVE_WINDOW_API_EGL); return setError(EGL_BAD_NATIVE_WINDOW, (EGLBoolean)EGL_FALSE); @@ -1379,7 +1379,7 @@ EGLBoolean eglSwapBuffersWithDamageKHRImpl(EGLDisplay dpy, EGLSurface draw, EGLi androidRect.bottom = y; androidRects.push_back(androidRect); } - if (!s->cnx->useAngle) { + if (!s->cnx->angleLoaded) { native_window_set_surface_damage(s->getNativeWindow(), androidRects.data(), androidRects.size()); } @@ -1470,7 +1470,7 @@ EGLBoolean eglSurfaceAttribImpl(EGLDisplay dpy, EGLSurface surface, EGLint attri int err = native_window_set_auto_refresh(s->getNativeWindow(), value != 0); if (err != 0) { return setError(EGL_BAD_SURFACE, (EGLBoolean)EGL_FALSE); - } else if (!s->cnx->useAngle) { + } else if (!s->cnx->angleLoaded) { return EGL_TRUE; } // else if ANGLE, fall through to the call to the driver (i.e. ANGLE) below } @@ -1484,7 +1484,7 @@ EGLBoolean eglSurfaceAttribImpl(EGLDisplay dpy, EGLSurface surface, EGLint attri int err = native_window_enable_frame_timestamps(s->getNativeWindow(), value != 0); if (err != 0) { return setError(EGL_BAD_SURFACE, (EGLBoolean)EGL_FALSE); - } else if (!s->cnx->useAngle) { + } else if (!s->cnx->angleLoaded) { return EGL_TRUE; } // else if ANGLE, fall through to the call to the driver (i.e. ANGLE) below } diff --git a/opengl/libs/EGL/egldefs.h b/opengl/libs/EGL/egldefs.h index fcc11f1b55..3bd37cb399 100644 --- a/opengl/libs/EGL/egldefs.h +++ b/opengl/libs/EGL/egldefs.h @@ -41,7 +41,8 @@ struct egl_connection_t { libEgl(nullptr), libGles1(nullptr), libGles2(nullptr), - systemDriverUnloaded(false) { + systemDriverUnloaded(false), + angleLoaded(false) { const char* const* entries = platform_names; EGLFuncPointer* curr = reinterpret_cast<EGLFuncPointer*>(&platform); while (*entries) { @@ -73,7 +74,7 @@ struct egl_connection_t { void* libGles2; bool systemDriverUnloaded; - bool useAngle; // Was ANGLE successfully loaded + bool angleLoaded; // Was ANGLE successfully loaded }; extern gl_hooks_t gHooks[2]; |