From 0bcd0cb6b1193168fa2840855195347488daab9e Mon Sep 17 00:00:00 2001 From: Thomas Buhot Date: Fri, 4 Dec 2015 12:18:03 +0100 Subject: [PATCH] libhwui: make setSurface asynchronous On the critical path of the cold launch of applications the main thread of the started application tells the RenderThread to create a surface. This process is synchronous and blocks the main thread of the application until the creation of the EGLContext is complete. As a consequence the launch time of the application is delayed by time spent allocating the EGL Context in the RenderThread. With this optimization the launch time of any application is improved (for example settings by 20 to 40 ms). Change-Id: Ibf47aaa0abb8dedf7aa00693073db3785d9d6b08 Signed-off-by: Thomas Buhot Signed-off-by: Zhiquan Liu --- core/java/android/view/ThreadedRenderer.java | 5 +++-- core/jni/android_view_ThreadedRenderer.cpp | 6 +++--- libs/hwui/renderthread/CanvasContext.cpp | 5 ++--- libs/hwui/renderthread/CanvasContext.h | 2 +- libs/hwui/renderthread/RenderProxy.cpp | 7 ++++--- libs/hwui/renderthread/RenderProxy.h | 2 +- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index f6119e2898f00..db147ab51263f 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -145,9 +145,10 @@ public class ThreadedRenderer extends HardwareRenderer { @Override boolean initialize(Surface surface) throws OutOfResourcesException { + boolean status = !mInitialized; mInitialized = true; updateEnabledState(surface); - boolean status = nInitialize(mNativeProxy, surface); + nInitialize(mNativeProxy, surface); return status; } @@ -503,7 +504,7 @@ public class ThreadedRenderer extends HardwareRenderer { private static native boolean nLoadSystemProperties(long nativeProxy); private static native void nSetName(long nativeProxy, String name); - private static native boolean nInitialize(long nativeProxy, Surface window); + private static native void nInitialize(long nativeProxy, Surface window); private static native void nUpdateSurface(long nativeProxy, Surface window); private static native boolean nPauseSurface(long nativeProxy, Surface window); private static native void nSetup(long nativeProxy, int width, int height, diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index dae975191007b..7b2a40b36c482 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -262,11 +262,11 @@ static void android_view_ThreadedRenderer_setName(JNIEnv* env, jobject clazz, env->ReleaseStringUTFChars(jname, name); } -static jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, +static void android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject jsurface) { RenderProxy* proxy = reinterpret_cast(proxyPtr); sp window = android_view_Surface_getNativeWindow(env, jsurface); - return proxy->initialize(window); + proxy->initialize(window); } static void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz, @@ -461,7 +461,7 @@ static const JNINativeMethod gMethods[] = { { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties }, { "nSetName", "(JLjava/lang/String;)V", (void*) android_view_ThreadedRenderer_setName }, - { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, + { "nInitialize", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_initialize }, { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, { "nPauseSurface", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_pauseSurface }, { "nSetup", "(JIIFII)V", (void*) android_view_ThreadedRenderer_setup }, diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 6dfb6e811e60b..87a703c427136 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -110,12 +110,11 @@ void CanvasContext::setSwapBehavior(SwapBehavior swapBehavior) { mSwapBehavior = swapBehavior; } -bool CanvasContext::initialize(ANativeWindow* window) { +void CanvasContext::initialize(ANativeWindow* window) { setSurface(window); - if (mCanvas) return false; + if (mCanvas) return; mCanvas = new OpenGLRenderer(mRenderThread.renderState()); mCanvas->initProperties(); - return true; } void CanvasContext::updateSurface(ANativeWindow* window) { diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index f2fa9cdcbefdd..1e6f830dbeb26 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -67,7 +67,7 @@ public: // Won't take effect until next EGLSurface creation void setSwapBehavior(SwapBehavior swapBehavior); - bool initialize(ANativeWindow* window); + void initialize(ANativeWindow* window); void updateSurface(ANativeWindow* window); bool pauseSurface(ANativeWindow* window); bool hasSurface() { return mNativeWindow.get(); } diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 6d9acd429279a..30f0073fd1f0e 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -140,14 +140,15 @@ void RenderProxy::setName(const char* name) { } CREATE_BRIDGE2(initialize, CanvasContext* context, ANativeWindow* window) { - return (void*) args->context->initialize(args->window); + args->context->initialize(args->window); + return nullptr; } -bool RenderProxy::initialize(const sp& window) { +void RenderProxy::initialize(const sp& window) { SETUP_TASK(initialize); args->context = mContext; args->window = window.get(); - return (bool) postAndWait(task); + post(task); } CREATE_BRIDGE2(updateSurface, CanvasContext* context, ANativeWindow* window) { diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 5febbe0ab26c5..db03b29f134b4 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -67,7 +67,7 @@ public: ANDROID_API bool loadSystemProperties(); ANDROID_API void setName(const char* name); - ANDROID_API bool initialize(const sp& window); + ANDROID_API void initialize(const sp& window); ANDROID_API void updateSurface(const sp& window); ANDROID_API bool pauseSurface(const sp& window); ANDROID_API void setup(int width, int height, float lightRadius,