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 的主线程,等待图像合成的命令