Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a94f3221 authored by Peiyong Lin's avatar Peiyong Lin
Browse files

[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
parent f9734602
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -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) {
+7 −0
Original line number Diff line number Diff line
@@ -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);