您的位置:首页 > 其它

Cubietruck---20.SurfaceFlinger创建过程分析

2016-06-28 18:31 351 查看
一.surfaceFlinger的启动过程
1. 阻止system_init启动SF
在init.rc中

# Set this property so surfaceflinger is not started
by system_init

    setprop system_init.startsurfaceflinger 0

即然上面说了要阻止system_init把surfaceFlinger启动,那就看一下是如何阻止的吧.
在frameworks/base/cmds/system_server/library/system_init.cpp中

extern "C" status_t system_init()

{

    char propBuf[PROPERTY_VALUE_MAX];

    property_get("system_init.startsurfaceflinger", propBuf, "1");

    if (strcmp(propBuf, "1") == 0) {

        SurfaceFlinger::instantiate();

    } 

}

获取system_init.startsurfaceflinger这个属性的值,如果为1的话,就启动sf.
但是在init.rc中把这个属性值设为了0,这个就不会启动sf了.
2. SF的真正启动过程
还是在init.rc中

service surfaceflinger /system/bin/surfaceflinger

    class main

    user system

    group graphics

    onrestart restart zygote

在frameworks/native/cmds/surfaceflinger/main_surfaceflinger.cpp中

int main(int argc, char** argv) {

    SurfaceFlinger::publishAndJoinThreadPool(true);

    ProcessState::self()->setThreadPoolMaxThreadCount(4);

    return 0;

}

在frameworks/native/include/binder/BinderService.h中

static void publishAndJoinThreadPool(bool allowIsolated = false) {

    sp<IServiceManager> sm(defaultServiceManager());

    sm->addService(String16(SERVICE::getServiceName()), new
SERVICE(), allowIsolated);

    ProcessState::self()->startThreadPool();

    IPCThreadState::self()->joinThreadPool();

}

其中的new SERVICE就是new一个surfaceflinger,进入surfaceflinger的构造函数
3. onFirstRef启动主线程
因为SurfaceFlinger继承自class Thread, Thread又继承自RefBase
在 frameworks/native/include/utils/Thread.h中, class Thread : virtual public RefBase

void SurfaceFlinger::onFirstRef()

{

    mEventQueue.init(this); 
            //消息队列初始化

    run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);  //启动工作线程

    mReadyToRunBarrier.wait();  
//等侍标志

}

status_t SurfaceFlinger::readyToRun()

{

    mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);

    eglInitialize(mEGLDisplay, NULL, NULL);

    mHwc = new HWComposer(this, *static_cast<HWComposer::EventHandler *>(this));

    EGLint format = mHwc->getVisualID();

    mEGLConfig = selectEGLConfig(mEGLDisplay, format);

    mEGLContext = createGLContext(mEGLDisplay, mEGLConfig);

    for (size_t i=0 ; i<DisplayDevice::NUM_DISPLAY_TYPES ; i++) {

        DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);

        mDefaultDisplays[i] = new BBinder();

        wp<IBinder> token = mDefaultDisplays[i];

        if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {

            bool isSecure = true;

            mCurrentState.displays.add(token, DisplayDeviceState(type));

            sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i);

            sp<SurfaceTextureClient> stc = new SurfaceTextureClient(static_cast< sp<ISurfaceTexture> >(fbs->getBufferQueue()));

            sp<DisplayDevice> hw = new DisplayDevice(this, type, isSecure, token, stc, fbs, mEGLConfig);

            if (i > DisplayDevice::DISPLAY_PRIMARY)

                hw->acquireScreen();            

            mDisplays.add(token, hw);

        }

    }

    sp<const DisplayDevice> hw(getDefaultDisplayDevice());

    DisplayDevice::makeCurrent(mEGLDisplay, hw, mEGLContext);

    initializeGL(mEGLDisplay);

    mEventThread = new EventThread(this);

    mEventQueue.setEventThread(mEventThread);

    mDrawingState = mCurrentState;

    mReadyToRunBarrier.open();

    initializeDisplays();

    startBootAnim();

    return NO_ERROR;

}

a. 初始化egl
b. 新建 HWComposer
c. 新建 DisplayDevice
    

DisplayDevice::DisplayDevice(const sp<SurfaceFlinger>& flinger, ...)

{

    init(config);

    mDisplayDispatcher = new DisplayDispatcher(mFlinger); //新建一个DisplayDispatcher

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: