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

Commit 64b51f6e authored by Rob Carr's avatar Rob Carr Committed by Android (Google) Code Review
Browse files

Merge "BufferStateLayer: Use mCurrentState for HeadFrameNumber"

parents 96181f90 fe1209c1
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -203,12 +203,12 @@ protected:
    void updateCloneBufferInfo() override;
    void updateCloneBufferInfo() override;
    uint64_t mPreviousFrameNumber = 0;
    uint64_t mPreviousFrameNumber = 0;


    virtual uint64_t getHeadFrameNumber(nsecs_t expectedPresentTime) const;

private:
private:
    // Returns true if this layer requires filtering
    // Returns true if this layer requires filtering
    bool needsFiltering(const sp<const DisplayDevice>& displayDevice) const override;
    bool needsFiltering(const sp<const DisplayDevice>& displayDevice) const override;


    uint64_t getHeadFrameNumber(nsecs_t expectedPresentTime) const;

    // BufferStateLayers can return Rect::INVALID_RECT if the layer does not have a display frame
    // BufferStateLayers can return Rect::INVALID_RECT if the layer does not have a display frame
    // and its parent layer is not bounded
    // and its parent layer is not bounded
    Rect getBufferSize(const State& s) const override;
    Rect getBufferSize(const State& s) const override;
+26 −0
Original line number Original line Diff line number Diff line
@@ -468,6 +468,32 @@ uint64_t BufferStateLayer::getFrameNumber(nsecs_t /*expectedPresentTime*/) const
    return mDrawingState.frameNumber;
    return mDrawingState.frameNumber;
}
}


/**
 * This is the frameNumber used for deferred transaction signalling. We need to use this because
 * of cases where we defer a transaction for a surface to itself. In the BLAST world this
 * may not make a huge amount of sense (Why not just merge the Buffer transaction with the
 * deferred transaction?) but this is an important legacy use case, for example moving
 * a window at the same time it draws makes use of this kind of technique. So anyway
 * imagine we have something like this:
 *
 * Transaction { // containing
 *     Buffer -> frameNumber = 2
 *     DeferTransactionUntil -> frameNumber = 2
 *     Random other stuff
 *  }
 * Now imagine getHeadFrameNumber returned mDrawingState.mFrameNumber (or mCurrentFrameNumber).
 * Prior to doTransaction SurfaceFlinger will call notifyAvailableFrames, but because we
 * haven't swapped mCurrentState to mDrawingState yet we will think the sync point
 * is not ready. So we will return false from applyPendingState and not swap
 * current state to drawing state. But because we don't swap current state
 * to drawing state the number will never update and we will be stuck. This way
 * we can see we need to return the frame number for the buffer we are about
 * to apply.
 */
uint64_t BufferStateLayer::getHeadFrameNumber(nsecs_t /* expectedPresentTime */) const {
    return mCurrentState.frameNumber;
}

bool BufferStateLayer::getAutoRefresh() const {
bool BufferStateLayer::getAutoRefresh() const {
    // TODO(marissaw): support shared buffer mode
    // TODO(marissaw): support shared buffer mode
    return false;
    return false;
+1 −0
Original line number Original line Diff line number Diff line
@@ -116,6 +116,7 @@ public:


protected:
protected:
    void gatherBufferInfo() override;
    void gatherBufferInfo() override;
    uint64_t getHeadFrameNumber(nsecs_t expectedPresentTime) const;


private:
private:
    bool updateFrameEventHistory(const sp<Fence>& acquireFence, nsecs_t postedTime,
    bool updateFrameEventHistory(const sp<Fence>& acquireFence, nsecs_t postedTime,