diff options
author | John Reck <jreck@google.com> | 2017-06-14 20:31:11 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2017-06-14 20:31:11 +0000 |
commit | 2d41b97bc34c5368db828e532e270405e7b134da (patch) | |
tree | 8656719f25b6a5303e0537bc13fb0e52c89c5a9a | |
parent | bce79b1bdc8e020d75c93a608ed1f29b66a10ab3 (diff) | |
parent | f0d3971021c26baa0e0b1721e71c99a2f98dae1b (diff) |
Merge "Add a workaround for simulate secondary display" into oc-dev am: 31443a17e8
am: f0d3971021
Change-Id: I5ee14c0887eaeac267c815851ae6f9e8ee47d80f
-rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 3 | ||||
-rw-r--r-- | core/jni/android_view_ThreadedRenderer.cpp | 5 | ||||
-rw-r--r-- | libs/hwui/Properties.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/Properties.h | 6 | ||||
-rw-r--r-- | libs/hwui/renderthread/EglManager.cpp | 3 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 5 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 2 | ||||
-rw-r--r-- | services/core/java/com/android/server/display/OverlayDisplayWindow.java | 3 |
8 files changed, 28 insertions, 0 deletions
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index de4d03e9ec35..489de565acb6 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -996,6 +996,9 @@ public final class ThreadedRenderer { observer.mNative = null; } + /** Not actually public - internal use only. This doc to make lint happy */ + public static native void disableVsync(); + static native void setupShadersDiskCache(String cacheFile); private static native void nRotateProcessStatsBuffer(); diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index 2657140cd634..286c1a2692da 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -926,6 +926,10 @@ static jobject android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode( return createBitmap(env, bitmap.release(), android::bitmap::kBitmapCreateFlag_Mutable); } +static void android_view_ThreadedRenderer_disableVsync(JNIEnv*, jclass) { + RenderProxy::disableVsync(); +} + // ---------------------------------------------------------------------------- // FrameMetricsObserver // ---------------------------------------------------------------------------- @@ -1024,6 +1028,7 @@ static const JNINativeMethod gMethods[] = { (void*)android_view_ThreadedRenderer_copySurfaceInto }, { "nCreateHardwareBitmap", "(JII)Landroid/graphics/Bitmap;", (void*)android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode }, + { "disableVsync", "()V", (void*)android_view_ThreadedRenderer_disableVsync }, }; int register_android_view_ThreadedRenderer(JNIEnv* env) { diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp index aad81df0b7e5..b5872485b136 100644 --- a/libs/hwui/Properties.cpp +++ b/libs/hwui/Properties.cpp @@ -69,6 +69,7 @@ bool Properties::waitForGpuCompletion = false; bool Properties::forceDrawFrame = false; bool Properties::filterOutTestOverhead = false; +bool Properties::disableVsync = false; static int property_get_int(const char* key, int defaultValue) { char buf[PROPERTY_VALUE_MAX] = {'\0',}; diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index 9db64493928a..91b4a2d440e2 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -318,6 +318,12 @@ public: // any overhead they add static bool filterOutTestOverhead; + // Workaround a device lockup in edge cases by switching to async mode + // instead of the default vsync (b/38372997). Only system_server should hit this. + // Any existing RenderProxy & Surface combination will be unaffected, only things + // created after changing this. + static bool disableVsync; + // Used for testing only to change the render pipeline. #ifdef HWUI_GLES_WRAP_ENABLED static void overrideRenderPipelineType(RenderPipelineType); diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp index ecf686c5b40c..d6240e7064cf 100644 --- a/libs/hwui/renderthread/EglManager.cpp +++ b/libs/hwui/renderthread/EglManager.cpp @@ -357,6 +357,9 @@ bool EglManager::makeCurrent(EGLSurface surface, EGLint* errOut) { } } mCurrentSurface = surface; + if (Properties::disableVsync) { + eglSwapInterval(mEglDisplay, 0); + } return true; } diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index ec56c313f62a..80c2955400d8 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -18,6 +18,7 @@ #include "DeferredLayerUpdater.h" #include "DisplayList.h" +#include "Properties.h" #include "Readback.h" #include "Rect.h" #include "renderthread/CanvasContext.h" @@ -709,6 +710,10 @@ void RenderProxy::onBitmapDestroyed(uint32_t pixelRefId) { thread.queue(task); } +void RenderProxy::disableVsync() { + Properties::disableVsync = true; +} + void RenderProxy::post(RenderTask* task) { mRenderThread.queue(task); } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index e1e2808e734f..31f0ce67e1a7 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -138,6 +138,8 @@ public: static int copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap); static void onBitmapDestroyed(uint32_t pixelRefId); + + ANDROID_API static void disableVsync(); private: RenderThread& mRenderThread; CanvasContext* mContext; diff --git a/services/core/java/com/android/server/display/OverlayDisplayWindow.java b/services/core/java/com/android/server/display/OverlayDisplayWindow.java index f23caf2e7a76..0fdf2daf1c8d 100644 --- a/services/core/java/com/android/server/display/OverlayDisplayWindow.java +++ b/services/core/java/com/android/server/display/OverlayDisplayWindow.java @@ -30,6 +30,7 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.TextureView; +import android.view.ThreadedRenderer; import android.view.View; import android.view.WindowManager; import android.view.TextureView.SurfaceTextureListener; @@ -95,6 +96,8 @@ final class OverlayDisplayWindow implements DumpUtils.Dump { public OverlayDisplayWindow(Context context, String name, int width, int height, int densityDpi, int gravity, boolean secure, Listener listener) { + // Workaround device freeze (b/38372997) + ThreadedRenderer.disableVsync(); mContext = context; mName = name; mGravity = gravity; |