目录
一,框架图
二,核心代码
一,框架图
对上面这张图的总结
二,核心代码
/Volumes/aosp/android-8.1.0_r52/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
void SurfaceFlinger::onMessageReceived(int32_t what) {ATRACE_CALL();switch (what) {case MessageQueue::INVALIDATE: {bool frameMissed = !mHadClientComposition &&mPreviousPresentFence != Fence::NO_FENCE &&(mPreviousPresentFence->getSignalTime() ==Fence::SIGNAL_TIME_PENDING);ATRACE_INT("FrameMissed", static_cast<int>(frameMissed));if (mPropagateBackpressure && frameMissed) {signalLayerUpdate();break;}// Now that we're going to make it to the handleMessageTransaction()// call below it's safe to call updateVrFlinger(), which will// potentially trigger a display handoff.updateVrFlinger();bool refreshNeeded = handleMessageTransaction();refreshNeeded |= handleMessageInvalidate();refreshNeeded |= mRepaintEverything;if (refreshNeeded) {// Signal a refresh if a transaction modified the window state,// a new buffer was latched, or if HWC has requested a full// repaintsignalRefresh();}break;}case MessageQueue::REFRESH: {handleMessageRefresh();break;}}
bool SurfaceFlinger::handleMessageInvalidate() {ATRACE_CALL();return handlePageFlip();
}
bool SurfaceFlinger::handlePageFlip()
{ALOGV("handlePageFlip");nsecs_t latchTime = systemTime();bool visibleRegions = false;bool frameQueued = false;bool newDataLatched = false;// Store the set of layers that need updates. This set must not change as// buffers are being latched, as this could result in a deadlock.// Example: Two producers share the same command stream and:// 1.) Layer 0 is latched// 2.) Layer 0 gets a new frame// 2.) Layer 1 gets a new frame// 3.) Layer 1 is latched.// Display is now waiting on Layer 1's frame, which is behind layer 0's// second frame. But layer 0's second frame could be waiting on display.mDrawingState.traverseInZOrder([&](Layer* layer) {if (layer->hasQueuedFrame()) {frameQueued = true;if (layer->shouldPresentNow(mPrimaryDispSync)) {mLayersWithQueuedFrames.push_back(layer);} else {layer->useEmptyDamage();}} else {layer->useEmptyDamage();}});for (auto& layer : mLayersWithQueuedFrames) {const Region dirty(layer->latchBuffer(visibleRegions, latchTime));layer->useSurfaceDamage();invalidateLayerStack(layer, dirty);if (layer->isBufferLatched()) {newDataLatched = true;}}mVisibleRegionsDirty |= visibleRegions;// If we will need to wake up at some time in the future to deal with a// queued frame that shouldn't be displayed during this vsync period, wake// up during the next vsync period to check again.if (frameQueued && (mLayersWithQueuedFrames.empty() || !newDataLatched)) {signalLayerUpdate();}// Only continue with the refresh if there is actually new work to doreturn !mLayersWithQueuedFrames.empty() && newDataLatched;
}
void SurfaceFlinger::handleMessageRefresh() {ATRACE_CALL();mRefreshPending = false;nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);preComposition(refreshStartTime);rebuildLayerStacks();setUpHWComposer();doDebugFlashRegions();doComposition();postComposition(refreshStartTime);mPreviousPresentFence = mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);mHadClientComposition = false;for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {const sp<DisplayDevice>& displayDevice = mDisplays[displayId];mHadClientComposition = mHadClientComposition ||mHwc->hasClientComposition(displayDevice->getHwcDisplayId());}mLayersWithQueuedFrames.clear();
}