以下是Android 14中SurfaceFlinger::composite函数的逐行解析,详细说明其逻辑和关键代码的作用:
1. 函数签名与性能跟踪
void SurfaceFlinger::composite(TimePoint frameTime, VsyncId vsyncId)
FTL_FAKE_GUARD(kMainThreadContext) {
ATRACE_FORMAT("%s %" PRId64, __func__, vsyncId.value);
- 功能:函数入口,声明合成操作,记录性能跟踪信息。
FTL_FAKE_GUARD:标记当前代码段在kMainThreadContext线程上下文中运行(调试用)。ATRACE_FORMAT:记录函数名和vsyncId到性能跟踪系统(如Perfetto)。
2. 初始化合成参数
compositionengine::CompositionRefreshArgs refreshArgs;
const auto& displays = FTL_FAKE_GUARD(mStateLock, mDisplays);
refreshArgs.outputs.reserve(displays.size());
std::vector<DisplayId> displayIds;
- 功能:初始化合成引擎需要的参数
refreshArgs。 mDisplays:获取当前所有显示设备(受mStateLock保护)。outputs.reserve:预分配内存,避免动态扩容。displayIds:记录所有显示设备的ID。
3. 遍历显示设备
for (const auto& [_, display] : displays) {
bool dropFrame = false;
if (display->isVirtual()) {
Fps refreshRate = display->getAdjustedRefreshRate();
using fps_approx_ops::operator>;
dropFrame = (refreshRate > 0_Hz) && !mScheduler->isVsyncInPhase(frameTime, refreshRate);
}
if (!dropFrame) {
refreshArgs.outputs.push_back(display->getCompositionDisplay());
}
display->tracePowerMode();
displayIds.push_back(display->getId());
}
mPowerAdvisor->setDisplays(displayIds);
- 功能:遍历所有显示设备,决定是否丢弃当前帧。
- 虚拟显示:检查是否需要根据VSync相位丢弃帧(避免合成时机不匹配)。
tracePowerMode:记录显示设备的电源状态(用于调试或电源管理)。mPowerAdvisor->setDisplays:通知电源管理模块当前活动的显示设备。
4. 更新图层元数据快照
const bool updateTaskMetadata = mCompositionEngine->getFeatureFlags().test(
compositionengine::Feature::kSnapshotLayerMetadata);
if (updateTaskMetadata && (mVisibleRegionsDirty || mLayerMetadataSnapshotNeeded)) {
updateLayerMetadataSnapshot();
mLayerMetadataSnapshotNeeded = false;
}
- 功能:若启用元数据快照且需要更新,生成图层元数据快照。
kSnapshotLayerMetadata:合成引擎的特性标志,表示需要元数据快照。mVisibleRegionsDirty:可见区域是否变化(脏标记)。
5. 处理边框渲染
if (DOES_CONTAIN_BORDER) {
refreshArgs.borderInfoList.clear();
mDrawingState.traverse([&refreshArgs](Layer* layer) {
if (layer->isBorderEnabled()) {
compositionengine::BorderRenderInfo info;
info.width = layer->getBorderWidth();
info.color = layer->getBorderColor();
layer->traverse(LayerVector::StateSet::Drawing, [&info](Layer* ilayer) {
info.layerIds.push_back(ilayer->getSequence());
});
refreshArgs.borderInfoList.emplace_back(std::move(info));
}
});
}
- 功能:若启用边框渲染,收集所有启用边框的图层信息。
- 遍历所有图层,收集边框宽度、颜色及其子图层的ID。
6. 清理待释放缓冲区
refreshArgs.bufferIdsToUncache = std::move(mBufferIdsToUncache);
- 功能:将待释放的缓冲区ID传递给合成引擎(避免内存泄漏)。
7. 收集有排队帧的图层
refreshArgs.layersWithQueuedFrames.reserve(mLayersWithQueuedFrames.size());
for (auto layer : mLayersWithQueuedFrames) {
if (auto layerFE = layer->getCompositionEngineLayerFE())
refreshArgs.layersWithQueuedFrames.push_back(layerFE);
}
- 功能:将需要合成的图层前端(LayerFE)添加到参数中。
mLayersWithQueuedFrames:当前有未处理帧的图层列表。
8. 颜色管理配置
refreshArgs.outputColorSetting = useColorManagement
? mDisplayColorSetting
: compositionengine::OutputColorSetting::kUnmanaged;
refreshArgs.colorSpaceAgnosticDataspace = mColorSpaceAgnosticDataspace;
refreshArgs.forceOutputColorMode = mForceColorMode;
- 功能:配置颜色空间、数据空间和强制颜色模式。
useColorManagement:是否启用颜色管理(如HDR)。
9. 几何更新标记
refreshArgs.updatingOutputGeometryThisFrame = mVisibleRegionsDirty;
refreshArgs.updatingGeometryThisFrame = mGeometryDirty.exchange(false) || mVisibleRegionsDirty;
refreshArgs.internalDisplayRotationFlags = getActiveDisplayRotationFlags();
- 功能:标记几何信息是否更新(如屏幕旋转、图层位置变化)。
mVisibleRegionsDirty:可见区域是否变化。mGeometryDirty:几何信息是否变化(原子变量,交换后重置)。
10. 颜色矩阵更新
if (CC_UNLIKELY(mDrawingState.colorMatrixChanged)) {
ref

最低0.47元/天 解锁文章
915

被折叠的 条评论
为什么被折叠?



