SurfaceFlinger Layer 到 HWC 通信流程详解

SurfaceFlinger Layer 到 HWC 通信流程详解

概述

本文档详细描述 Android 14 (AOSP android-14.0.0_r21) 中 SurfaceFlinger 的 Layer 如何转变为 OutputLayer,以及如何与 Hardware Composer (HWC) 进行通信的完整流程。


一、核心类关系图

scss 复制代码
┌─────────────────────────────────────────────────────────────────────────────┐
│                              SurfaceFlinger                                  │
│  ┌─────────────────┐                                                        │
│  │     Layer       │ ───────────────────────────────────────────┐           │
│  │  (前端层对象)    │                                          │           │
│  └────────┬────────┘                                          │           │
│           │ getCompositionEngineLayerFE()                      │           │
│           ▼                                                   │           │
│  ┌─────────────────┐                                          │           │
│  │     LayerFE     │ (Layer FrontEnd - 组合引擎前端接口)        │           │
│  └────────┬────────┘                                          │           │
└───────────┼───────────────────────────────────────────────────┼───────────┘
            │                                                   │
            │ 包含 LayerFECompositionState                      │
            ▼                                                   │
┌───────────────────────────────────────────────────────────────┼───────────┐
│                     CompositionEngine                          │           │
│  ┌─────────────────────────────────────────────────────────────┼──────┐   │
│  │                      Display                                 │      │   │
│  │  ┌──────────────────────────────────────────────────────────┼───┐  │   │
│  │  │                    Output                                 │   │  │   │
│  │  │  ┌───────────────────────────────────────────────────────┼─┐│  │   │
│  │  │  │              OutputLayer                              │ ││  │   │
│  │  │  │  ┌─────────────────┐    ┌──────────────────────────┐ │ ││  │   │
│  │  │  │  │   LayerFE&      │    │ OutputLayerComposition   │ │ ││  │   │
│  │  │  │  │   (引用)        │    │ State (组合状态)          │ │ ││  │   │
│  │  │  │  └─────────────────┘    └──────────────────────────┘ │ ││  │   │
│  │  │  │                          │                           │ ││  │   │
│  │  │  │                          │ 包含 Hwc state            │ ││  │   │
│  │  │  │                          ▼                           │ ││  │   │
│  │  │  │              ┌───────────────────────┐               │ ││  │   │
│  │  │  │              │   HWC2::Layer*        │◄──────────────┼─┼┼──┼──┤
│  │  │  │              │   (HWC 硬件层)        │               │ ││  │   │
│  │  │  │              └───────────────────────┘               │ ││  │   │
│  │  │  └──────────────────────────────────────────────────────┘ ││  │   │
│  │  └────────────────────────────────────────────────────────────┘│  │   │
│  └─────────────────────────────────────────────────────────────────┘  │   │
└────────────────────────────────────────────────────────────────────────┘   │
                                                                              │
┌─────────────────────────────────────────────────────────────────────────────┘
│  ┌─────────────────────────────────────────────────────────────────────┐
│  │                          HWComposer                                  │
│  │  ┌───────────────────────────────────────────────────────────────┐  │
│  │  │                    HWC2::Display                               │  │
│  │  │  ┌─────────────────────────────────────────────────────────┐  │  │
│  │  │  │                  HWC2::Layer                             │  │  │
│  │  │  │  (硬件抽象层 - 与 HAL 通信)                               │  │  │
│  │  │  └─────────────────────────────────────────────────────────┘  │  │
│  │  └───────────────────────────────────────────────────────────────┘  │
│  └─────────────────────────────────────────────────────────────────────┘
└─────────────────────────────────────────────────────────────────────────────┘

二、完整调用流程

阶段 1: SurfaceFlinger 入口

2.1 SurfaceFlinger::composite() - 组合入口

文件路径 : frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

cpp 复制代码
// SurfaceFlinger.cpp:2489
CompositeResultsPerDisplay SurfaceFlinger::composite(
        PhysicalDisplayId pacesetterId, const scheduler::FrameTargeters& frameTargeters) {
    const scheduler::FrameTarget& pacesetterTarget =
            frameTargeters.get(pacesetterId)->get()->target();

    const VsyncId vsyncId = pacesetterTarget.vsyncId();
    ATRACE_NAME(ftl::Concat(__func__, ' ', ftl::to_underlying(vsyncId)).c_str());

    // 构建组合刷新参数
    compositionengine::CompositionRefreshArgs refreshArgs;
    refreshArgs.powerCallback = this;
    const auto& displays = FTL_FAKE_GUARD(mStateLock, mDisplays);
    refreshArgs.outputs.reserve(displays.size());

    // 添加物理显示器的输出
    for (const auto& [id, targeter] : frameTargeters) {
        ftl::FakeGuard guard(mStateLock);
        if (const auto display = getCompositionDisplayLocked(id)) {
            refreshArgs.outputs.push_back(display);
        }
    }

    // 添加虚拟显示器的输出
    for (const auto& [_, display] : displays) {
        if (display->isVirtual()) {
            const Fps refreshRate = display->getAdjustedRefreshRate();
            if (!refreshRate.isValid() ||
                mScheduler->isVsyncInPhase(pacesetterTarget.frameBeginTime(), refreshRate)) {
                refreshArgs.outputs.push_back(display->getCompositionDisplay());
            }
        }
    }

    // 收集有队列帧的 Layer
    refreshArgs.layersWithQueuedFrames.reserve(mLayersWithQueuedFrames.size());
    for (auto layer : mLayersWithQueuedFrames) {
        if (auto layerFE = layer->getCompositionEngineLayerFE())
            refreshArgs.layersWithQueuedFrames.push_back(layerFE);
    }

    // 设置各种刷新参数
    refreshArgs.outputColorSetting = useColorManagement ? mDisplayColorSetting
                                                        : compositionengine::OutputColorSetting::kUnmanaged;
    refreshArgs.updatingOutputGeometryThisFrame = mVisibleRegionsDirty;
    refreshArgs.updatingGeometryThisFrame = mGeometryDirty.exchange(false) || mVisibleRegionsDirty;
    refreshArgs.internalDisplayRotationFlags = getActiveDisplayRotationFlags();
    refreshArgs.devOptForceClientComposition = mDebugDisableHWC;

    // ★★★ 调用 CompositionEngine 进行呈现 ★★★
    mCompositionEngine->present(refreshArgs);

    // ... 后续处理
}

阶段 2: CompositionEngine 主流程

2.2 CompositionEngine::present() - 引擎入口

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp

cpp 复制代码
// CompositionEngine.cpp:75
void CompositionEngine::present(CompositionRefreshArgs& args) {
    ATRACE_CALL();
    ALOGV(__FUNCTION__);

    // 预组合处理
    preComposition(args);

    {
        // 用于跟踪已锁定的前端层状态
        LayerFESet latchedLayers;

        // 为每个输出准备(重建 Layer 栈)
        for (const auto& output : args.outputs) {
            output->prepare(args, latchedLayers);
        }
    }

    // 为每个输出执行呈现
    for (const auto& output : args.outputs) {
        output->present(args);
    }
}
2.3 Output::prepare() - 准备阶段

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

cpp 复制代码
// Output.cpp:420
void Output::prepare(const compositionengine::CompositionRefreshArgs& refreshArgs,
                     LayerFESet& geomSnapshots) {
    ATRACE_CALL();
    ALOGV(__FUNCTION__);

    // ★★★ 重建 Layer 栈 - 创建 OutputLayer ★★★
    rebuildLayerStacks(refreshArgs, geomSnapshots);

    // 清理缓冲区缓存
    uncacheBuffers(refreshArgs.bufferIdsToUncache);
}

阶段 3: 重建 Layer 栈 (rebuildLayerStacks)

2.4 Output::rebuildLayerStacks() - 重建 Layer 栈

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

cpp 复制代码
// Output.cpp:471
void Output::rebuildLayerStacks(const compositionengine::CompositionRefreshArgs& refreshArgs,
                                LayerFESet& layerFESet) {
    ATRACE_CALL();
    ALOGV(__FUNCTION__);

    auto& outputState = editState();

    // 如果输出未启用或不需要更新几何,直接返回
    if (!outputState.isEnabled || CC_LIKELY(!refreshArgs.updatingOutputGeometryThisFrame)) {
        return;
    }

    // 处理 Layer 以确定可见性和覆盖区域
    compositionengine::Output::CoverageState coverage{layerFESet};
    coverage.aboveCoveredLayersExcludingOverlays = refreshArgs.hasTrustedPresentationListener
            ? std::make_optional<Region>()
            : std::nullopt;

    // ★★★ 收集可见 Layer ★★★
    collectVisibleLayers(refreshArgs, coverage);

    // 计算并存储覆盖信息
    const ui::Transform& tr = outputState.transform;
    Region undefinedRegion{outputState.displaySpace.getBoundsAsRect()};
    undefinedRegion.subtractSelf(tr.transform(coverage.aboveOpaqueLayers));

    outputState.undefinedRegion = undefinedRegion;
    outputState.dirtyRegion.orSelf(coverage.dirtyRegion);
}
2.5 Output::collectVisibleLayers() - 收集可见 Layer

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

cpp 复制代码
// Output.cpp:493
void Output::collectVisibleLayers(const compositionengine::CompositionRefreshArgs& refreshArgs,
                                  compositionengine::Output::CoverageState& coverage) {
    // 从前到后遍历 Layer 以确定可见性
    for (auto layer : reversed(refreshArgs.layers)) {
        // 为每个 Layer 增量处理覆盖信息
        ensureOutputLayerIfVisible(layer, coverage);
    }

    setReleasedLayers(refreshArgs);
    finalizePendingOutputLayers();
}
2.6 Output::ensureOutputLayerIfVisible() - 确保可见 Layer 有 OutputLayer

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

cpp 复制代码
// Output.cpp:516
void Output::ensureOutputLayerIfVisible(sp<compositionengine::LayerFE>& layerFE,
                                        compositionengine::Output::CoverageState& coverage) {
    // 确保每个候选 Layer 只锁定一次快照
    if (!coverage.latchedLayers.count(layerFE)) {
        coverage.latchedLayers.insert(layerFE);
    }

    // 只考虑在此输出上的 Layer
    if (!includesLayer(layerFE)) {
        return;
    }

    // 获取前端层状态
    const auto* layerFEState = layerFE->getCompositionState();
    if (CC_UNLIKELY(!layerFEState)) {
        return;
    }

    // 处理隐藏表面
    if (CC_UNLIKELY(!layerFEState->isVisible)) {
        return;
    }

    // 计算各种区域(可见区域、不透明区域、覆盖区域等)
    Region opaqueRegion;
    Region visibleRegion;
    Region coveredRegion;
    Region transparentRegion;
    Region shadowRegion;

    const ui::Transform& tr = layerFEState->geomLayerTransform;
    const Rect visibleRect(tr.transform(layerFEState->geomLayerBounds));
    visibleRegion.set(visibleRect);

    // 处理阴影
    if (layerFEState->shadowRadius > 0.0f) {
        const auto inset = static_cast<int32_t>(ceilf(layerFEState->shadowRadius) * -1.0f);
        Rect visibleRectWithShadows(visibleRect);
        visibleRectWithShadows.inset(inset, inset, inset, inset);
        visibleRegion.set(visibleRectWithShadows);
        shadowRegion = visibleRegion.subtract(visibleRect);
    }

    // 如果可见区域为空,直接返回
    if (visibleRegion.isEmpty()) {
        return;
    }

    // 计算不透明区域
    const auto layerOrientation = tr.getOrientation();
    if (layerFEState->isOpaque && ((layerOrientation & ui::Transform::ROT_INVALID) == 0)) {
        opaqueRegion.set(visibleRect);
    }

    // 计算覆盖区域
    coveredRegion = coverage.aboveCoveredLayers.intersect(visibleRegion);
    coverage.aboveCoveredLayers.orSelf(visibleRegion);

    // 减去上方不透明区域
    visibleRegion.subtractSelf(coverage.aboveOpaqueLayers);

    if (visibleRegion.isEmpty()) {
        return;
    }

    // 获取之前显示的覆盖信息
    auto prevOutputLayerIndex = findCurrentOutputLayerForLayer(layerFE);

    // ★★★ Layer 可见,获取或创建 OutputLayer ★★★
    auto result = ensureOutputLayer(prevOutputLayerIndex, layerFE);

    // 存储 Layer 覆盖信息到状态
    auto& outputLayerState = result->editState();
    outputLayerState.visibleRegion = visibleRegion;
    outputLayerState.visibleNonTransparentRegion = visibleRegion.subtract(transparentRegion);
    outputLayerState.coveredRegion = coveredRegion;
    outputLayerState.outputSpaceVisibleRegion = outputState.transform.transform(
            visibleRegion.subtract(shadowRegion).intersect(outputState.layerStackSpace.getContent()));
    outputLayerState.shadowRegion = shadowRegion;

    // 更新上方不透明区域
    coverage.aboveOpaqueLayers.orSelf(opaqueRegion);
}

阶段 4: 创建 OutputLayer

2.7 impl::Output::ensureOutputLayer() - 模板实现

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h

cpp 复制代码
// 在 createOutputTemplated 模板中定义
template <typename BaseOutput, typename CompositionEngine, typename... Args>
std::shared_ptr<BaseOutput> createOutputTemplated(const CompositionEngine& compositionEngine,
                                                  Args... args) {
    class Output final : public BaseOutput {
    public:
        // ...

        // ★★★ ensureOutputLayer 的核心实现 ★★★
        OutputLayer* ensureOutputLayer(std::optional<size_t> prevIndex,
                                       const sp<LayerFE>& layerFE) {
            // 判断是否可以复用已有的 OutputLayer
            auto outputLayer = (prevIndex && *prevIndex <= mCurrentOutputLayersOrderedByZ.size())
                    ? std::move(mCurrentOutputLayersOrderedByZ[*prevIndex])  // 复用已有的
                    : BaseOutput::createOutputLayer(layerFE);                 // ★ 创建新的

            auto result = outputLayer.get();

            // 将 OutputLayer 添加到待处理列表
            mPendingOutputLayersOrderedByZ.emplace_back(std::move(outputLayer));

            return result;
        }

    private:
        std::vector<std::unique_ptr<OutputLayer>> mCurrentOutputLayersOrderedByZ;
        std::vector<std::unique_ptr<OutputLayer>> mPendingOutputLayersOrderedByZ;
    };

    return std::make_shared<Output>(compositionEngine, std::forward<Args>(args)...);
}
2.8 Output::createOutputLayer() - 基类实现

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

cpp 复制代码
// Output.cpp:396
std::unique_ptr<compositionengine::OutputLayer> Output::createOutputLayer(
        const sp<LayerFE>& layerFE) const {
    return impl::createOutputLayer(*this, layerFE);
}
2.9 Display::createOutputLayer() - Display 重写实现

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Display.cpp

cpp 复制代码
// Display.cpp:156
std::unique_ptr<compositionengine::OutputLayer> Display::createOutputLayer(
        const sp<compositionengine::LayerFE>& layerFE) const {
    // ★ 步骤 1: 创建 OutputLayer 对象
    auto outputLayer = impl::createOutputLayer(*this, layerFE);

    // ★ 步骤 2: 如果是 HWC 支持的显示,创建 HWC Layer
    if (const auto halDisplayId = HalDisplayId::tryCast(mId);
        outputLayer && !mIsDisconnected && halDisplayId) {

        auto& hwc = getCompositionEngine().getHwComposer();

        // ★★★ 创建 HWC Layer ★★★
        auto hwcLayer = hwc.createLayer(*halDisplayId);

        ALOGE_IF(!hwcLayer, "Failed to create a HWC layer for a HWC supported display %s",
                 getName().c_str());

        // ★ 步骤 3: 将 HWC Layer 设置到 OutputLayer
        outputLayer->setHwcLayer(std::move(hwcLayer));
    }
    return outputLayer;
}

阶段 5: HWC Layer 创建

2.10 HWComposer::createLayer() - HWC 创建 Layer

文件路径 : frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp

cpp 复制代码
// HWComposer.cpp:326
std::shared_ptr<HWC2::Layer> HWComposer::createLayer(HalDisplayId displayId) {
    RETURN_IF_INVALID_DISPLAY(displayId, nullptr);

    // 调用 HWC2::Display 创建 Layer
    auto expected = mDisplayData[displayId].hwcDisplay->createLayer();
    if (!expected.has_value()) {
        auto error = std::move(expected).error();
        RETURN_IF_HWC_ERROR(error, displayId, nullptr);
    }
    return std::move(expected).value();
}
2.11 HWC2::Display::createLayer() - HWC2 创建 Layer

文件路径 : frameworks/native/services/surfaceflinger/DisplayHardware/HWC2.cpp

cpp 复制代码
// HWC2.cpp:175
base::expected<std::shared_ptr<HWC2::Layer>, hal::Error> Display::createLayer() {
    HWLayerId layerId = 0;

    // ★★★ 调用 Composer HAL 创建 Layer ★★★
    auto intError = mComposer.createLayer(mId, &layerId);
    auto error = static_cast<Error>(intError);
    if (error != Error::NONE) {
        return base::unexpected(error);
    }

    // 创建 HWC2::impl::Layer 对象
    auto layer = std::make_shared<impl::Layer>(mComposer, mCapabilities, *this, layerId);

    // 存储到 Layer 映射表
    mLayers.emplace(layerId, layer);
    return layer;
}

阶段 6: OutputLayer 与 HWC Layer 关联

2.12 impl::createOutputLayer() - 创建 OutputLayer

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp

cpp 复制代码
// OutputLayer.cpp:59
std::unique_ptr<OutputLayer> createOutputLayer(const compositionengine::Output& output,
                                               const sp<compositionengine::LayerFE>& layerFE) {
    return createOutputLayerTemplated<OutputLayer>(output, layerFE);
}
2.13 createOutputLayerTemplated() - 模板实现

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayer.h

cpp 复制代码
// OutputLayer.h
template <typename BaseOutputLayer>
std::unique_ptr<BaseOutputLayer> createOutputLayerTemplated(const Output& output,
                                                            sp<LayerFE> layerFE) {
    // 定义局部类 OutputLayer,继承自 BaseOutputLayer
    class OutputLayer final : public BaseOutputLayer {
    public:
        using OutputLayerCompositionState = std::remove_const_t<
                std::remove_reference_t<decltype(std::declval<BaseOutputLayer>().getState())>>;
        using Output = std::remove_const_t<
                std::remove_reference_t<decltype(std::declval<BaseOutputLayer>().getOutput())>>;
        using LayerFE =
                std::remove_reference_t<decltype(std::declval<BaseOutputLayer>().getLayerFE())>>;

        // ★★★ 构造函数 ★★★
        OutputLayer(const Output& output, const sp<LayerFE>& layerFE)
              : mOutput(output),        // 存储 Output 引用
                mLayerFE(layerFE)       // 存储 LayerFE 引用
        {}

        ~OutputLayer() override = default;

    private:
        const Output& getOutput() const override { return mOutput; }
        LayerFE& getLayerFE() const override { return *mLayerFE; }
        const OutputLayerCompositionState& getState() const override { return mState; }
        OutputLayerCompositionState& editState() override { return mState; }
        void dumpState(std::string& out) const override { mState.dump(out); }

        const Output& mOutput;                              // Output 引用
        const sp<LayerFE> mLayerFE;                         // LayerFE 智能指针
        OutputLayerCompositionState mState;                 // 组合状态
    };

    return std::make_unique<OutputLayer>(output, layerFE);
}
2.14 OutputLayer::setHwcLayer() - 建立关联

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp

cpp 复制代码
// OutputLayer.cpp:66
void OutputLayer::setHwcLayer(std::shared_ptr<HWC2::Layer> hwcLayer) {
    auto& state = editState();
    if (hwcLayer) {
        // ★★★ 将 HWC Layer 存储到 OutputLayer 的状态中 ★★★
        state.hwc.emplace(std::move(hwcLayer));
    } else {
        state.hwc.reset();
    }
}

阶段 7: Output::present() 主流程

2.15 Output::present() - 呈现主流程

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

cpp 复制代码
// Output.cpp:445
void Output::present(const compositionengine::CompositionRefreshArgs& refreshArgs) {
    ATRACE_FORMAT("%s for %s", __func__, mNamePlusId.c_str());
    ALOGV(__FUNCTION__);

    // 1. 更新颜色配置
    updateColorProfile(refreshArgs);

    // 2. 更新组合状态(在 prepare 阶段已重建 Layer 栈)
    updateCompositionState(refreshArgs);

    // 3. 规划组合策略
    planComposition();

    // 4. 写入组合状态到 HWC
    writeCompositionState(refreshArgs);

    // 5. 设置颜色变换
    setColorTransform(refreshArgs);

    // 6. 开始帧
    beginFrame();

    // 7. 准备帧(与 HWC 交互)
    GpuCompositionResult result;
    const bool predictCompositionStrategy = canPredictCompositionStrategy(refreshArgs);
    if (predictCompositionStrategy) {
        result = prepareFrameAsync();
    } else {
        prepareFrame();
    }

    // 8. 开发选项:重绘闪烁
    devOptRepaintFlash(refreshArgs);

    // 9. 完成帧(GPU 合成)
    finishFrame(std::move(result));

    // 10. 提交帧缓冲
    postFramebuffer();

    // 11. 渲染缓存集
    renderCachedSets(refreshArgs);
}

阶段 8: 更新组合状态

2.16 Output::updateCompositionState() - 更新组合状态

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

cpp 复制代码
// Output.cpp:755
void Output::updateCompositionState(const compositionengine::CompositionRefreshArgs& refreshArgs) {
    ATRACE_CALL();
    ALOGV(__FUNCTION__);

    if (!getState().isEnabled) {
        return;
    }

    // 查找请求背景模糊的 Layer
    mLayerRequestingBackgroundBlur = findLayerRequestingBackgroundComposition();
    bool forceClientComposition = mLayerRequestingBackgroundBlur != nullptr;

    // 为每个 OutputLayer 更新组合状态
    for (auto* layer : getOutputLayersOrderedByZ()) {
        layer->updateCompositionState(refreshArgs.updatingGeometryThisFrame,
                                      refreshArgs.devOptForceClientComposition ||
                                              forceClientComposition,
                                      refreshArgs.internalDisplayRotationFlags);

        if (mLayerRequestingBackgroundBlur == layer) {
            forceClientComposition = false;
        }
    }

    updateCompositionStateForBorder(refreshArgs);
}
2.17 OutputLayer::updateCompositionState() - 更新 Layer 组合状态

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp

cpp 复制代码
// OutputLayer.cpp:296
void OutputLayer::updateCompositionState(
        bool includeGeometry, bool forceClientComposition,
        ui::Transform::RotationFlags internalDisplayRotationFlags) {
    const auto* layerFEState = getLayerFE().getCompositionState();
    if (!layerFEState) {
        return;
    }

    const auto& outputState = getOutput().getState();
    const auto& profile = *getOutput().getDisplayColorProfile();
    auto& state = editState();

    if (includeGeometry) {
        // 清除强制客户端组合标志
        state.forceClientComposition = false;

        // ★★★ 计算输出相关几何状态 ★★★
        state.displayFrame = calculateOutputDisplayFrame();
        state.sourceCrop = calculateOutputSourceCrop(internalDisplayRotationFlags);
        state.bufferTransform = static_cast<Hwc2::Transform>(
                calculateOutputRelativeBufferTransform(internalDisplayRotationFlags));

        // 安全检查:安全 Layer 在非安全输出上需要客户端组合
        if ((layerFEState->isSecure && !outputState.isSecure) ||
            (state.bufferTransform & ui::Transform::ROT_INVALID)) {
            state.forceClientComposition = true;
        }
    }

    // 确定数据空间
    state.dataspace = layerFEState->isColorspaceAgnostic &&
                    outputState.targetDataspace != ui::Dataspace::UNKNOWN
            ? outputState.targetDataspace
            : layerFEState->dataspace;

    // 检查是否需要强制客户端组合
    if (layerFEState->forceClientComposition ||
        !profile.isDataspaceSupported(state.dataspace) ||
        forceClientComposition) {
        state.forceClientComposition = true;
    }
}

阶段 9: 写入状态到 HWC

2.18 Output::writeCompositionState() - 写入组合状态

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

cpp 复制代码
// Output.cpp:830
void Output::writeCompositionState(const compositionengine::CompositionRefreshArgs& refreshArgs) {
    ATRACE_CALL();
    ALOGV(__FUNCTION__);

    if (!getState().isEnabled) {
        return;
    }

    uint32_t z = 0;
    for (auto* layer : getOutputLayersOrderedByZ()) {
        layer->writeStateToHWC(refreshArgs.updatingGeometryThisFrame,
                               /* skipLayer */ false, z,
                               /* zIsOverridden */ false, /* isPeekingThrough */ false);
        z++;
    }
}
2.19 OutputLayer::writeStateToHWC() - 写入状态到 HWC

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp

cpp 复制代码
// OutputLayer.cpp:380
void OutputLayer::writeStateToHWC(bool includeGeometry, bool skipLayer, uint32_t z,
                                  bool zIsOverridden, bool isPeekingThrough) {
    const auto& state = getState();

    // 如果没有 HWC 接口,直接返回
    if (!state.hwc) {
        return;
    }

    auto& hwcLayer = (*state.hwc).hwcLayer;
    if (!hwcLayer) {
        ALOGE("[%s] failed to write composition state to HWC -- no hwcLayer for output %s",
              getLayerFE().getDebugName(), getOutput().getName().c_str());
        return;
    }

    const auto* outputIndependentState = getLayerFE().getCompositionState();
    if (!outputIndependentState) {
        return;
    }

    auto requestedCompositionType = outputIndependentState->compositionType;

    // 处理覆盖缓冲区的情况
    if (requestedCompositionType == Composition::SOLID_COLOR && state.overrideInfo.buffer) {
        requestedCompositionType = Composition::DEVICE;
    }

    const bool isOverridden = state.overrideInfo.buffer != nullptr || isPeekingThrough || zIsOverridden;
    const bool prevOverridden = state.hwc->stateOverridden;

    // ★★★ 1. 写入几何状态 ★★★
    if (isOverridden || prevOverridden || skipLayer || includeGeometry) {
        writeOutputDependentGeometryStateToHWC(hwcLayer.get(), requestedCompositionType, z);
        writeOutputIndependentGeometryStateToHWC(hwcLayer.get(), *outputIndependentState, skipLayer);
    }

    // ★★★ 2. 写入每帧状态 ★★★
    writeOutputDependentPerFrameStateToHWC(hwcLayer.get());
    writeOutputIndependentPerFrameStateToHWC(hwcLayer.get(), *outputIndependentState,
                                             requestedCompositionType, skipLayer);

    // ★★★ 3. 写入组合类型 ★★★
    writeCompositionTypeToHWC(hwcLayer.get(), requestedCompositionType, isPeekingThrough,
                              skipLayer);

    // 处理纯色 Layer
    if (requestedCompositionType == Composition::SOLID_COLOR) {
        writeSolidColorStateToHWC(hwcLayer.get(), *outputIndependentState);
    }

    editState().hwc->stateOverridden = isOverridden;
    editState().hwc->layerSkipped = skipLayer;
}
2.20 writeOutputDependentGeometryStateToHWC() - 写入几何状态

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp

cpp 复制代码
// OutputLayer.cpp:430
void OutputLayer::writeOutputDependentGeometryStateToHWC(HWC2::Layer* hwcLayer,
                                                         Composition requestedCompositionType,
                                                         uint32_t z) {
    const auto& outputDependentState = getState();

    Rect displayFrame = outputDependentState.displayFrame;
    FloatRect sourceCrop = outputDependentState.sourceCrop;

    // 处理覆盖缓冲区的情况
    if (outputDependentState.overrideInfo.buffer != nullptr) {
        displayFrame = outputDependentState.overrideInfo.displayFrame;
        sourceCrop = FloatRect(0.f, 0.f,
                          static_cast<float>(outputDependentState.overrideInfo.buffer->getBuffer()->getWidth()),
                          static_cast<float>(outputDependentState.overrideInfo.buffer->getBuffer()->getHeight()));
    }

    // ★ 设置显示帧
    if (auto error = hwcLayer->setDisplayFrame(displayFrame); error != hal::Error::NONE) {
        ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)",
              getLayerFE().getDebugName(), displayFrame.left, displayFrame.top,
              displayFrame.right, displayFrame.bottom, to_string(error).c_str(),
              static_cast<int32_t>(error));
    }

    // ★ 设置源裁剪
    if (auto error = hwcLayer->setSourceCrop(sourceCrop); error != hal::Error::NONE) {
        ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: %s (%d)",
              getLayerFE().getDebugName(), sourceCrop.left, sourceCrop.top,
              sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(),
              static_cast<int32_t>(error));
    }

    // ★ 设置 Z 顺序
    if (auto error = hwcLayer->setZOrder(z); error != hal::Error::NONE) {
        ALOGE("[%s] Failed to set Z %u: %s (%d)", getLayerFE().getDebugName(), z,
              to_string(error).c_str(), static_cast<int32_t>(error));
    }

    // ★ 设置变换
    const auto bufferTransform = (requestedCompositionType != Composition::SOLID_COLOR &&
                                  getState().overrideInfo.buffer == nullptr)
            ? outputDependentState.bufferTransform
            : static_cast<hal::Transform>(0);
    if (auto error = hwcLayer->setTransform(static_cast<hal::Transform>(bufferTransform));
        error != hal::Error::NONE) {
        ALOGE("[%s] Failed to set transform %s: %s (%d)", getLayerFE().getDebugName(),
              toString(outputDependentState.bufferTransform).c_str(),
              to_string(error).c_str(), static_cast<int32_t>(error));
    }
}
2.21 writeOutputIndependentGeometryStateToHWC() - 写入独立几何状态

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp

cpp 复制代码
// OutputLayer.cpp:480
void OutputLayer::writeOutputIndependentGeometryStateToHWC(
        HWC2::Layer* hwcLayer, const LayerFECompositionState& outputIndependentState,
        bool skipLayer) {
    // 设置混合模式
    const auto& overrideInfo = getState().overrideInfo;
    const auto blendMode = overrideInfo.buffer || overrideInfo.peekThroughLayer
            ? hardware::graphics::composer::hal::BlendMode::PREMULTIPLIED
            : outputIndependentState.blendMode;
    if (auto error = hwcLayer->setBlendMode(blendMode); error != hal::Error::NONE) {
        ALOGE("[%s] Failed to set blend mode %s: %s (%d)", getLayerFE().getDebugName(),
              toString(blendMode).c_str(), to_string(error).c_str(), static_cast<int32_t>(error));
    }

    // 设置平面透明度
    const float alpha = skipLayer ? 0.0f
            : (getState().overrideInfo.buffer ? 1.0f : outputIndependentState.alpha);
    if (auto error = hwcLayer->setPlaneAlpha(alpha); error != hal::Error::NONE) {
        ALOGE("[%s] Failed to set plane alpha %.3f: %s (%d)", getLayerFE().getDebugName(), alpha,
              to_string(error).c_str(), static_cast<int32_t>(error));
    }

    // 设置通用元数据
    for (const auto& [name, entry] : outputIndependentState.metadata) {
        if (auto error = hwcLayer->setLayerGenericMetadata(name, entry.mandatory, entry.value);
            error != hal::Error::NONE) {
            ALOGE("[%s] Failed to set generic metadata %s %s (%d)", getLayerFE().getDebugName(),
                  name.c_str(), to_string(error).c_str(), static_cast<int32_t>(error));
        }
    }
}
2.22 writeOutputDependentPerFrameStateToHWC() - 写入每帧状态

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp

cpp 复制代码
// OutputLayer.cpp:510
void OutputLayer::writeOutputDependentPerFrameStateToHWC(HWC2::Layer* hwcLayer) {
    const auto& outputDependentState = getState();

    // 设置可见区域
    Region visibleRegion = outputDependentState.overrideInfo.buffer
            ? Region(outputDependentState.overrideInfo.visibleRegion)
            : outputDependentState.outputSpaceVisibleRegion;
    if (auto error = hwcLayer->setVisibleRegion(visibleRegion); error != hal::Error::NONE) {
        ALOGE("[%s] Failed to set visible region: %s (%d)", getLayerFE().getDebugName(),
              to_string(error).c_str(), static_cast<int32_t>(error));
    }

    // 设置阻塞区域
    if (auto error = hwcLayer->setBlockingRegion(outputDependentState.outputSpaceBlockingRegionHint);
        error != hal::Error::NONE) {
        ALOGE("[%s] Failed to set blocking region: %s (%d)", getLayerFE().getDebugName(),
              to_string(error).c_str(), static_cast<int32_t>(error));
    }

    // 设置数据空间
    const auto dataspace = outputDependentState.overrideInfo.buffer
            ? outputDependentState.overrideInfo.dataspace
            : outputDependentState.dataspace;
    if (auto error = hwcLayer->setDataspace(dataspace); error != hal::Error::NONE) {
        ALOGE("[%s] Failed to set dataspace %d: %s (%d)", getLayerFE().getDebugName(), dataspace,
              to_string(error).c_str(), static_cast<int32_t>(error));
    }

    // 设置亮度(调光比例)
    const auto dimmingRatio = outputDependentState.overrideInfo.buffer
            ? (getOutput().getState().displayBrightnessNits != 0.f
                       ? std::clamp(getOutput().getState().sdrWhitePointNits /
                                            getOutput().getState().displayBrightnessNits,
                                    0.f, 1.f)
                       : 1.f)
            : outputDependentState.dimmingRatio;
    if (auto error = hwcLayer->setBrightness(dimmingRatio); error != hal::Error::NONE) {
        ALOGE("[%s] Failed to set brightness %f: %s (%d)", getLayerFE().getDebugName(),
              dimmingRatio, to_string(error).c_str(), static_cast<int32_t>(error));
    }
}
2.23 writeOutputIndependentPerFrameStateToHWC() - 写入独立每帧状态

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp

cpp 复制代码
// OutputLayer.cpp:550
void OutputLayer::writeOutputIndependentPerFrameStateToHWC(
        HWC2::Layer* hwcLayer, const LayerFECompositionState& outputIndependentState,
        Composition compositionType, bool skipLayer) {
    // 设置颜色变换
    switch (auto error = hwcLayer->setColorTransform(outputIndependentState.colorTransform)) {
        case hal::Error::NONE:
            break;
        case hal::Error::UNSUPPORTED:
            editState().forceClientComposition = true;
            break;
        default:
            ALOGE("[%s] Failed to set color transform: %s (%d)", getLayerFE().getDebugName(),
                  to_string(error).c_str(), static_cast<int32_t>(error));
    }

    // 设置表面损伤区域
    const Region& surfaceDamage = getState().overrideInfo.buffer
            ? getState().overrideInfo.damageRegion
            : (getState().hwc->stateOverridden ? Region::INVALID_REGION
                                               : outputIndependentState.surfaceDamage);
    if (auto error = hwcLayer->setSurfaceDamage(surfaceDamage); error != hal::Error::NONE) {
        ALOGE("[%s] Failed to set surface damage: %s (%d)", getLayerFE().getDebugName(),
              to_string(error).c_str(), static_cast<int32_t>(error));
    }

    // 根据组合类型写入特定状态
    switch (compositionType) {
        case Composition::SOLID_COLOR:
            break;
        case Composition::SIDEBAND:
            writeSidebandStateToHWC(hwcLayer, outputIndependentState);
            break;
        case Composition::CURSOR:
        case Composition::DEVICE:
        case Composition::DISPLAY_DECORATION:
        case Composition::REFRESH_RATE_INDICATOR:
            writeBufferStateToHWC(hwcLayer, outputIndependentState, skipLayer);
            break;
        case Composition::INVALID:
        case Composition::CLIENT:
            break;
    }
}

阶段 10: HWC HAL 调用

2.24 HWC2::impl::Layer - HAL 调用实现

文件路径 : frameworks/native/services/surfaceflinger/DisplayHardware/HWC2.cpp

cpp 复制代码
// HWC2.cpp - Layer 实现
namespace impl {

Layer::Layer(android::Hwc2::Composer& composer,
             const std::unordered_set<AidlCapability>& capabilities,
             HWC2::Display& display, HWLayerId layerId)
      : mComposer(composer), mCapabilities(capabilities),
        mDisplay(&display), mId(layerId) {
    ALOGV("Created layer %" PRIu64 " on display %" PRIu64, layerId, display.getId());
}

// 设置显示帧
Error Layer::setDisplayFrame(const android::Rect& frame) {
    auto intError = mComposer.setLayerDisplayFrame(mDisplay->getId(), mId, frame);
    return static_cast<Error>(intError);
}

// 设置源裁剪
Error Layer::setSourceCrop(const android::FloatRect& crop) {
    auto intError = mComposer.setLayerSourceCrop(mDisplay->getId(), mId, crop);
    return static_cast<Error>(intError);
}

// 设置 Z 顺序
Error Layer::setZOrder(uint32_t z) {
    auto intError = mComposer.setLayerZOrder(mDisplay->getId(), mId, z);
    return static_cast<Error>(intError);
}

// 设置变换
Error Layer::setTransform(Transform transform) {
    auto intError = mComposer.setLayerTransform(mDisplay->getId(), mId, transform);
    return static_cast<Error>(intError);
}

// 设置混合模式
Error Layer::setBlendMode(BlendMode mode) {
    auto intError = mComposer.setLayerBlendMode(mDisplay->getId(), mId, mode);
    return static_cast<Error>(intError);
}

// 设置平面透明度
Error Layer::setPlaneAlpha(float alpha) {
    auto intError = mComposer.setLayerPlaneAlpha(mDisplay->getId(), mId, alpha);
    return static_cast<Error>(intError);
}

// 设置可见区域
Error Layer::setVisibleRegion(const android::Region& region) {
    auto intError = mComposer.setLayerVisibleRegion(mDisplay->getId(), mId, region);
    return static_cast<Error>(intError);
}

// 设置数据空间
Error Layer::setDataspace(android::ui::Dataspace dataspace) {
    auto intError = mComposer.setLayerDataspace(mDisplay->getId(), mId, dataspace);
    return static_cast<Error>(intError);
}

// 设置缓冲区
Error Layer::setBuffer(uint32_t slot, const android::sp<android::GraphicBuffer>& buffer,
                       const android::sp<android::Fence>& acquireFence) {
    int32_t fenceFd = acquireFence->dup();
    auto intError = mComposer.setLayerBuffer(mDisplay->getId(), mId, slot, buffer, fenceFd);
    return static_cast<Error>(intError);
}

// 设置组合类型
Error Layer::setCompositionType(Composition type) {
    auto intError = mComposer.setLayerCompositionType(mDisplay->getId(), mId, type);
    return static_cast<Error>(intError);
}

} // namespace impl

阶段 11: 准备帧 (prepareFrame)

2.25 Output::prepareFrame() - 准备帧

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

cpp 复制代码
// Output.cpp:1063
void Output::prepareFrame() {
    ATRACE_CALL();
    ALOGV(__FUNCTION__);

    auto& outputState = editState();
    if (!outputState.isEnabled) {
        return;
    }

    std::optional<android::HWComposer::DeviceRequestedChanges> changes;
    bool success = chooseCompositionStrategy(&changes);
    resetCompositionStrategy();
    outputState.strategyPrediction = CompositionStrategyPredictionState::DISABLED;
    outputState.previousDeviceRequestedChanges = changes;
    outputState.previousDeviceRequestedSuccess = success;
    if (success) {
        applyCompositionStrategy(changes);
    }
    finishPrepareFrame();
}
2.26 Display::chooseCompositionStrategy() - 选择组合策略

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Display.cpp

cpp 复制代码
// Display.cpp:226
bool Display::chooseCompositionStrategy(
        std::optional<android::HWComposer::DeviceRequestedChanges>* outChanges) {
    ATRACE_FORMAT("%s for %s", __func__, getNamePlusId().c_str());
    ALOGV(__FUNCTION__);

    if (mIsDisconnected) {
        return false;
    }

    const auto halDisplayId = HalDisplayId::tryCast(mId);
    if (!halDisplayId) {
        return false;
    }

    auto& hwc = getCompositionEngine().getHwComposer();
    const bool requiresClientComposition = anyLayersRequireClientComposition();

    // ★★★ 调用 HWC 获取设备组合变化 ★★★
    if (status_t result = hwc.getDeviceCompositionChanges(
                *halDisplayId, requiresClientComposition,
                getState().earliestPresentTime,
                getState().expectedPresentTime, outChanges);
        result != NO_ERROR) {
        ALOGE("chooseCompositionStrategy failed for %s: %d (%s)",
              getName().c_str(), result, strerror(-result));
        return false;
    }

    return true;
}
2.27 HWComposer::getDeviceCompositionChanges() - HWC 验证

文件路径 : frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp

cpp 复制代码
// HWComposer.cpp:418
status_t HWComposer::getDeviceCompositionChanges(
        HalDisplayId displayId, bool frameUsesClientComposition,
        std::optional<std::chrono::steady_clock::time_point> earliestPresentTime,
        nsecs_t expectedPresentTime,
        std::optional<android::HWComposer::DeviceRequestedChanges>* outChanges) {
    ATRACE_CALL();

    RETURN_IF_INVALID_DISPLAY(displayId, BAD_INDEX);

    auto& displayData = mDisplayData[displayId];
    auto& hwcDisplay = displayData.hwcDisplay;

    uint32_t numTypes = 0;
    uint32_t numRequests = 0;

    // 尝试跳过验证直接呈现
    const bool canSkipValidate = !frameUsesClientComposition && ...;

    if (canSkipValidate) {
        // 尝试 presentOrValidate
        error = hwcDisplay->presentOrValidate(expectedPresentTime, &numTypes, &numRequests,
                                              &outPresentFence, &state);
        if (state == 1) { // Present 成功
            displayData.validateWasSkipped = true;
            return NO_ERROR;
        }
    } else {
        // ★★★ 调用 validate ★★★
        error = hwcDisplay->validate(expectedPresentTime, &numTypes, &numRequests);
    }

    // 获取变化的组合类型
    android::HWComposer::DeviceRequestedChanges::ChangedTypes changedTypes;
    error = hwcDisplay->getChangedCompositionTypes(&changedTypes);

    // 获取请求
    auto displayRequests = static_cast<hal::DisplayRequest>(0);
    android::HWComposer::DeviceRequestedChanges::LayerRequests layerRequests;
    error = hwcDisplay->getRequests(&displayRequests, &layerRequests);

    // 接受变化
    error = hwcDisplay->acceptChanges();

    outChanges->emplace(DeviceRequestedChanges{std::move(changedTypes),
                                               std::move(displayRequests),
                                               std::move(layerRequests), ...});
    return NO_ERROR;
}

阶段 12: 完成帧 (finishFrame)

2.28 Output::finishFrame() - 完成帧

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

cpp 复制代码
// Output.cpp:1135
void Output::finishFrame(GpuCompositionResult&& result) {
    ATRACE_CALL();
    ALOGV(__FUNCTION__);
    const auto& outputState = getState();
    if (!outputState.isEnabled) {
        return;
    }

    std::optional<base::unique_fd> optReadyFence;
    std::shared_ptr<renderengine::ExternalTexture> buffer;
    base::unique_fd bufferFence;

    if (outputState.strategyPrediction == CompositionStrategyPredictionState::SUCCESS) {
        optReadyFence = std::move(result.fence);
    } else {
        if (result.bufferAvailable()) {
            buffer = std::move(result.buffer);
            bufferFence = std::move(result.fence);
        } else {
            updateProtectedContentState();
            if (!dequeueRenderBuffer(&bufferFence, &buffer)) {
                return;
            }
        }

        // ★★★ GPU 合成 ★★★
        optReadyFence = composeSurfaces(Region::INVALID_REGION, buffer, bufferFence);
    }

    if (!optReadyFence) {
        return;
    }

    // 交换缓冲区(呈现)
    mRenderSurface->queueBuffer(std::move(*optReadyFence));
}

阶段 13: 提交帧缓冲 (postFramebuffer)

2.29 Output::postFramebuffer() - 提交帧缓冲

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

cpp 复制代码
// Output.cpp:1523
void Output::postFramebuffer() {
    ATRACE_FORMAT("%s for %s", __func__, mNamePlusId.c_str());
    ALOGV(__FUNCTION__);

    if (!getState().isEnabled) {
        return;
    }

    auto& outputState = editState();
    outputState.dirtyRegion.clear();

    // ★★★ 呈现并获取帧 Fence ★★★
    auto frame = presentAndGetFrameFences();

    mRenderSurface->onPresentDisplayCompleted();

    // 处理每个 OutputLayer 的释放 Fence
    for (auto* layer : getOutputLayersOrderedByZ()) {
        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);
        }
        layer->getLayerFE().onLayerDisplayed(
                ftl::yield<FenceResult>(std::move(releaseFence)).share(),
                outputState.layerFilter.layerStack);
    }
}
2.30 Display::presentAndGetFrameFences() - 呈现并获取 Fence

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/src/Display.cpp

cpp 复制代码
// Display.cpp:351
compositionengine::Output::FrameFences Display::presentAndGetFrameFences() {
    auto fences = impl::Output::presentAndGetFrameFences();

    const auto halDisplayIdOpt = HalDisplayId::tryCast(mId);
    if (mIsDisconnected || !halDisplayIdOpt) {
        return fences;
    }

    auto& hwc = getCompositionEngine().getHwComposer();

    // ★★★ 调用 HWC present ★★★
    hwc.presentAndGetReleaseFences(*halDisplayIdOpt, getState().earliestPresentTime);

    fences.presentFence = hwc.getPresentFence(*halDisplayIdOpt);

    // 获取每个 Layer 的释放 Fence
    for (const auto* layer : getOutputLayersOrderedByZ()) {
        auto hwcLayer = layer->getHwcLayer();
        if (!hwcLayer) {
            continue;
        }
        fences.layerFences.emplace(hwcLayer, hwc.getLayerReleaseFence(*halDisplayIdOpt, hwcLayer));
    }

    hwc.clearReleaseFences(*halDisplayIdOpt);
    return fences;
}
2.31 HWComposer::presentAndGetReleaseFences() - HWC 呈现

文件路径 : frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp

cpp 复制代码
// HWComposer.cpp:510
status_t HWComposer::presentAndGetReleaseFences(
        HalDisplayId displayId,
        std::optional<std::chrono::steady_clock::time_point> earliestPresentTime) {
    ATRACE_CALL();

    RETURN_IF_INVALID_DISPLAY(displayId, BAD_INDEX);

    auto& displayData = mDisplayData[displayId];
    auto& hwcDisplay = displayData.hwcDisplay;

    if (displayData.validateWasSkipped) {
        // 执行命令
        auto error = static_cast<hal::Error>(mComposer->executeCommands(hwcDisplay->getId()));
        return NO_ERROR;
    }

    // 等待最早呈现时间
    if (earliestPresentTime) {
        ATRACE_NAME("wait for earliest present time");
        std::this_thread::sleep_until(*earliestPresentTime);
    }

    // ★★★ 调用 HWC present ★★★
    auto error = hwcDisplay->present(&displayData.lastPresentFence);
    RETURN_IF_HWC_ERROR_FOR("present", error, displayId, UNKNOWN_ERROR);

    // 获取释放 Fence
    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;
}

三、完整调用流程图

css 复制代码
┌─────────────────────────────────────────────────────────────────────────────┐
│                          SurfaceFlinger 主线程                               │
│                                                                              │
│  SurfaceFlinger::composite()                                                 │
│  │                                                                           │
│  ├── 构建 CompositionRefreshArgs                                             │
│  │   ├── 收集 outputs (物理/虚拟显示器)                                      │
│  │   ├── 收集 layersWithQueuedFrames                                         │
│  │   └── 设置各种刷新参数                                                    │
│  │                                                                           │
│  └── mCompositionEngine->present(refreshArgs)                               │
│      │                                                                       │
│      ▼                                                                       │
└──────┼──────────────────────────────────────────────────────────────────────┘
       │
       ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                          CompositionEngine                                   │
│                                                                              │
│  CompositionEngine::present(refreshArgs)                                     │
│  │                                                                           │
│  ├── preComposition(args)                                                    │
│  │                                                                           │
│  ├── for each output:                                                        │
│  │   └── output->prepare(args, latchedLayers)                                │
│  │       │                                                                   │
│  │       ├── rebuildLayerStacks(refreshArgs, layerFESet)                    │
│  │       │   │                                                               │
│  │       │   └── collectVisibleLayers(refreshArgs, coverage)                │
│  │       │       │                                                           │
│  │       │       └── for each layer: ensureOutputLayerIfVisible(layer, cov) │
│  │       │           │                                                       │
│  │       │           ├── 计算可见区域/覆盖区域                               │
│  │       │           ├── prevIndex = findCurrentOutputLayerForLayer(layerFE) │
│  │       │           └── result = ensureOutputLayer(prevIndex, layerFE)      │
│  │       │               │                                                   │
│  │       │               └── Display::createOutputLayer(layerFE)             │
│  │       │                   │                                               │
│  │       │                   ├── impl::createOutputLayer(*this, layerFE)     │
│  │       │                   │   └── createOutputLayerTemplated<OutputLayer> │
│  │       │                   │       └── 创建 OutputLayer 实例               │
│  │       │                   │           ├── mOutput = output                │
│  │       │                   │           ├── mLayerFE = layerFE              │
│  │       │                   │           └── mState = OutputLayerCompositionState│
│  │       │                   │                                               │
│  │       │                   ├── hwc.createLayer(*halDisplayId)              │
│  │       │                   │   └── HWComposer::createLayer(displayId)      │
│  │       │                   │       └── HWC2::Display::createLayer()        │
│  │       │                   │           ├── mComposer.createLayer() → HAL   │
│  │       │                   │           └── 创建 HWC2::impl::Layer          │
│  │       │                   │                                               │
│  │       │                   └── outputLayer->setHwcLayer(std::move(hwcLayer))│
│  │       │                       └── state.hwc.emplace(std::move(hwcLayer))  │
│  │       │                                                                   │
│  │       └── uncacheBuffers(bufferIdsToUncache)                              │
│  │                                                                           │
│  └── for each output:                                                        │
│      └── output->present(refreshArgs)                                        │
│          │                                                                   │
│          ├── updateColorProfile(refreshArgs)                                 │
│          │                                                                   │
│          ├── updateCompositionState(refreshArgs)                             │
│          │   └── for each layer: layer->updateCompositionState(...)          │
│          │       ├── state.displayFrame = calculateOutputDisplayFrame()      │
│          │       ├── state.sourceCrop = calculateOutputSourceCrop()          │
│          │       └── state.bufferTransform = calculateOutputRelativeBufferTransform()│
│          │                                                                   │
│          ├── planComposition()                                               │
│          │                                                                   │
│          ├── writeCompositionState(refreshArgs)                              │
│          │   └── for each layer: layer->writeStateToHWC(...)                 │
│          │       ├── writeOutputDependentGeometryStateToHWC()                │
│          │       │   ├── hwcLayer->setDisplayFrame(displayFrame)             │
│          │       │   ├── hwcLayer->setSourceCrop(sourceCrop)                 │
│          │       │   ├── hwcLayer->setZOrder(z)                              │
│          │       │   └── hwcLayer->setTransform(bufferTransform)             │
│          │       ├── writeOutputIndependentGeometryStateToHWC()              │
│          │       │   ├── hwcLayer->setBlendMode(blendMode)                   │
│          │       │   └── hwcLayer->setPlaneAlpha(alpha)                      │
│          │       ├── writeOutputDependentPerFrameStateToHWC()                │
│          │       │   ├── hwcLayer->setVisibleRegion(visibleRegion)           │
│          │       │   ├── hwcLayer->setDataspace(dataspace)                   │
│          │       │   └── hwcLayer->setBrightness(dimmingRatio)               │
│          │       ├── writeOutputIndependentPerFrameStateToHWC()              │
│          │       │   ├── hwcLayer->setColorTransform(colorTransform)         │
│          │       │   ├── hwcLayer->setSurfaceDamage(surfaceDamage)           │
│          │       │   └── writeBufferStateToHWC()                             │
│          │       │       └── hwcLayer->setBuffer(slot, buffer, acquireFence) │
│          │       └── writeCompositionTypeToHWC()                             │
│          │           └── hwcLayer->setCompositionType(compositionType)       │
│          │                                                                   │
│          ├── setColorTransform(refreshArgs)                                  │
│          ├── beginFrame()                                                    │
│          │   └── RenderSurface::beginFrame()                                 │
│          │                                                                   │
│          ├── prepareFrame() / prepareFrameAsync()                            │
│          │   └── Display::chooseCompositionStrategy(&changes)                │
│          │       └── hwc.getDeviceCompositionChanges(...)                    │
│          │           ├── HWC2::Display::validate() → HAL                     │
│          │           ├── HWC2::Display::getChangedCompositionTypes()         │
│          │           ├── HWC2::Display::getRequests()                        │
│          │           └── HWC2::Display::acceptChanges()                      │
│          │                                                                   │
│          ├── finishFrame(result)                                             │
│          │   ├── dequeueRenderBuffer()                                       │
│          │   ├── composeSurfaces() (GPU 合成)                                │
│          │   │   └── RenderEngine::drawLayers()                              │
│          │   └── RenderSurface::queueBuffer(fence)                           │
│          │                                                                   │
│          └── postFramebuffer()                                               │
│              └── Display::presentAndGetFrameFences()                         │
│                  └── hwc.presentAndGetReleaseFences()                        │
│                      ├── HWC2::Display::present() → HAL                      │
│                      └── HWC2::Display::getReleaseFences()                   │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

四、关键数据结构

4.1 OutputLayerCompositionState 结构

文件路径 : frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayerCompositionState.h

cpp 复制代码
struct OutputLayerCompositionState {
    // 可见区域
    Region visibleRegion;
    Region visibleNonTransparentRegion;
    Region coveredRegion;
    Region outputSpaceVisibleRegion;
    Region shadowRegion;
    Region outputSpaceBlockingRegionHint;
    std::optional<Region> coveredRegionExcludingDisplayOverlays;

    // 几何状态
    Rect displayFrame;           // 显示帧
    FloatRect sourceCrop;        // 源裁剪
    Hwc2::Transform bufferTransform;  // 缓冲区变换
    ui::Dataspace dataspace;     // 数据空间

    // 调光
    float dimmingRatio = 1.f;
    float whitePointNits = 0.f;

    // 强制客户端组合
    bool forceClientComposition = false;

    // 清除客户端目标
    bool clearClientTarget = false;

    // 覆盖信息
    struct OverrideInfo {
        std::shared_ptr<renderengine::ExternalTexture> buffer;
        Rect displayFrame;
        Rect visibleRegion;
        Region damageRegion;
        ui::Dataspace dataspace;
        uint64_t bufferId = 0;
        sp<LayerFE> peekThroughLayer;
    } overrideInfo;

    // HWC 状态
    struct Hwc {
        explicit Hwc(std::shared_ptr<HWC2::Layer> hwcLayer) : hwcLayer(hwcLayer) {}

        std::shared_ptr<HWC2::Layer> hwcLayer;  // HWC Layer 指针
        aidl::android::hardware::graphics::composer3::Composition hwcCompositionType;
        HwcBufferCache hwcBufferCache;
        bool stateOverridden = false;
        bool layerSkipped = false;
    };
    std::optional<Hwc> hwc;
};

4.2 Layer 到 OutputLayer 到 HWC Layer 映射

SurfaceFlinger Layer CompositionEngine OutputLayer HWC Layer
Layer::mLayerFE OutputLayer::mLayerFE -
Layer::State LayerFECompositionState -
- OutputLayerCompositionState -
- OutputLayerCompositionState::Hwc::hwcLayer HWC2::Layer
- - HWC2::impl::Layer::mId (HWLayerId)

4.3 状态传递链

arduino 复制代码
Layer::State (应用层状态)
    │
    ├── LayerFECompositionState (前端组合状态)
    │       ├── geomLayerBounds
    │       ├── geomLayerTransform
    │       ├── buffer
    │       ├── acquireFence
    │       ├── dataspace
    │       └── compositionType
    │
    └── OutputLayerCompositionState (输出层组合状态)
            ├── displayFrame (计算后的显示帧)
            ├── sourceCrop (计算后的源裁剪)
            ├── bufferTransform
            ├── visibleRegion
            └── hwc::hwcLayer (HWC Layer 指针)
                    │
                    └── HWC2::impl::Layer
                            ├── mId (HWLayerId)
                            ├── setDisplayFrame()
                            ├── setSourceCrop()
                            ├── setBuffer()
                            └── setCompositionType()

五、关键文件路径汇总

组件 文件路径
SurfaceFlinger frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
Layer frameworks/native/services/surfaceflinger/Layer.h
LayerFE frameworks/native/services/surfaceflinger/LayerFE.h
LayerFECompositionState frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h
CompositionEngine frameworks/native/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp
Output frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp
Output (impl) frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h
Display frameworks/native/services/surfaceflinger/CompositionEngine/src/Display.cpp
OutputLayer frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/OutputLayer.h
OutputLayer (impl) frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayer.h
OutputLayer (src) frameworks/native/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
OutputLayerCompositionState frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayerCompositionState.h
HWComposer frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.h
HWComposer (impl) frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp
HWC2 frameworks/native/services/surfaceflinger/DisplayHardware/HWC2.h
HWC2 (impl) frameworks/native/services/surfaceflinger/DisplayHardware/HWC2.cpp

六、总结

SurfaceFlinger 中 Layer 到 HWC 的完整流程可以概括为:

  1. SurfaceFlinger::composite() : 构建 CompositionRefreshArgs,收集所有需要显示的 Layer 和 Output,调用 CompositionEngine::present()

  2. CompositionEngine::present() : 执行预组合处理,为每个 Output 调用 prepare()(重建 Layer 栈)和 present()(执行呈现)。

  3. Output::prepare() → rebuildLayerStacks(): 遍历所有 Layer,为每个可见 Layer 创建或复用 OutputLayer。对于物理显示器,同时创建对应的 HWC Layer。

  4. Display::createOutputLayer() : 创建 OutputLayer 并关联 HWC Layer。调用 impl::createOutputLayer() 创建 OutputLayer,调用 HWComposer::createLayer() 创建 HWC Layer,最后调用 setHwcLayer() 建立关联。

  5. Output::present() → updateCompositionState(): 计算每个 OutputLayer 的输出相关几何状态(displayFrame、sourceCrop、bufferTransform)。

  6. Output::present() → writeCompositionState() : 将 OutputLayer 的状态写入 HWC。调用 writeStateToHWC(),进一步调用各种 write*ToHWC() 函数,最终调用 HWC2::Layer 的方法。

  7. Output::present() → prepareFrame() : 调用 chooseCompositionStrategy(),通过 HWComposer::getDeviceCompositionChanges() 让 HWC 决定每个 Layer 的组合方式。

  8. Output::present() → finishFrame() : 对于需要 CLIENT 合成的 Layer,通过 RenderEngine 进行 GPU 合成。

  9. Output::present() → postFramebuffer() : 调用 Display::presentAndGetFrameFences(),最终调用 HWComposer::presentAndGetReleaseFences() 将帧呈现到显示器。

整个流程中,OutputLayer 是 Layer 和 HWC Layer 之间的桥梁,它持有 LayerFE 的引用和 HWC Layer 的指针,负责将 Layer 的状态转换为 HWC 可以理解的格式并传递给 HWC。

相关推荐
峥嵘life43 分钟前
五一南昌第三天游玩记录:梅景寻芳,母校忆旧,摩天轮揽夜
android
qq_452396232 小时前
第三篇:《JMeter断言:验证接口响应正确性》
android·jmeter
aqi002 小时前
一文速览 HarmonyOS 6.0.1 引入的十个新特性
android·华为·harmonyos·鸿蒙·harmony
橙子199110164 小时前
Android 第三方框架 相关
android
赏金术士4 小时前
JetPack Compose 弹窗、菜单、交互组件(五)
android·kotlin·交互·android jetpack·compose
海天鹰4 小时前
高版本安卓老应用下面空白
android
猫的玖月5 小时前
(七)函数
android·数据库·sql
秋95 小时前
java中对操作mysql8.0.46与MySQL9.7.0有什么区别,并举例说明
android·java·adb