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 的完整流程可以概括为:
-
SurfaceFlinger::composite() : 构建
CompositionRefreshArgs,收集所有需要显示的 Layer 和 Output,调用CompositionEngine::present()。 -
CompositionEngine::present() : 执行预组合处理,为每个 Output 调用
prepare()(重建 Layer 栈)和present()(执行呈现)。 -
Output::prepare() → rebuildLayerStacks(): 遍历所有 Layer,为每个可见 Layer 创建或复用 OutputLayer。对于物理显示器,同时创建对应的 HWC Layer。
-
Display::createOutputLayer() : 创建 OutputLayer 并关联 HWC Layer。调用
impl::createOutputLayer()创建 OutputLayer,调用HWComposer::createLayer()创建 HWC Layer,最后调用setHwcLayer()建立关联。 -
Output::present() → updateCompositionState(): 计算每个 OutputLayer 的输出相关几何状态(displayFrame、sourceCrop、bufferTransform)。
-
Output::present() → writeCompositionState() : 将 OutputLayer 的状态写入 HWC。调用
writeStateToHWC(),进一步调用各种write*ToHWC()函数,最终调用HWC2::Layer的方法。 -
Output::present() → prepareFrame() : 调用
chooseCompositionStrategy(),通过HWComposer::getDeviceCompositionChanges()让 HWC 决定每个 Layer 的组合方式。 -
Output::present() → finishFrame() : 对于需要 CLIENT 合成的 Layer,通过
RenderEngine进行 GPU 合成。 -
Output::present() → postFramebuffer() : 调用
Display::presentAndGetFrameFences(),最终调用HWComposer::presentAndGetReleaseFences()将帧呈现到显示器。
整个流程中,OutputLayer 是 Layer 和 HWC Layer 之间的桥梁,它持有 LayerFE 的引用和 HWC Layer 的指针,负责将 Layer 的状态转换为 HWC 可以理解的格式并传递给 HWC。