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;
}
mRefreshPending 是 true,表示还没执行合成,跳过该 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::BufferInfo 中 mBuffer、mBufferSlot 和 mFence。
或调用 BufferStateLayer::updateActiveBuffer() 设置 mPreviousReleaseCallbackId,更新 mBufferInfo 中 buffer 相关的成员。
err = updateFrameNumber(latchTime);
if (err != NO_ERROR) {
return false;
}
BufferQueueLayer::updateFrameNumber() 中先把 mCurrentFrameNumber 设置给 mPreviousFrameNumber,然后调用 BufferQueueConsumer::getFrameNumber() 更新了 mCurrentFrameNumber。mCurrentFrameNumber 是 Layer 的成员。
gatherBufferInfo();
BufferQueueLayer::gatherBufferInfo() 更新 BufferLayer::BufferInfo 成员。
mRefreshPending = true;