SurfaceFlinger的composite

以下是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
给定引用内容未提及Surfaceflinger中onFrameSignal只有commit没有composite的原因及解决办法。一般而言,Surfaceflinger里onFrameSignal只有commit没有composite可能存在以下原因及对应解决办法: ### 原因 - **事务处理问题**:在事务处理阶段,若事务提交后某些关键标志位未正确设置,就可能致使合成操作无法被触发。例如,SurfaceFlinger在处理变化后会调用`SurfaceFlinger::setTransactionFlags`来记录需要重新合成,若该标志位设置有误,合成操作便不会执行[^2]。 - **Buffer状态异常**:Buffer的latch和release状态对合成操作有重要影响。若`latchBuffer`或`releaseBuffer`操作出现问题,像`latchBuffer`未能正确将buffer信息存入`BufferInfo`,或者`releaseBuffer`未正确释放对应Buffer,都可能导致合成操作无法正常进行[^1]。 - **VSync信号问题**:VSync信号是触发合成操作的关键因素。若VSync信号请求失败或者信号未正常传递,合成操作就无法被触发。比如在请求VSync信号的流程中,某个环节出现错误,就会影响合成操作的执行[^2]。 ### 解决办法 - **检查事务处理逻辑**:对事务处理代码进行检查,保证`SurfaceFlinger::setTransactionFlags`等关键函数能正确设置标志位。可添加日志输出,对标志位的设置情况进行监控。 ```cpp // 在SurfaceFlinger::setTransactionFlags中添加日志 void SurfaceFlinger::setTransactionFlags(TransactionFlags flags) { ALOGD("Setting transaction flags: %d", flags); mTransactionFlags |= flags; } ``` - **排查Buffer状态**:检查`latchBuffer`和`releaseBuffer`的实现,确保buffer信息能正确存储和释放。可添加调试信息,对Buffer的状态进行跟踪。 ```cpp // 在latchBuffer中添加调试信息 void SurfaceFlinger::latchBuffer(BufferInfo& bufferInfo) { ALOGD("Latching buffer: %p", &bufferInfo); // 存储buffer信息的代码 } ``` - **检查VSync信号请求流程**:对VSync信号请求的代码进行检查,确保请求流程正常。可添加日志输出,对VSync信号的请求和接收情况进行监控。 ```cpp // 在请求VSync信号的函数中添加日志 void SurfaceFlinger::requestVSync() { ALOGD("Requesting VSync signal"); // 请求VSync信号的代码 } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值