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

Commit cab4afeb authored by Ady Abraham's avatar Ady Abraham
Browse files

hwui: send TextureView hint to SF

So that SF could use this hint when choosing the refresh rate.
SF would only try to heuristically calculate the frame rate of a layer
when TextureView is updating. This fixes a bug where SF tries to
heuristically calculate the frame rate for UI animations but fails
due to long frames.

Bug: 280249265
Test: Playing a video on Facebook and observe refresh rate
Test: go/cb-pcmark

Change-Id: I0d54d62b97ff48583fbe3cc0da188fe85810fd5e
parent 547c0592
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -206,6 +206,7 @@ public class TextureView extends View {
     */
    public TextureView(@NonNull Context context) {
        super(context);
        mRenderNode.setIsTextureView();
    }

    /**
@@ -216,6 +217,7 @@ public class TextureView extends View {
     */
    public TextureView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mRenderNode.setIsTextureView();
    }

    /**
@@ -229,6 +231,7 @@ public class TextureView extends View {
     */
    public TextureView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mRenderNode.setIsTextureView();
    }

    /**
@@ -247,6 +250,7 @@ public class TextureView extends View {
    public TextureView(@NonNull Context context, @Nullable AttributeSet attrs,
            int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        mRenderNode.setIsTextureView();
    }

    /**
+13 −0
Original line number Diff line number Diff line
@@ -1561,6 +1561,16 @@ public final class RenderNode {
        return nGetUniqueId(mNativeRenderNode);
    }

    /**
     * Captures whether this RenderNote represents a TextureView
     * TODO(b/281695725): Clean this up once TextureView use setFrameRate API
     *
     * @hide
     */
    public void setIsTextureView() {
        nSetIsTextureView(mNativeRenderNode);
    }

    ///////////////////////////////////////////////////////////////////////////
    // Animations
    ///////////////////////////////////////////////////////////////////////////
@@ -1891,4 +1901,7 @@ public final class RenderNode {

    @CriticalNative
    private static native long nGetUniqueId(long renderNode);

    @CriticalNative
    private static native void nSetIsTextureView(long renderNode);
}
+3 −0
Original line number Diff line number Diff line
@@ -152,6 +152,9 @@ void RenderNode::damageSelf(TreeInfo& info) {
            // TODO: Get this from the display list ops or something
            info.damageAccumulator->dirty(DIRTY_MIN, DIRTY_MIN, DIRTY_MAX, DIRTY_MAX);
        }
        if (!mIsTextureView) {
            info.out.solelyTextureViewUpdates = false;
        }
    }
}

+4 −0
Original line number Diff line number Diff line
@@ -221,6 +221,8 @@ public:

    int64_t uniqueId() const { return mUniqueId; }

    void setIsTextureView() { mIsTextureView = true; }

    void markDrawStart(SkCanvas& canvas);
    void markDrawEnd(SkCanvas& canvas);

@@ -290,6 +292,8 @@ private:
    bool mHasHolePunches;
    StretchMask mStretchMask;

    bool mIsTextureView = false;

    // METHODS & FIELDS ONLY USED BY THE SKIA RENDERER
public:
    /**
+4 −0
Original line number Diff line number Diff line
@@ -123,6 +123,10 @@ public:
        // This is used to post a message to redraw when it is time to draw the
        // next frame of an AnimatedImageDrawable.
        nsecs_t animatedImageDelay = kNoAnimatedImageDelay;
        // This is used to determine if there were only TextureView updates in this frame.
        // This info is passed to SurfaceFlinger to determine whether it should use vsyncIds
        // for refresh rate selection.
        bool solelyTextureViewUpdates = true;
    } out;

    // This flag helps to disable projection for receiver nodes that do not have any backward
Loading