bool BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime,
                              nsecs_t expectedPresentTime) {
    // if we've already called updateTexImage() without going through
    // a composition step, we have to skip this layer at this point
    // because we cannot call updateTeximage() without a corresponding
    // compositionComplete() call.
    // we'll trigger an update in onPreComposition().
    if (mRefreshPending) {
        return false;
    }

mRefreshPendingtrue,表示还没执行合成,跳过该 layer。在 onPreComposition()BufferLayer::latchAndReleaseBuffer() 中设置为 false

    // If the head buffer's acquire fence hasn't signaled yet, return and
    // try again later
    if (!fenceHasSignaled()) {
        ATRACE_NAME("!fenceHasSignaled()");
        mFlinger->signalLayerUpdate();
        return false;
    }

未收到 fence 信号,调用 signalLayerUpdate() 等待下次。

    status_t err = updateTexImage(recomputeVisibleRegions, latchTime, expectedPresentTime);
    if (err != NO_ERROR) {
        return false;
    }

调用 BufferQueueLayer::updateTexImage() 获取新的 buffer,在 BufferLayerConsumer::updateAndReleaseLocked() 中更新 mCurrentTextureBuffer

    err = updateActiveBuffer();
    if (err != NO_ERROR) {
        return false;
    }

调用 BufferQueueLayer::updateActiveBuffer() 更新 BufferLayer::BufferInfomBuffermBufferSlotmFence

或调用 BufferStateLayer::updateActiveBuffer() 设置 mPreviousReleaseCallbackId,更新 mBufferInfo 中 buffer 相关的成员。

    err = updateFrameNumber(latchTime);
    if (err != NO_ERROR) {
        return false;
    }

BufferQueueLayer::updateFrameNumber() 中先把 mCurrentFrameNumber 设置给 mPreviousFrameNumber,然后调用 BufferQueueConsumer::getFrameNumber() 更新了 mCurrentFrameNumbermCurrentFrameNumber 是 Layer 的成员。

    gatherBufferInfo();

BufferQueueLayer::gatherBufferInfo() 更新 BufferLayer::BufferInfo 成员。

    mRefreshPending = true;