SurfaceFlinger服务启动与初始化

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 ps(ProcessState::self());
    ps->startThreadPool();

    //创建SurfaceFlinger对象
    sp flinger = new SurfaceFlinger();

    setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);

    set_sched_policy(0, SP_FOREGROUND);

    // 初始化SurfaceFlinger进程
    flinger->init();

    //将surfaceFlinger进程注册到ServiceManager
    sp 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& 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 vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
                vsyncPhaseOffsetNs, true, "app");
        mEventThread = new EventThread(vsyncSrc, *this);
        sp 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(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服务启动与初始化)