當(dāng)有事務(wù)的更新或者有Buffer的更新便會(huì)觸發(fā)后面刷新的流程帽揪。
onMessageRefresh
文件:frameworks/native/services/surfaceflinger/Surfaceflinger.cpp
void SurfaceFlinger::onMessageRefresh() {
ATRACE_CALL();
mRefreshPending = false;
compositionengine::CompositionRefreshArgs refreshArgs;
const auto& displays = ON_MAIN_THREAD(mDisplays);
// display 的數(shù)量锈玉,把當(dāng)前displaydevice 記錄下來
refreshArgs.outputs.reserve(displays.size());
for (const auto& [_, display] : displays) {
refreshArgs.outputs.push_back(display->getCompositionDisplay());
}
// 把當(dāng)前l(fā)ayer記錄下來
mDrawingState.traverseInZOrder([&refreshArgs](Layer* layer) {
if (auto layerFE = layer->getCompositionEngineLayerFE())
refreshArgs.layers.push_back(layerFE);
});
// 把當(dāng)前有queueframe的layer記錄下來, 有Buffer的layer
refreshArgs.layersWithQueuedFrames.reserve(mLayersWithQueuedFrames.size());
for (sp<Layer> layer : mLayersWithQueuedFrames) {
if (auto layerFE = layer->getCompositionEngineLayerFE())
refreshArgs.layersWithQueuedFrames.push_back(layerFE);
}
...
// 主要邏輯在present里面
mCompositionEngine->present(refreshArgs);
}
刷新的主要邏輯在present里面。
文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp
void CompositionEngine::present(CompositionRefreshArgs& args) {
ATRACE_CALL();
ALOGV(__FUNCTION__);
// 根據(jù)是否還有l(wèi)ayer沒有消費(fèi)掉炕贵,判斷再調(diào)起一次刷新
preComposition(args);
{
// latchedLayers is used to track the set of front-end layer state that
// has been latched across all outputs for the prepare step, and is not
// needed for anything else.
LayerFESet latchedLayers;
for (const auto& output : args.outputs) {
// 計(jì)算各個(gè)區(qū)域大小以及創(chuàng)建hwc layer
output->prepare(args, latchedLayers);
}
}
// 更新layerCompositionState
updateLayerStateFromFE(args);
for (const auto& output : args.outputs) {
// 邏輯在output.cpp的present里面
output->present(args);
}
}
prepare主要的作用是計(jì)算各個(gè)區(qū)域大小以及創(chuàng)建hwc layer策菜,主要邏輯在ensureOutputLayerIfVisible 里面褥芒。
ensureOutputLayerIfVisible
文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp
void Output::ensureOutputLayerIfVisible(sp<compositionengine::LayerFE>& layerFE,
compositionengine::Output::CoverageState& coverage) {
...
/*
* opaqueRegion: area of a surface that is fully opaque.
*/
Region opaqueRegion;
/*
* visibleRegion: area of a surface that is visible on screen and not fully
* transparent. This is essentially the layer's footprint minus the opaque
* regions above it. Areas covered by a translucent surface are considered
* visible.
*/
Region visibleRegion;
/*
* coveredRegion: area of a surface that is covered by all visible regions
* above it (which includes the translucent areas).
*/
Region coveredRegion;
/*
* transparentRegion: area of a surface that is hinted to be completely
* transparent. This is only used to tell when the layer has no visible non-
* transparent regions and can be removed from the layer list. It does not
* affect the visibleRegion of this layer or any layers beneath it. The hint
* may not be correct if apps don't respect the SurfaceView restrictions
* (which, sadly, some don't).
*/
Region transparentRegion;
/*
* shadowRegion: Region cast by the layer's shadow.
*/
Region shadowRegion;
....
// 創(chuàng)建OutputLayer
auto result = ensureOutputLayer(prevOutputLayerIndex, layerFE);
...
}
各個(gè)layer區(qū)域的計(jì)算結(jié)果可以通過adb shell dumpsys SurfaceFlinger看到,通過區(qū)域的計(jì)算把區(qū)域?yàn)榭盏膌ayer過濾掉
ensureOutputLayer將創(chuàng)建Output layer猾普,這些layer最后是要顯示到屏幕上的袜炕。
文件: frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h
OutputLayer* ensureOutputLayer(std::optional<size_t> prevIndex,
const sp<LayerFE>& layerFE) {
// 判斷當(dāng)前的outputlayer 集合里面有沒有當(dāng)前的layer,如果沒有則新創(chuàng)建一個(gè)
auto outputLayer = (prevIndex && *prevIndex <= mCurrentOutputLayersOrderedByZ.size())
? std::move(mCurrentOutputLayersOrderedByZ[*prevIndex])
: BaseOutput::createOutputLayer(layerFE);
auto result = outputLayer.get();
mPendingOutputLayersOrderedByZ.emplace_back(std::move(outputLayer));
return result;
}
文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Display.cpp
std::unique_ptr<compositionengine::OutputLayer> Display::createOutputLayer(
const sp<compositionengine::LayerFE>& layerFE) const {
auto result = impl::createOutputLayer(*this, layerFE);
if (result && mId) {
auto& hwc = getCompositionEngine().getHwComposer();
auto displayId = *mId;
// 創(chuàng)建hwclayer
auto hwcLayer = std::shared_ptr<HWC2::Layer>(hwc.createLayer(displayId),
[&hwc, displayId](HWC2::Layer* layer) {
hwc.destroyLayer(displayId, layer);
});
ALOGE_IF(!hwcLayer, "Failed to create a HWC layer for a HWC supported display %s",
getName().c_str());
// 更新state.hwc
result->setHwcLayer(std::move(hwcLayer));
}
return result;
}
可以看到prepare主要的作用是遍歷layer計(jì)算各個(gè)區(qū)域大小抬闷,過濾掉空區(qū)域的layer以及創(chuàng)建hwc layer妇蛀。
updateLayerStateFromFE
更新OutputlayerState的參數(shù),即layer的狀態(tài)信息笤成。
文件:frameworks/native/services/surfaceflinger/Layer.cpp
void Layer::prepareCompositionState(compositionengine::LayerFE::StateSubset subset) {
using StateSubset = compositionengine::LayerFE::StateSubset;
switch (subset) {
case StateSubset::BasicGeometry:
prepareBasicGeometryCompositionState();
break;
case StateSubset::GeometryAndContent:
prepareBasicGeometryCompositionState();
prepareGeometryCompositionState();
preparePerFrameCompositionState();
break;
case StateSubset::Content:
preparePerFrameCompositionState();
break;
case StateSubset::Cursor:
prepareCursorCompositionState();
break;
}
}
這部分也可以通過adb shell dumpsys SurfaceFlinger看出來有哪些屬性评架。
接下來看下present的邏輯。
文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp
void Output::present(const compositionengine::CompositionRefreshArgs& refreshArgs) {
ATRACE_CALL();
ALOGV(__FUNCTION__);
//設(shè)置 Display的dataspace, colormode
updateColorProfile(refreshArgs);
// 設(shè)置outputlayer的dispFrame和sourceCrop等以及將outputlayer屬性設(shè)給hwc
updateAndWriteCompositionState(refreshArgs);
// 設(shè)置display的顏色矩陣炕泳,對(duì)全屏有效
setColorTransform(refreshArgs);
// FrameBuffer里面沒做啥操作
beginFrame();
// 選擇合成策略纵诞,判斷是device還是GPU合成,如果是device合成培遵,直接present浙芙,如果要走GPU合成則需要validate
prepareFrame();
// 一般不走
devOptRepaintFlash(refreshArgs);
// GPU合成主要邏輯在此登刺,device合成沒做啥
finishFrame(refreshArgs);
// device合成設(shè)置release fence,GPU合成需要present給hwc
postFramebuffer();
}
先關(guān)注device合成嗡呼,涉及GPU部分單獨(dú)分析纸俭。
updateAndWriteCompositionState
文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp
void Output::updateAndWriteCompositionState(
const compositionengine::CompositionRefreshArgs& refreshArgs) {
ATRACE_CALL();
ALOGV(__FUNCTION__);
if (!getState().isEnabled) {
return;
}
mLayerRequestingBackgroundBlur = findLayerRequestingBackgroundComposition();
// 如果是有背景模糊的layer則強(qiáng)制使用GPU合成
bool forceClientComposition = mLayerRequestingBackgroundBlur != nullptr;
for (auto* layer : getOutputLayersOrderedByZ()) {
// 遍歷outputlayer,計(jì)算DisplayFrame南窗, SourceCrop 等參數(shù)
layer->updateCompositionState(refreshArgs.updatingGeometryThisFrame,
refreshArgs.devOptForceClientComposition ||
forceClientComposition,
refreshArgs.internalDisplayRotationFlags);
if (mLayerRequestingBackgroundBlur == layer) {
forceClientComposition = false;
}
// 將layer屬性設(shè)給hwc
layer->writeStateToHWC(refreshArgs.updatingGeometryThisFrame);
}
這部分參數(shù)也可以通過adb shell dumpsys SurfaceFlinger看到
setColorTransform
文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Display.cpp
void Display::setColorTransform(const compositionengine::CompositionRefreshArgs& args) {
Output::setColorTransform(args);
if (!mId || CC_LIKELY(!args.colorTransformMatrix)) {
return;
}
auto& hwc = getCompositionEngine().getHwComposer();
// 將上層設(shè)的colorTransformMatrix 設(shè)給hwc揍很,這個(gè)效果作用于全屏,比如護(hù)眼模式下万伤,改變的就是這個(gè)colorTransformMatrix
status_t result = hwc.setColorTransform(*mId, *args.colorTransformMatrix);
ALOGE_IF(result != NO_ERROR, "Failed to set color transform on display \"%s\": %d",
mId ? to_string(*mId).c_str() : "", result);
}
setColorTransform 設(shè)置顏色矩陣給屏幕窒悔,作用于屏幕顯示,所有的layer都受影響敌买,護(hù)眼效果就是改變的這個(gè)值简珠。
prepareFrame
文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp
void Output::prepareFrame() {
ATRACE_CALL();
ALOGV(__FUNCTION__);
const auto& outputState = getState();
if (!outputState.isEnabled) {
return;
}
// 選擇合成類型,如果是device合成虹钮,則跳過validate聋庵,直接present送顯
chooseCompositionStrategy();
// 把合成類型送到frameBufferSurface,沒啥邏輯
mRenderSurface->prepareFrame(outputState.usesClientComposition,
outputState.usesDeviceComposition);
}
void Output::chooseCompositionStrategy() {
// The base output implementation can only do client composition
// 默認(rèn)使用GPU合成,針對(duì)沒有hwc的設(shè)備
auto& outputState = editState();
outputState.usesClientComposition = true;
outputState.usesDeviceComposition = false;
outputState.reusedClientComposition = false;
}
文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Display.cpp
void Display::chooseCompositionStrategy() {
ATRACE_CALL();
ALOGV(__FUNCTION__);
// Default to the base settings -- client composition only.
Output::chooseCompositionStrategy();
// If we don't have a HWC display, then we are done
if (!mId) {
return;
}
// Get any composition changes requested by the HWC device, and apply them.
std::optional<android::HWComposer::DeviceRequestedChanges> changes;
auto& hwc = getCompositionEngine().getHwComposer();
// 從HWC device獲得合成類型的改變芜抒,這個(gè)根據(jù)hwc能力來選擇device還是GPU合成
if (status_t result = hwc.getDeviceCompositionChanges(*mId, anyLayersRequireClientComposition(),
&changes);
result != NO_ERROR) {
ALOGE("chooseCompositionStrategy failed for %s: %d (%s)", getName().c_str(), result,
strerror(-result));
return;
}
//如果有變化則設(shè)置給對(duì)應(yīng)的layer
if (changes) {
applyChangedTypesToLayers(changes->changedTypes);
applyDisplayRequests(changes->displayRequests);
applyLayerRequestsToLayers(changes->layerRequests);
applyClientTargetRequests(changes->clientTargetProperty);
}
// Determine what type of composition we are doing from the final state
// 決定最后的合成類型
auto& state = editState();
state.usesClientComposition = anyLayersRequireClientComposition();
state.usesDeviceComposition = !allLayersRequireClientComposition();
}
文件:frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp
status_t HWComposer::getDeviceCompositionChanges(
DisplayId displayId, bool frameUsesClientComposition,
std::optional<android::HWComposer::DeviceRequestedChanges>* outChanges) {
ATRACE_CALL();
...
if (!frameUsesClientComposition) {
sp<Fence> outPresentFence;
uint32_t state = UINT32_MAX;
// 如果所有的layer都能走device合成珍策,則在hwc里面直接present,若有不支持device合成的情況宅倒,則走GPU合成攘宙,會(huì)走validate邏輯
error = hwcDisplay->presentOrValidate(&numTypes, &numRequests, &outPresentFence , &state);
if (!hasChangesError(error)) {
RETURN_IF_HWC_ERROR_FOR("presentOrValidate", error, displayId, UNKNOWN_ERROR);
}
if (state == 1) { //Present Succeeded.
// present成功,數(shù)據(jù)直接提交給了hwc
std::unordered_map<HWC2::Layer*, sp<Fence>> releaseFences;
error = hwcDisplay->getReleaseFences(&releaseFences);
displayData.releaseFences = std::move(releaseFences);
displayData.lastPresentFence = outPresentFence;
displayData.validateWasSkipped = true;
displayData.presentError = error;
return NO_ERROR;
}
// Present failed but Validate ran.
} else {
// 若有GPU合成拐迁,則走validate邏輯
error = hwcDisplay->validate(&numTypes, &numRequests);
}
// 接收hwc過來的change蹭劈,對(duì)于device合成不走,GPU合成走的邏輯
...
prepareFrame 的作用是根據(jù)hwc的能力選擇合成方式线召,如果是device合成則直接走h(yuǎn)wc present上屏铺韧,如果是GPU合成則走h(yuǎn)wc validate,然后根據(jù)hwc過來的變化改變layer的合成方式缓淹。
finishFrame
文件: frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp
void Output::finishFrame(const compositionengine::CompositionRefreshArgs& refreshArgs) {
ATRACE_CALL();
ALOGV(__FUNCTION__);
if (!getState().isEnabled) {
return;
}
// Repaint the framebuffer (if needed), getting the optional fence for when
// the composition completes.
// 主要針對(duì)GPU合成的邏輯
auto optReadyFence = composeSurfaces(Region::INVALID_REGION, refreshArgs);
// device合成直接return
if (!optReadyFence) {
return;
}
// swap buffers (presentation)
mRenderSurface->queueBuffer(std::move(*optReadyFence));
}
composeSurfaces主要的邏輯是針對(duì)GPU合成哈打,對(duì)于device合成,直接return了讯壶。
postFramebuffer
文件:frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp
void Output::postFramebuffer() {
...
// device合成獲取release fence
auto frame = presentAndGetFrameFences();
mRenderSurface->onPresentDisplayCompleted();
for (auto* layer : getOutputLayersOrderedByZ()) {
// The layer buffer from the previous frame (if any) is released
// by HWC only when the release fence from this frame (if any) is
// signaled. Always get the release fence from HWC first.
sp<Fence> releaseFence = Fence::NO_FENCE;
if (auto hwcLayer = layer->getHwcLayer()) {
if (auto f = frame.layerFences.find(hwcLayer); f != frame.layerFences.end()) {
releaseFence = f->second;
}
}
if (outputState.usesClientComposition) {
releaseFence =
Fence::merge("LayerRelease", releaseFence, frame.clientTargetAcquireFence);
}
// 將releasefence放到mslot里面料仗,這個(gè)是dequeueBuffer等的fence
layer->getLayerFE().onLayerDisplayed(releaseFence);
}
...
}
文件:frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp
status_t HWComposer::presentAndGetReleaseFences(DisplayId displayId) {
ATRACE_CALL();
RETURN_IF_INVALID_DISPLAY(displayId, BAD_INDEX);
auto& displayData = mDisplayData[displayId];
auto& hwcDisplay = displayData.hwcDisplay;
// device合成直接return
if (displayData.validateWasSkipped) {
// explicitly flush all pending commands
auto error = static_cast<hal::Error>(mComposer->executeCommands());
RETURN_IF_HWC_ERROR_FOR("executeCommands", error, displayId, UNKNOWN_ERROR);
RETURN_IF_HWC_ERROR_FOR("present", displayData.presentError, displayId, UNKNOWN_ERROR);
return NO_ERROR;
}
//GPU 合成走present
auto error = hwcDisplay->present(&displayData.lastPresentFence);
RETURN_IF_HWC_ERROR_FOR("present", error, displayId, UNKNOWN_ERROR);
std::unordered_map<HWC2::Layer*, sp<Fence>> releaseFences;
error = hwcDisplay->getReleaseFences(&releaseFences);
RETURN_IF_HWC_ERROR_FOR("getReleaseFences", error, displayId, UNKNOWN_ERROR);
displayData.releaseFences = std::move(releaseFences);
return NO_ERROR;
}
postComposition
文件: frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
void SurfaceFlinger::postComposition()
{
ATRACE_CALL();
ALOGV("postComposition");
nsecs_t dequeueReadyTime = systemTime();
// release Bufferqueuelayer
for (auto& layer : mLayersWithQueuedFrames) {
layer->releasePendingBuffer(dequeueReadyTime);
}
...
// mPreviousPresentFences[0]是這一幀的present fence,mPreviousPresentFences[1]是上一幀的present fence
mPreviousPresentFences[1] = mPreviousPresentFences[0];
mPreviousPresentFences[0] =
display ? getHwComposer().getPresentFence(*display->getId()) : Fence::NO_FENCE;
...
// 這個(gè)有關(guān)vsync伏蚊,是校驗(yàn)presentfence釋放的時(shí)間戳
if (display && display->isPrimary() && display->getPowerMode() == hal::PowerMode::ON &&
presentFenceTime->isValid()) {
mScheduler->addPresentFence(presentFenceTime);
}
....
}
postComposition的作用就是釋放上一幀顯示的Buffer立轧,然后重新設(shè)置當(dāng)前幀的present fence,以及根據(jù)presentfence時(shí)間戳判斷是否重新打開HW Vsync和軟件Vsync進(jìn)行校準(zhǔn)。至此氛改,SurfaceFlinger刷新的主體函數(shù)分析完了帐萎,可以看出來,如果是走device合成胜卤,SurfaceFlinger是直接把layer信息提交給hwc疆导,由hwc去合成,涉及到GPU部分瑰艘,下篇進(jìn)行分析是鬼。