diff options
-rw-r--r-- | core/java/android/app/ActivityThread.java | 5 | ||||
-rw-r--r-- | core/java/android/os/GraphicsEnvironment.java | 20 | ||||
-rw-r--r-- | core/jni/android_view_ThreadedRenderer.cpp | 5 | ||||
-rw-r--r-- | graphics/java/android/graphics/HardwareRenderer.java | 12 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 8 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderThread.cpp | 15 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderThread.h | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/VulkanManager.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/VulkanManager.h | 2 |
10 files changed, 46 insertions, 27 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index cc419b8d837a..790863713b19 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -3229,8 +3229,9 @@ public final class ActivityThread extends ClientTransactionHandler { TAG, "Handling launch of " + r); // Initialize before creating the activity - if (!ThreadedRenderer.sRendererDisabled) { - GraphicsEnvironment.earlyInitEGL(); + if (!ThreadedRenderer.sRendererDisabled + && (r.activityInfo.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0) { + HardwareRenderer.preload(); } WindowManagerGlobal.initialize(); diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index ec6da24dc2b1..4a14eced7d87 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -25,7 +25,6 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; -import android.opengl.EGL14; import android.provider.Settings; import android.util.Log; import android.widget.Toast; @@ -677,25 +676,6 @@ public class GraphicsEnvironment { return true; } - /** - * Start a background thread to initialize EGL. - * - * Initializing EGL involves loading and initializing the graphics driver. Some drivers take - * several 10s of milliseconds to do this, so doing it on-demand when an app tries to render - * its first frame adds directly to user-visible app launch latency. By starting it earlier - * on a separate thread, it can usually be finished well before the UI is ready to be drawn. - * - * Should only be called after chooseDriver(). - */ - public static void earlyInitEGL() { - final Thread eglInitThread = new Thread( - () -> { - EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); - }, - "EGL Init"); - eglInitThread.start(); - } - private static String chooseAbi(ApplicationInfo ai) { final String isa = VMRuntime.getCurrentInstructionSet(); if (ai.primaryCpuAbi != null && diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index 2aa5cb41d5ab..ecc2dd0d3598 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -1029,6 +1029,10 @@ static void android_view_ThreadedRenderer_setForceDark(JNIEnv* env, jobject claz proxy->setForceDark(enable); } +static void android_view_ThreadedRenderer_preload(JNIEnv*, jclass) { + RenderProxy::preload(); +} + // ---------------------------------------------------------------------------- // FrameMetricsObserver // ---------------------------------------------------------------------------- @@ -1144,6 +1148,7 @@ static const JNINativeMethod gMethods[] = { { "nSetContextPriority", "(I)V", (void*)android_view_ThreadedRenderer_setContextPriority }, { "nAllocateBuffers", "(J)V", (void*)android_view_ThreadedRenderer_allocateBuffers }, { "nSetForceDark", "(JZ)V", (void*)android_view_ThreadedRenderer_setForceDark }, + { "preload", "()V", (void*)android_view_ThreadedRenderer_preload }, }; static JavaVM* mJvm = nullptr; diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java index 99d8c1b42a4a..b020556cd15f 100644 --- a/graphics/java/android/graphics/HardwareRenderer.java +++ b/graphics/java/android/graphics/HardwareRenderer.java @@ -1027,6 +1027,18 @@ public class HardwareRenderer { */ public static native void disableVsync(); + /** + * Start render thread and initialize EGL or Vulkan. + * + * Initializing EGL involves loading and initializing the graphics driver. Some drivers take + * several 10s of milliseconds to do this, so doing it on-demand when an app tries to render + * its first frame adds directly to user-visible app launch latency. + * + * Should only be called after GraphicsEnvironment.chooseDriver(). + * @hide + */ + public static native void preload(); + /** @hide */ protected static native void setupShadersDiskCache(String cacheFile, String skiaCacheFile); diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 720c60362a55..34f76d9b3579 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -381,6 +381,14 @@ void RenderProxy::releaseVDAtlasEntries() { }); } +void RenderProxy::preload() { + // Create RenderThread object and start the thread. Then preload Vulkan/EGL driver. + auto& thread = RenderThread::getInstance(); + thread.queue().post([&thread]() { + thread.preload(); + }); +} + } /* namespace renderthread */ } /* namespace uirenderer */ } /* namespace android */ diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 6e1bfd74528a..a1a5551722bc 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -131,6 +131,8 @@ public: ANDROID_API static void disableVsync(); + ANDROID_API static void preload(); + static void repackVectorDrawableAtlas(); static void releaseVDAtlasEntries(); diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index bfae80f4698a..08edd20c0a0d 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -41,6 +41,7 @@ #include <utils/Condition.h> #include <utils/Log.h> #include <utils/Mutex.h> +#include <thread> namespace android { namespace uirenderer { @@ -175,9 +176,6 @@ void RenderThread::initThreadLocals() { mRenderState = new RenderState(*this); mVkManager = new VulkanManager(); mCacheManager = new CacheManager(mDisplayInfo); - if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaVulkan) { - requireVkContext(); - } } void RenderThread::requireGlContext() { @@ -409,6 +407,17 @@ bool RenderThread::isCurrent() { return gettid() == getInstance().getTid(); } +void RenderThread::preload() { + std::thread eglInitThread([]() { + //TODO: don't load EGL drivers for Vulkan, when HW bitmap uploader is refactored. + eglGetDisplay(EGL_DEFAULT_DISPLAY); + }); + eglInitThread.detach(); + if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaVulkan) { + requireVkContext(); + } +} + } /* namespace renderthread */ } /* namespace uirenderer */ } /* namespace android */ diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h index 419e7c7a6b51..329b4b99c911 100644 --- a/libs/hwui/renderthread/RenderThread.h +++ b/libs/hwui/renderthread/RenderThread.h @@ -115,6 +115,8 @@ public: void requireVkContext(); void destroyRenderingContext(); + void preload(); + /** * isCurrent provides a way to query, if the caller is running on * the render thread. diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index 1e685abd8afa..3b43f1297597 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -360,7 +360,7 @@ void VulkanManager::initialize() { } } -sk_sp<GrContext> VulkanManager::createContext(GrContextOptions options) { +sk_sp<GrContext> VulkanManager::createContext(const GrContextOptions& options) { auto getProc = [] (const char* proc_name, VkInstance instance, VkDevice device) { if (device != VK_NULL_HANDLE) { return vkGetDeviceProcAddr(device, proc_name); diff --git a/libs/hwui/renderthread/VulkanManager.h b/libs/hwui/renderthread/VulkanManager.h index 97636865a629..95c9630fb728 100644 --- a/libs/hwui/renderthread/VulkanManager.h +++ b/libs/hwui/renderthread/VulkanManager.h @@ -150,7 +150,7 @@ public: // Returned pointers are owned by VulkanManager. VkFunctorInitParams getVkFunctorInitParams() const; - sk_sp<GrContext> createContext(GrContextOptions options); + sk_sp<GrContext> createContext(const GrContextOptions& options); private: // Sets up the VkInstance and VkDevice objects. Also fills out the passed in |