diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index 4b130ed1adc8a..20de370fa3445 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -19,6 +19,7 @@ package android.os; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.opengl.EGL14; import android.os.SystemProperties; import android.util.Log; @@ -34,6 +35,23 @@ public final class GraphicsEnvironment { private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; public static void setupGraphicsEnvironment(Context context) { + chooseDriver(context); + + // Now that we've figured out which driver to use for this process, load and initialize it. + // This can take multiple frame periods, and it would otherwise happen as part of the first + // frame, increasing first-frame latency. Starting it here, as a low-priority background + // thread, means that it's usually done long before we start drawing the first frame, + // without significantly disrupting other activity launch work. + Thread eglInitThread = new Thread( + () -> { + Thread.currentThread().setPriority(Thread.MIN_PRIORITY); + EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); + }, + "EGL Init"); + eglInitThread.start(); + } + + private static void chooseDriver(Context context) { String driverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER); if (driverPackageName == null || driverPackageName.isEmpty()) { return; diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 68299615b5b9f..2a1a47651368c 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -26,7 +26,6 @@ import android.icu.impl.CacheValue; import android.icu.text.DecimalFormatSymbols; import android.icu.util.ULocale; import android.net.LocalServerSocket; -import android.opengl.EGL14; import android.os.Process; import android.os.SystemClock; import android.os.SystemProperties; @@ -199,9 +198,6 @@ public class ZygoteInit { Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadResources"); preloadResources(); Trace.traceEnd(Trace.TRACE_TAG_DALVIK); - Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadOpenGL"); - preloadOpenGL(); - Trace.traceEnd(Trace.TRACE_TAG_DALVIK); preloadSharedLibraries(); preloadTextResources(); // Ask the WebViewFactory to do any initialization that must run in the zygote process, @@ -242,12 +238,6 @@ public class ZygoteInit { System.loadLibrary("jnigraphics"); } - private static void preloadOpenGL() { - if (!SystemProperties.getBoolean(PROPERTY_DISABLE_OPENGL_PRELOADING, false)) { - EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); - } - } - private static void preloadTextResources() { Hyphenator.init(); TextView.preloadFontCache();