美文网首页
SurfaceFlinger服务启动与初始化

SurfaceFlinger服务启动与初始化

作者: 泡面先生_Jack | 来源:发表于2020-01-01 20:46 被阅读0次

    SufaceFlinger启动与初始化

    SurfaceFlinger是一个Native系统服务,开机的时候在init.rc脚本中被启动

    service surfaceflinger /system/bin/surfaceflinger
        class core
        user system
        group graphics drmrpc
        onrestart restart zygote
        writepid /dev/cpuset/system-background/tasks
    

    启动后执行main_surfaceflinger.cpp的main方法, 该方法就是SurfaceFlinger的入口函数。

    int main(int, char**) {
        // 限制sufaceFlinger进程的binder线程为4个
        ProcessState::self()->setThreadPoolMaxThreadCount(4);
    
        // 启动Binder线程池
        sp<ProcessState> ps(ProcessState::self());
        ps->startThreadPool();
    
        //创建SurfaceFlinger对象
        sp<SurfaceFlinger> flinger = new SurfaceFlinger();
    
        setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
    
        set_sched_policy(0, SP_FOREGROUND);
    
        // 初始化SurfaceFlinger进程
        flinger->init();
    
        //将surfaceFlinger进程注册到ServiceManager
        sp<IServiceManager> sm(defaultServiceManager());
        sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);
    
        //启动SurfaceFlinger线程的run方法,等待要处理的消息
        flinger->run();
    
        return 0;
    }
    

    SurfaceFlinger启动的步骤在注释中已经比较详细了,主要关注以下三个步骤
    1:SurfaceFligner对象的创建
    2:SurfaceFlinger的init方法
    3:SurfaceFlinger的Run方法

    SurfaceFlinger对象的创建

    
    SurfaceFlinger::SurfaceFlinger()
        :   BnSurfaceComposer(),
            mTransactionFlags(0),
            mTransactionPending(false),
            mAnimTransactionPending(false),
            mLayersRemoved(false),
            mRepaintEverything(0),
            mRenderEngine(NULL),
            mBootTime(systemTime()),
            mVisibleRegionsDirty(false),
            mHwWorkListDirty(false),
            mAnimCompositionPending(false),
            mDebugRegion(0),
            mDebugDDMS(0),
            mDebugDisableHWC(0),
            mDebugDisableTransformHint(0),
            mDebugInSwapBuffers(0),
            mLastSwapBufferTime(0),
            mDebugInTransaction(0),
            mLastTransactionTime(0),
            mBootFinished(false),
            mForceFullDamage(false),
            mPrimaryHWVsyncEnabled(false),
            mHWVsyncAvailable(false),
            mDaltonize(false),
            mHasColorMatrix(false),
            mHasPoweredOff(false),
            mFrameBuckets(),
            mTotalTime(0),
            mLastSwapTime(0)
    {
        ALOGI("SurfaceFlinger is starting");
    
        // debugging stuff...
        char value[PROPERTY_VALUE_MAX];
    
        property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
        mGpuToCpuSupported = !atoi(value);
    
        property_get("debug.sf.drop_missed_frames", value, "0");
        mDropMissedFrames = atoi(value);
    
        property_get("debug.sf.showupdates", value, "0");
        mDebugRegion = atoi(value);
    
        property_get("debug.sf.ddms", value, "0");
        mDebugDDMS = atoi(value);
        if (mDebugDDMS) {
            if (!startDdmConnection()) {
                // start failed, and DDMS debugging not enabled
                mDebugDDMS = 0;
            }
        }
        ALOGI_IF(mDebugRegion, "showupdates enabled");
        ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
    }
    

    SurfaceFlinger的构造方法主要是初始化SurfaceFlinger的变量。还会根据系统Property属性来初始化一些变量,这些变量主要用于调试。

    当创建完SurfaceFlinger对象后,会触发SurfaceFlinger的onFirstRef方法

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

    在onFirstRef方法中调用了mEventQueue的init方法对MessageQueue进行了初始化,MessageQueue是SurfaceFlinger的消息队列,是SurfaceFlinger的主线程,负责SurfaceFlinger的图像合成。

    MessageQueue
       // these are thread safe
        mutable MessageQueue mEventQueue;
    

    SurfaceFlinger的属性mEventQueue是MessageQueue的对象, 那接着看下MessageQueue的构造方法和init方法。

    MessageQueue::MessageQueue()
    {
    }
    
    MessageQueue::~MessageQueue() {
    }
    
    void MessageQueue::init(const sp<SurfaceFlinger>& flinger)
    {
        mFlinger = flinger;
        mLooper = new Looper(true);
        mHandler = new Handler(*this);
    }
    

    MessageQueue的构造方法是个空方法。
    MessageQueue的init方法保存了SurfaceFlinger对象,创建了Looper对象和Handler对象,主要作用是初始化Native层的Handler,是一个消息队列模型,用于接收并处理SurfaceFlinger相关的消息。

    SurfaceFlinger的init方法

    主要作用是在SurfaceFlinger主线程运行之前,对SurfaceFlinger中的openGL, Vsync以及HWComper进行初始化。
    代码如下:

    void SurfaceFlinger::init() {
        ALOGI(  "SurfaceFlinger's main thread ready to run. "
                "Initializing graphics H/W...");
    
        { // Autolock scope
            Mutex::Autolock _l(mStateLock);
    
            // 初始化EGL默认显示设备
            mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
            eglInitialize(mEGLDisplay, NULL, NULL);
    
            //启动Vsync相关的EventThread, 以后在详细分析
            sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
                    vsyncPhaseOffsetNs, true, "app");
            mEventThread = new EventThread(vsyncSrc, *this);
            sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
                    sfVsyncPhaseOffsetNs, true, "sf");
            mSFEventThread = new EventThread(sfVsyncSrc, *this);
            mEventQueue.setEventThread(mSFEventThread);
    
            // 使用给定的Display和Config参数创建一个RenderEngine对象
            mRenderEngine = RenderEngine::create(mEGLDisplay,
                    HAL_PIXEL_FORMAT_RGBA_8888);
        }
    
    
        //创建HWCompser对象
        mHwc = new HWComposer(this);
        mHwc->setEventHandler(static_cast<HWComposer::EventHandler*>(this));
    
        Mutex::Autolock _l(mStateLock);
    
        // 获取EGLContext
        mEGLContext = mRenderEngine->getEGLContext();
    
        LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
                "couldn't create EGLContext");
    
        //绑定EGLContext
        getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
    
        //创建EventControlThread, 主要用于控制HWComposer
        mEventControlThread = new EventControlThread(this);
        mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
    
        //初始化DrawingState
        mDrawingState = mCurrentState;
    
        //初始化Display
        initializeDisplays();
    
        //开始显示开机动画
        startBootAnim();
    
        ALOGV("Done initializing");
    }
    

    SurfaceFlinger的init方法主要做了几件事情

    • 1: 初始化EGL
      初始化了Display,创建了EGL的Context,并绑定了EGL的上下文

    • 2: 创建了两个EventThread, mEventThread和mSfEventThread
      EventThread是SurfaceFlinger中的线程,主要用于接收Vsync事件并分发给感兴趣的注册者。SurfaceFlinger中创建了两个EventThread,一个负责app端对Vsync信号的监听处理,一个负责SurfaceFlinger对Vsync信号的监听处理。EventThread接收到Vsync事件后会有个延迟然后再进行分发,app和SurfaceFlinger的EventThread对应的延迟时间不一样,这样确保APP和SF合成的时候有一定的时间差,避免竞争资源。

    • 3: 创建HWCompser对象
      Hardware Composer 模块负责管理已经UI合成的接口

    • 4: 初始化显示设备

    当完成以上4个步骤后就开始显示开会动画,因为开机动画也要依赖SurfaceFlinger。

    SurfaceFlinger的Run方法

    void SurfaceFlinger::run() {
        do {
            waitForEvent();
        } while (true);
    }
    
    void SurfaceFlinger::waitForEvent() {
        mEventQueue.waitMessage();
    }
    

    surfaceFlinger的run方法调用了waitForEvent,来等待图像合成消息的到来,而waitForEvent方法使用了Looper机制,启用了Looper的消息队列,

    void MessageQueue::waitMessage() {
        do {
            IPCThreadState::self()->flushCommands();
            int32_t ret = mLooper->pollOnce(-1);
            switch (ret) {
                case Looper::POLL_WAKE:
                case Looper::POLL_CALLBACK:
                    continue;
                case Looper::POLL_ERROR:
                    ALOGE("Looper::POLL_ERROR");
                    continue;
                case Looper::POLL_TIMEOUT:
                    // timeout (should not happen)
                    continue;
                default:
                    // should not happen
                    ALOGE("Looper::pollOnce() returned unknown status %d", ret);
                    continue;
            }
        } while (true);
    }
    
    

    run方法调用MessageQueue的waitMessage方法,此时开启了SurfaceFlinger的主线程,等待SurfaceFlinger图像合成消息的到来。

    总结

    SurfaceFlinger的启动和初始化就分析完成了,启动的步骤如下:
    1: 创建SurfaceFlinger对象,并初始化SurfaceFlinger的变量
    2: 初始化SurfaceFlinger图像合成所需要的模块

    • 初始化了EGL
    • 初始化了Vsync分发线程EventThread
    • 初始化了图像合成的HWCompser
    • 初始化了图像显示设备Display

    3:开启SurfaceFlinger 的主线程,等待图像合成的命令

    相关文章

      网友评论

          本文标题:SurfaceFlinger服务启动与初始化

          本文链接:https://www.haomeiwen.com/subject/cxamoctx.html