android屏幕渲染之SurfaceFlinger的启动

        SurfaceFlinger是Android操作系统中的一个Service,跟随系统的启动,主要用于屏幕渲染、图像合成,它负责接收所有Window的Surface作为输入,并根据透明度、大小、位置等参数,计算出每个Surface在最终合成图像中的位置,然后交由CPU或GPU生成最终的显示Buffer,最后显示到特定的显示设备上。它使用OpenGL或skia和Hardware Composer来合成一组Surface,在屏幕处于两次刷新之间时,屏幕会向SurfaceFlinger发送VSYNC信号。VSYNC信号表明可对屏幕进行刷新而不会产生撕裂。当SurfaceFlinger接收到VSYNC信号后,会遍历其层列表,以查找新的缓冲区。

SurfaceFlinger是一个服务进程,并且是一个可执行的程序,文件在设备的/system/lib/目录下。

系统开机后,init进程扫描到surfaceflinger.rc这个文件,并解析,然后执行/system/lib/surfaceflinger,这样就创建了surfaceflinger的进程。

frameworks/native/services/surfaceflinger/Android.bp
...............
filegroup {
    name: "surfaceflinger_binary_sources",
    srcs: ["main_surfaceflinger.cpp"],//引入源文件,这个为surfaceflinger的入口
}

cc_binary {
    name: "surfaceflinger",//编译为suerfaceflinger的二进制文件
    defaults: ["libsurfaceflinger_binary"],
    init_rc: ["surfaceflinger.rc"],//引入surfaceflinger.rc文件
    srcs: [":surfaceflinger_binary_sources"],//引入surfaceflinger_binary_sources这个组的源文件
    shared_libs: [
        "libsurfaceflinger",
        "libSurfaceFlingerProp",
    ],
}

在设备下执行ps,看看surfaceflinger的进程

我们从入口函数main开始分析

/frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp
int main(int, char**) {
    .........
    ProcessState::self()->setThreadPoolMaxThreadCount(4);//设置4个bind线程

    // start the thread pool
    sp<ProcessState> ps(ProcessState::self());
    ps->startThreadPool();


    sp<SurfaceFlinger> flinger = surfaceflinger::createSurfaceFlinger();//创建surfacelinger实例---【见2.1】
    .........
    flinger->init();//初始化---【见2.2】

    //把surfaceflinger添加到servicemanager
    sp<IServiceManager> sm(defaultServiceManager());
    sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false,
                   IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL | IServiceManager::DUMP_FLAG_PROTO);

    // 启动显示服务,主要是创建HAL的服务,具体实现是在out\soong\.intermediates\frameworks\hardware\interfaces\displayservice\1.0\android.frameworks.displayservice@1.0_genc++\gen\android\frameworks\displayservice\1.0
    startDisplayService(); 
    ..........
    //运行surfaceflinger ---【见2.3】
    flinger->run();

    return 0;
}

2.1

frameworks/native/services/surfaceflinger/SurfaceFlingerFactory.cpp
sp<SurfaceFlinger> createSurfaceFlinger() {
    class Factory final : public surfaceflinger::Factory {
    public:
        Factory() = default;
        ~Factory() = default;
        ...............
        std::unique_ptr<EventControlThread> createEventControlThread(
                std::function<void(bool)> setVSyncEnabled) override {
            return std::make_unique<android::impl::EventControlThread>(setVSyncEnabled);
        }
        ............
    };
    static Factory factory;

    return new SurfaceFlinger(factory);
}

在createSurfaceFlinger通过定义Factory的类,在创建surfaceflinger的实例中同时把Factory的实例出入到了SurfaceFlinger

2.1.1

SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipInitialization)//执行两个参数的构造函数 {
    ALOGI("SurfaceFlinger is starting");
    //读取系统属性值 
    hasSyncFramework = running_without_sync_framework(true);

    dispSyncPresentTimeOffset = present_time_offset_from_vsync_ns(0);

    useHwcForRgbToYuv = force_hwc_copy_for_virtual_displays(false);
    .........        
}

SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
      : mFactory(factory),
        mPhaseOffsets(mFactory.createPhaseOffsets()),//创建相位
        mInterceptor(mFactory.createSurfaceInterceptor(this)),
        mTimeStats(mFactory.createTimeStats()),
        mEventQueue(mFactory.createMessageQueue()),//创建消息队列
        mCompositionEngine(mFactory.createCompositionEngine())//创建合成引擎 {}

SurfaceFlinger读取属性值,做一些初始化的工作,创建实例后会触发OnFirsetRef

void SurfaceFlinger::onFirstRef()
{
    mEventQueue->init(this);
}

mEventQueue的实例是在创建SurfaceFlinger中创建的,init方法里创建looper和handler

2.2

void SurfaceFlinger::init() {
    ..........
    // start the EventThread
    mScheduler =
            getFactory().createScheduler([this](bool enabled) { setPrimaryVsyncEnabled(enabled); },
                                         mRefreshRateConfigs);//创建调度器-----【2.2.1】
    auto resyncCallback =
            mScheduler->makeResyncCallback(std::bind(&SurfaceFlinger::getVsyncPeriod, this));//跨进程获取垂直同步的周期后,重设垂直同步-----【2.2.2】
    //创建app和sf的连接
    mAppConnectionHandle =
            mScheduler->createConnection("app", mPhaseOffsets->getCurrentAppOffset(),
                                         resyncCallback,
                                         impl::EventThread::InterceptVSyncsCallback());
    mSfConnectionHandle = mScheduler->createConnection("sf", mPhaseOffsets->getCurrentSfOffset(),
                                                       resyncCallback, [this](nsecs_t timestamp) {
                                                           mInterceptor->saveVSyncEvent(timestamp);
                                                       });

    mEventQueue->setEventConnection(mScheduler->getEventConnection(mSfConnectionHandle));//把sf添加到消息队列中
    mVsyncModulator.setSchedulerAndHandles(mScheduler.get(), mAppConnectionHandle.get(),
                                           mSfConnectionHandle.get());//

    mRegionSamplingThread =
            new RegionSamplingThread(*this, *mScheduler,
                                     RegionSamplingThread::EnvironmentTimingTunables());

    .....................
    //设置渲染引擎
    mCompositionEngine->setRenderEngine(
            renderengine::RenderEngine::create(static_cast<int32_t>(defaultCompositionPixelFormat),
                                               renderEngineFeature, maxFrameBufferAcquiredBuffers));

    ......................
    //创建Hwcomposer
    mCompositionEngine->setHwComposer(getFactory().createHWComposer(getBE().mHwcServiceName));
    mCompositionEngine->getHwComposer().registerCallback(this, getBE().mComposerSequenceId);
    // Process any initial hotplug and resulting display changes.
    processDisplayHotplugEventsLocked();
    
    // 初始化显示的信息
    initializeDisplays();
    ...............
}
frameworks/native/services/surfaceflinger/schedule/Scheduler.cpp
Scheduler::Scheduler(impl::EventControlThread::SetVSyncEnabledFunction function,
                     const scheduler::RefreshRateConfigs& refreshRateConfig)
      : mHasSyncFramework(running_without_sync_framework(true)),
        mDispSyncPresentTimeOffset(present_time_offset_from_vsync_ns(0)),
        mPrimaryHWVsyncEnabled(false),
        mHWVsyncAvailable(false),
        mRefreshRateConfigs(refreshRateConfig) {
     ................
}

在Scheduler的构造函数里主要是读取属性值,根据值是否开启IdleTimer和TouchTimer定时器

2.2.2

SurfaceFlinger.cpp
nsecs_t SurfaceFlinger::getVsyncPeriod() const {
   .........
    const auto config = getHwComposer().getActiveConfig(*displayId);
    return config ? config->getVsyncPeriod() : 0;
}

android可以接多个显示器,通过displayId显示器的ID来获取图形显示、合成的配置,getActiveConfig的调用栈为:surfaceflinger\compositionengine\src\CompositionEngine.setHwComposer---》surfaceflinger\displayhardware\HWComposer.getActiveConfig----->surfaceflinger\displayhardware.ComposerHal.getActiveConfig,最后进入HAL层的V2_1::IComposerClient

想要学习更多编程,欢迎关注公众号:android全贯通

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值