From a94f3221da84261a97c26b6597d702ddc9d7a727 Mon Sep 17 00:00:00 2001 From: Peiyong Lin Date: Thu, 31 Jan 2019 21:25:57 -0800 Subject: [Color] Make setColorMode togglable. Previously setColorMode must be called before view is set, and has no effect after that. The state of WCG on Android when this patch was written, was that most hardware out there can not handle mixed color spaces composition well which results in GPU composition. And this situation will remain true for a long time. Despite photography applications want to have WCG, it's a power cost especially during video playback. In order to mitigate this fact and the desire to move the ecosystem forward in WCG, we make setColorMode togglable such that in the next app vsync, when color mode is changed we issue a surface update which results in the old EGLSurface or VkSurface being destroyed and new EGLSurface or VkSurface being created with the target color space being set. As a result, applications can now togglable WCG on/off. BUG: 120288123 Test: Build, flash and boot. Verify with SurfaceFlinger dumpsys on demo app. Change-Id: I09bf8c380a01f4dde364873d37b248cedc6ccfd3 --- core/java/android/view/ViewRootImpl.java | 21 ++++++++++++++++++++- .../java/android/graphics/HardwareRenderer.java | 7 +++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 9213f32326b4..9a317db84f5d 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2289,6 +2289,7 @@ public final class ViewRootImpl implements ViewParent, surfaceChanged |= surfaceSizeChanged; final boolean alwaysConsumeNavBarChanged = mPendingAlwaysConsumeNavBar != mAttachInfo.mAlwaysConsumeNavBar; + final boolean colorModeChanged = hasColorModeChanged(lp.getColorMode()); if (contentInsetsChanged) { mAttachInfo.mContentInsets.set(mPendingContentInsets); if (DEBUG_LAYOUT) Log.v(mTag, "Content insets changing to: " @@ -2335,6 +2336,10 @@ public final class ViewRootImpl implements ViewParent, if (DEBUG_LAYOUT) Log.v(mTag, "Visible insets changing to: " + mAttachInfo.mVisibleInsets); } + if (colorModeChanged && mAttachInfo.mThreadedRenderer != null) { + mAttachInfo.mThreadedRenderer.setWideGamut( + lp.getColorMode() == ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT); + } if (!hadSurface) { if (mSurface.isValid()) { @@ -2387,7 +2392,7 @@ public final class ViewRootImpl implements ViewParent, mAttachInfo.mThreadedRenderer.destroy(); } } else if ((surfaceGenerationId != mSurface.getGenerationId() - || surfaceSizeChanged || windowRelayoutWasForced) + || surfaceSizeChanged || windowRelayoutWasForced || colorModeChanged) && mSurfaceHolder == null && mAttachInfo.mThreadedRenderer != null) { mFullRedrawNeeded = true; @@ -4009,6 +4014,20 @@ public final class ViewRootImpl implements ViewParent, } } + private boolean hasColorModeChanged(int colorMode) { + if (mAttachInfo.mThreadedRenderer == null) { + return false; + } + final boolean isWideGamut = colorMode == ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT; + if (mAttachInfo.mThreadedRenderer.isWideGamut() == isWideGamut) { + return false; + } + if (isWideGamut && !mContext.getResources().getConfiguration().isScreenWideColorGamut()) { + return false; + } + return true; + } + @Override public void requestChildFocus(View child, View focused) { if (DEBUG_INPUT_RESIZE) { diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java index c4ddd50616e8..7ec76d79dfb1 100644 --- a/graphics/java/android/graphics/HardwareRenderer.java +++ b/graphics/java/android/graphics/HardwareRenderer.java @@ -154,6 +154,7 @@ public class HardwareRenderer { private boolean mOpaque = true; private boolean mForceDark = false; private FrameInfo mScratchInfo; + private boolean mIsWideGamut = false; /** * Creates a new instance of a HardwareRenderer. The HardwareRenderer will default @@ -498,6 +499,7 @@ public class HardwareRenderer { * @hide */ public void setWideGamut(boolean wideGamut) { + mIsWideGamut = wideGamut; nSetWideGamut(mNativeProxy, wideGamut); } @@ -673,6 +675,11 @@ public class HardwareRenderer { nSetPictureCaptureCallback(mNativeProxy, callback); } + /** @hide */ + public boolean isWideGamut() { + return mIsWideGamut; + } + /** called by native */ static void invokePictureCapturedCallback(long picturePtr, PictureCapturedCallback callback) { Picture picture = new Picture(picturePtr); -- cgit v1.2.3-59-g8ed1b