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;