08 surfaceflinger初始化

surfaceflinger非常复杂,代码也非常多,漫无目的地看代码什么也看不懂并且容易犯困。(别问我怎么知道的,因为看这块东西睡着好多次)

我对app的东西不熟,基本上都是从hwc,然后一路摸爬滚打到surfaceflinger的逻辑。也吃了不少苦头。

我会把surfaceflinger精简一下,用一个功能来梳理流程,比如surfaceflinger是怎么创建layer的,怎么把layer与hwc中的layer对应的,又是怎么把图推给hwc的。

这样做的好处是可以不用关心其他又多又臭又硬的代码,增强自己的信心,原来自己能看懂。

简单看下surfaceflinger初始化的流程

本篇的代码为了梳理流程做了精简,有需要可以对比源码分析

1. 创建surfaceflinger

android12\frameworks\native\services\surfaceflinger\main_surfaceflinger.cpp

int main(int, char**) {
    sp<SurfaceFlinger> flinger = surfaceflinger::createSurfaceFlinger();

    flinger->init();
    
    flinger->run();
}
android12\frameworks\native\services\surfaceflinger\SurfaceFlingerFactory.cpp

sp<SurfaceFlinger> createSurfaceFlinger() {
    static DefaultFactory factory;

    return new SurfaceFlinger(factory);
}

用factory来创建surfaceflinger,看下surfaceflinger的构造函数

SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipInitialization) {
... ...
}
SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
      : mFactory(factory),

        mEventQueue(mFactory.createMessageQueue()),
        mCompositionEngine(mFactory.createCompositionEngine()),
        mHwcServiceName(base::GetProperty("debug.sf.hwc_service_name"s, "default"s)),

        mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", true)) {
    ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str());

}

这里有几个比较重要的成员:

mCompositionEngine:负责参数配置,图像的合成,和刷图等

mHwcServiceName:hwc name用来获取hwc的service

mInternalDisplayDensity:显示内容在屏幕上显示的大小

createCompositionEngine的实现比较简单就不分析了。

surfaceflinger构造函数还有其他的内容,暂时涉及不到。

2. SurfaceFlinger::init()

  • 获取composer service
  • 创建Display
  • 创建DisplayDevice

上代码:

void SurfaceFlinger::init() {
    mCompositionEngine->setHwComposer(getFactory().createHWComposer(mHwcServiceName));

    processDisplayHotplugEventsLocked();
    
    mDrawingState = mCurrentState;
}

2.1 获取composer service

createHWComposer流程如下图:

从流程图可以看出,使用IComposer::getService(serviceName)拿到hwc service,并且创建client;然后使用HWComposer把composer包起来;后面使用HWComposer就可以拿到composer;

如果想看composer service创建的具体流程,可以看下hidl生成在路径流程图最后的c++代码。

然后调用setHwComposer,保存到mHwComposer成员里

android12\frameworks\native\services\surfaceflinger\CompositionEngine\src\CompositionEngine.cpp

void CompositionEngine::setHwComposer(std::unique_ptr<HWComposer> hwComposer) {
    mHwComposer = std::move(hwComposer);
}

在SurfaceFlinger.cpp中有很多getHwComposer().xxx()的调用,来通过HWComposer配置参数,而在HWComposer中有的接口会使用mComposer实现与hwc进行交互。

2.2 创建Display

android12\frameworks\native\services\surfaceflinger\CompositionEngine\include\compositionengine\impl\Display.h

class Display : public compositionengine::impl::Output, public virtual compositionengine::Display {

}

从头文件来看Display继承Output;在display中好多方法用的都是Output里面的。在后面的流程分析中会遇到。

整体流程没什么特殊的,有两个类函数需要注意一下createDisplayTemplated和createOutputTemplated。

diaplay的创建流程如下:

2.3 创建DisplayDevice

使用上面创建的display,和displaySurface等参数创建DisplayDevice;流程图如下:

创建完成将display放入mDisplays。

3. 总结

这里省略了很多代码和逻辑,只着重于HWComposer,Display,DisplayDevice的创建及初始化。

后面在分析其他流程时会遇到这些变量的具体使用,敬请期待。

创作不易,欢迎评论点赞收藏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值