SurfaceFlinger principl
来源:互联网 发布:mysql affected rows 编辑:程序博客网 时间:2024/06/10 19:20
基于Android 6.0源码, 分析SurfaceFlinger原理
frameworks/native/services/surfaceflinger/ - main_surfaceflinger.cpp - SurfaceFlinger.cpp - DispSync.cpp - MessageQueue.cpp - DisplayHardware/HWComposer.cpp frameworks/native/libs/gui/DisplayEventReceiver.cppframeworks/native/libs/gui/BitTube.cpp
一. 概述
Android系统的图形处理相关的模块,就不得不提surfaceflinger,这是由init进程所启动的 守护进程,在init.rc中该服务如下:
service surfaceflinger /system/bin/surfaceflinger class core user system group graphics drmrpc onrestart restart zygote writepid /dev/cpuset/system-background/tasks
surfaceflinger服务属于核心类(core class),另外,当surfaceflinger重启时会触发zygote的重启。 surfaceflinger服务启动的起点便是如下的main()函数。
二. 启动过程
2.1 main
[-> main_surfaceflinger.cpp]
int main(int, char**) { ProcessState::self()->setThreadPoolMaxThreadCount(4); sp<ProcessState> ps(ProcessState::self()); ps->startThreadPool(); //实例化surfaceflinger【见小节2.2】 sp<SurfaceFlinger> flinger = new SurfaceFlinger(); setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY); set_sched_policy(0, SP_FOREGROUND); //初始化【见小节2.3】 flinger->init(); //发布surface flinger,注册到Service Manager sp<IServiceManager> sm(defaultServiceManager()); sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false); // 运行在当前线程【见小节2.11】 flinger->run(); return 0;}
该方法的主要功能:
- 设定surfaceflinger进程的binder线程池个数上限为4,并启动binder线程池;
- 创建SurfaceFlinger对象;【见小节2.1】
- 设置surfaceflinger进程为高优先级以及前台调度策略;
- 初始化SurfaceFlinger;【见小节2.3】
- 将”SurfaceFlinger”服务注册到Service Manager;
- 在当前主线程执行SurfaceFlinger的run方法。【见小节2.11】
2.2 创建SurfaceFlinger
[-> SurfaceFlinger.cpp]
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"); char value[PROPERTY_VALUE_MAX]; property_get("ro.bq.gpu_to_cpu_unsupported", value, "0"); mGpuToCpuSupported = !atoi(value); property_get("debug.sf.showupdates", value, "0"); mDebugRegion = atoi(value); property_get("debug.sf.ddms", value, "0"); mDebugDDMS = atoi(value); }
SurfaceFlinger继承于BnSurfaceComposer,IBinder::DeathRecipient,HWComposer::EventHandler
flinger的数据类型为sp 强指针类型,当首次被强指针引用时则执行OnFirstRef()
2.2.1 SF.onFirstRef
void SurfaceFlinger::onFirstRef(){ mEventQueue.init(this);}
2.2.2 MQ.init
[-> MessageQueue.cpp]
void MessageQueue::init(const sp<SurfaceFlinger>& flinger){ mFlinger = flinger; mLooper = new Looper(true); mHandler = new Handler(*this); //【见小节2.2.3】}
这个Handler是MessageQueue的内部类Handler。
2.2.3 MQ.Handler
[-> MessageQueue.cpp]
class MessageQueue { class Handler : public MessageHandler { enum { eventMaskInvalidate = 0x1, eventMaskRefresh = 0x2, eventMaskTransaction = 0x4 }; MessageQueue& mQueue; int32_t mEventMask; public: Handler(MessageQueue& queue) : mQueue(queue), mEventMask(0) { } virtual void handleMessage(const Message& message); void dispatchRefresh(); void dispatchInvalidate(); void dispatchTransaction(); }; ...}
2.3 SF.init
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::init() { Mutex::Autolock _l(mStateLock); //初始化EGL,作为默认的显示 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(mEGLDisplay, NULL, NULL); // 初始化硬件composer对象【见小节2.4】 mHwc = new HWComposer(this, *static_cast<HWComposer::EventHandler *>(this)); //获取RenderEngine引擎 mRenderEngine = RenderEngine::create(mEGLDisplay, mHwc->getVisualID()); //检索创建的EGL上下文 mEGLContext = mRenderEngine->getEGLContext(); //初始化非虚拟显示屏【见小节2.5】 for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) { DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i); //建立已连接的显示设备 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) { bool isSecure = true; createBuiltinDisplayLocked(type); wp<IBinder> token = mBuiltinDisplays[i]; sp<IGraphicBufferProducer> producer; sp<IGraphicBufferConsumer> consumer; //创建BufferQueue的生产者和消费者 BufferQueue::createBufferQueue(&producer, &consumer, new GraphicBufferAlloc()); sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i, consumer); int32_t hwcId = allocateHwcDisplayId(type); //创建显示设备 sp<DisplayDevice> hw = new DisplayDevice(this, type, hwcId, mHwc->getFormat(hwcId), isSecure, token, fbs, producer, mRenderEngine->getEGLConfig()); if (i > DisplayDevice::DISPLAY_PRIMARY) { hw->setPowerMode(HWC_POWER_MODE_NORMAL); } mDisplays.add(token, hw); } } getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext); //创建DispSyncSource对象【2.6】 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync, vsyncPhaseOffsetNs, true, "app"); //创建线程EventThread 【见小节2.7】 mEventThread = new EventThread(vsyncSrc); sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync, sfVsyncPhaseOffsetNs, true, "sf"); mSFEventThread = new EventThread(sfVsyncSrc); //设置EventThread 【见小节2.8】 mEventQueue.setEventThread(mSFEventThread); //【见小节2.9】 mEventControlThread = new EventControlThread(this); mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY); //当不存在HWComposer时,则设置软件vsync if (mHwc->initCheck() != NO_ERROR) { mPrimaryDispSync.setPeriod(16666667); } //初始化绘图状态 mDrawingState = mCurrentState; //初始化显示设备 initializeDisplays(); //启动开机动画【2.10】 startBootAnim();}
主要功能:
- 初始化EGL相关;
- 创建HWComposer对象;
- 初始化非虚拟显示屏;
- 启动app和sf两个EventThread线程;
- 启动开机动画;
2.4 创建HWComposer
[-> HWComposer.cpp]
HWComposer::HWComposer( const sp<SurfaceFlinger>& flinger, EventHandler& handler) : mFlinger(flinger), mFbDev(0), mHwc(0), mNumDisplays(1), mCBContext(new cb_context), mEventHandler(handler), mDebugForceFakeVSync(false){ ... bool needVSyncThread = true; int fberr = loadFbHalModule(); //加载framebuffer的HAL层模块 loadHwcModule(); //加载HWComposer模块 //标记已分配的display ID for (size_t i=0 ; i<NUM_BUILTIN_DISPLAYS ; i++) { mAllocatedDisplayIDs.markBit(i); } if (mHwc) { if (mHwc->registerProcs) { mCBContext->hwc = this; mCBContext->procs.invalidate = &hook_invalidate; //VSYNC信号的回调方法 mCBContext->procs.vsync = &hook_vsync; if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) mCBContext->procs.hotplug = &hook_hotplug; else mCBContext->procs.hotplug = NULL; memset(mCBContext->procs.zero, 0, sizeof(mCBContext->procs.zero)); //注册回调函数 mHwc->registerProcs(mHwc, &mCBContext->procs); } //进入此处,说明已成功打开硬件composer设备,则不再需要vsync线程 needVSyncThread = false; eventControl(HWC_DISPLAY_PRIMARY, HWC_EVENT_VSYNC, 0); ... } ... if (needVSyncThread) { //不支持硬件的VSYNC,则会创建线程来模拟定时VSYNC信号 mVSyncThread = new VSyncThread(*this); }}
HWComposer代表着硬件显示设备,注册了VSYNC信号的回调。VSYNC信号本身是由显示驱动产生的, 在不支持硬件的VSYNC,则会创建“VSyncThread”线程来模拟定时VSYNC信号。
2.5 显示设备
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::init() { ... for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) { DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i); //建立已连接的显示设备 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) { bool isSecure = true; createBuiltinDisplayLocked(type); wp<IBinder> token = mBuiltinDisplays[i]; sp<IGraphicBufferProducer> producer; sp<IGraphicBufferConsumer> consumer; //创建BufferQueue的生产者和消费者 BufferQueue::createBufferQueue(&producer, &consumer, new GraphicBufferAlloc()); sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i, consumer); int32_t hwcId = allocateHwcDisplayId(type); //创建显示设备 sp<DisplayDevice> hw = new DisplayDevice(this, type, hwcId, mHwc->getFormat(hwcId), isSecure, token, fbs, producer, mRenderEngine->getEGLConfig()); if (i > DisplayDevice::DISPLAY_PRIMARY) { hw->setPowerMode(HWC_POWER_MODE_NORMAL); } mDisplays.add(token, hw); } } ...}
创建IGraphicBufferProducer和IGraphicBufferConsumer,以及FramebufferSurface,DisplayDevice对象。另外, 显示设备有3类:主设备,扩展设备,虚拟设备。其中前两个都是内置显示设备,故NUM_BUILTIN_DISPLAY_TYPES=2,
2.6 DispSyncSource
[-> SurfaceFlinger.cpp]
class DispSyncSource : public VSyncSource, private DispSync::Callback { DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync, const char* label) : mValue(0), mTraceVsync(traceVsync), mVsyncOnLabel(String8::format("VsyncOn-%s", label)), mVsyncEventLabel(String8::format("VSYNC-%s", label)), mDispSync(dispSync), mCallbackMutex(), mCallback(), mVsyncMutex(), mPhaseOffset(phaseOffset), mEnabled(false) {} ... }
2.7 EventThread线程
[-> EventThread.cpp]
EventThread::EventThread(const sp<VSyncSource>& src) : mVSyncSource(src), mUseSoftwareVSync(false), mVsyncEnabled(false), mDebugVsyncEnabled(false), mVsyncHintSent(false) { for (int32_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) { mVSyncEvent[i].header.type = DisplayEventReceiver::DISPLAY_EVENT_VSYNC; mVSyncEvent[i].header.id = 0; mVSyncEvent[i].header.timestamp = 0; mVSyncEvent[i].vsync.count = 0; } struct sigevent se; se.sigev_notify = SIGEV_THREAD; se.sigev_value.sival_ptr = this; se.sigev_notify_function = vsyncOffCallback; se.sigev_notify_attributes = NULL; timer_create(CLOCK_MONOTONIC, &se, &mTimerId);}
EventThread继承于Thread和VSyncSource::Callback两个类。
2.7.1 ET.onFirstRef
[-> EventThread.cpp]
void EventThread::onFirstRef() { //运行EventThread线程【见小节2.7.2】 run("EventThread", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE);}
2.7.2 ET.threadLoop
[-> EventThread.cpp]
bool EventThread::threadLoop() { DisplayEventReceiver::Event event; Vector< sp<EventThread::Connection> > signalConnections; // 等待事件【见小节2.7.3】 signalConnections = waitForEvent(&event); //分发事件给所有的监听者 const size_t count = signalConnections.size(); for (size_t i=0 ; i<count ; i++) { const sp<Connection>& conn(signalConnections[i]); //传递事件【见小节3.10】 status_t err = conn->postEvent(event); if (err == -EAGAIN || err == -EWOULDBLOCK) { //可能此时connection已满,则直接抛弃事件 ALOGW("EventThread: dropping event (%08x) for connection %p", event.header.type, conn.get()); } else if (err < 0) { //发生致命错误,则清理该连接 removeDisplayEventConnection(signalConnections[i]); } } return true;}
2.7.3 waitForEvent
[-> EventThread.cpp]
Vector< sp<EventThread::Connection> > EventThread::waitForEvent( DisplayEventReceiver::Event* event){ Mutex::Autolock _l(mLock); Vector< sp<EventThread::Connection> > signalConnections; do { bool eventPending = false; bool waitForVSync = false; size_t vsyncCount = 0; nsecs_t timestamp = 0; for (int32_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) { timestamp = mVSyncEvent[i].header.timestamp; if (timestamp) { *event = mVSyncEvent[i]; mVSyncEvent[i].header.timestamp = 0; vsyncCount = mVSyncEvent[i].vsync.count; break; } } if (!timestamp) { //没有vsync事件,则查看其它事件 eventPending = !mPendingEvents.isEmpty(); if (eventPending) { //存在其它事件可用于分发 *event = mPendingEvents[0]; mPendingEvents.removeAt(0); } } //查找正在等待事件的连接 size_t count = mDisplayEventConnections.size(); for (size_t i=0 ; i<count ; i++) { sp<Connection> connection(mDisplayEventConnections[i].promote()); if (connection != NULL) { bool added = false; if (connection->count >= 0) { //需要vsync事件,由于至少存在一个连接正在等待vsync waitForVSync = true; if (timestamp) { if (connection->count == 0) { connection->count = -1; signalConnections.add(connection); added = true; } else if (connection->count == 1 || (vsyncCount % connection->count) == 0) { signalConnections.add(connection); added = true; } } } if (eventPending && !timestamp && !added) { //没有vsync事件需要处理(timestamp==0),但存在pending消息 signalConnections.add(connection); } } else { //该连接已死亡,则直接清理 mDisplayEventConnections.removeAt(i); --i; --count; } } if (timestamp && !waitForVSync) { //接收到VSYNC,但没有client需要它,则直接关闭VSYNC disableVSyncLocked(); } else if (!timestamp && waitForVSync) { //至少存在一个client,则需要使能VSYNC enableVSyncLocked(); } if (!timestamp && !eventPending) { if (waitForVSync) { bool softwareSync = mUseSoftwareVSync; nsecs_t timeout = softwareSync ? ms2ns(16) : ms2ns(1000); if (mCondition.waitRelative(mLock, timeout) == TIMED_OUT) { mVSyncEvent[0].header.type = DisplayEventReceiver::DISPLAY_EVENT_VSYNC; mVSyncEvent[0].header.id = DisplayDevice::DISPLAY_PRIMARY; mVSyncEvent[0].header.timestamp = systemTime(SYSTEM_TIME_MONOTONIC); mVSyncEvent[0].vsync.count++; } } else { //不存在对vsync感兴趣的连接,即将要进入休眠 mCondition.wait(mLock); } } } while (signalConnections.isEmpty()); //到此处,则保证存在timestamp以及连接 return signalConnections;}
EventThread线程,进入mCondition的wait()方法,等待唤醒。
2.8 setEventThread
[-> MessageQueue.cpp]
void MessageQueue::setEventThread(const sp<EventThread>& eventThread){ mEventThread = eventThread; //创建连接 mEvents = eventThread->createEventConnection(); //获取BitTube对象 mEventTube = mEvents->getDataChannel(); //监听BitTube,一旦有数据,则调用cb_eventReceiver mLooper->addFd(mEventTube->getFd(), 0, Looper::EVENT_INPUT, MessageQueue::cb_eventReceiver, this);}
2.9 EventControlThread线程
[-> EventControlThread.cpp]
EventControlThread::EventControlThread(const sp<SurfaceFlinger>& flinger): mFlinger(flinger), mVsyncEnabled(false) {}bool EventControlThread::threadLoop() { Mutex::Autolock lock(mMutex); bool vsyncEnabled = mVsyncEnabled; mFlinger->eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, mVsyncEnabled); while (true) { status_t err = mCond.wait(mMutex); ... if (vsyncEnabled != mVsyncEnabled) { mFlinger->eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, mVsyncEnabled); vsyncEnabled = mVsyncEnabled; } } return false;}
EventControlThread也是继承于Thread。
2.10 startBootAnim
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::startBootAnim() { property_set("service.bootanim.exit", "0"); property_set("ctl.start", "bootanim");}
通过控制ctl.start属性,设置成bootanim值,则触发init进程来创建开机动画进程bootanim, 到此,则开始显示开机过程的动画。 从小节[2.4 ~2.9]都是介绍SurfaceFlinger的init()过程, 紧接着便执行其run()方法。
2.11 SF.run
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::run() { do { //不断循环地等待事件【见小节2.12】 waitForEvent(); } while (true);}
2.12 SF.waitForEvent
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::waitForEvent() { mEventQueue.waitMessage(); //【2.13】}
mEventQueue的数据类型为MessageQueue。
2.13 MQ.waitMessage
[-> MessageQueue.cpp]
void MessageQueue::waitMessage() { do { IPCThreadState::self()->flushCommands(); int32_t ret = mLooper->pollOnce(-1); ... } while (true);}
可见SurfaceFlinger主线程进入waitMessage来等待消息的到来。
三. Vsync信号
HWComposer对象创建过程,会注册一些回调方法,当硬件产生VSYNC信号时,则会回调hook_vsync()方法。
3.1 HWC.hook_vsync
[-> HWComposer.cpp]
void HWComposer::hook_vsync(const struct hwc_procs* procs, int disp, int64_t timestamp) { cb_context* ctx = reinterpret_cast<cb_context*>( const_cast<hwc_procs_t*>(procs)); ctx->hwc->vsync(disp, timestamp); //【见小节3.2】}
3.2 HWC.vsync
[-> HWComposer.cpp]
void HWComposer::vsync(int disp, int64_t timestamp) { if (uint32_t(disp) < HWC_NUM_PHYSICAL_DISPLAY_TYPES) { { Mutex::Autolock _l(mLock); if (timestamp == mLastHwVSync[disp]) { return; //忽略重复的VSYNC信号 } mLastHwVSync[disp] = timestamp; } //【见小节3.3】 mEventHandler.onVSyncReceived(disp, timestamp); }}
当收到VSYNC信号则会回调EventHandler的onVSyncReceived()方法,此处mEventHandler是指SurfaceFlinger对象。
3.3 SF.onVSyncReceived
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::onVSyncReceived(int type, nsecs_t timestamp) { bool needsHwVsync = false; { Mutex::Autolock _l(mHWVsyncLock); if (type == 0 && mPrimaryHWVsyncEnabled) { // 此处mPrimaryDispSync为DispSync类【见小节3.4】 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp); } } if (needsHwVsync) { enableHardwareVsync(); } else { disableHardwareVsync(false); }}
3.4 DS.addResyncSample
此处调用addResyncSample对象的addResyncSample方法,那么先来看看DispSync对象的初始化过程
3.4.1 创建DispSync
[-> DispSync.cpp]
DispSync::DispSync() : mRefreshSkipCount(0), mThread(new DispSyncThread()) { //【见小节3.4.2】 mThread->run("DispSync", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE); reset(); beginResync(); ...}
3.4.2 DispSyncThread线程
[-> DispSync.cpp]
virtual bool threadLoop() { status_t err; nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); nsecs_t nextEventTime = 0; while (true) { Vector<CallbackInvocation> callbackInvocations; nsecs_t targetTime = 0; { // Scope for lock Mutex::Autolock lock(mMutex); if (mStop) { return false; } if (mPeriod == 0) { err = mCond.wait(mMutex); continue; } nextEventTime = computeNextEventTimeLocked(now); targetTime = nextEventTime; bool isWakeup = false; if (now < targetTime) { err = mCond.waitRelative(mMutex, targetTime - now); if (err == TIMED_OUT) { isWakeup = true; } else if (err != NO_ERROR) { return false; } } now = systemTime(SYSTEM_TIME_MONOTONIC); if (isWakeup) { mWakeupLatency = ((mWakeupLatency * 63) + (now - targetTime)) / 64; if (mWakeupLatency > 500000) { mWakeupLatency = 500000; } } //收集vsync信号的所有回调方法 callbackInvocations = gatherCallbackInvocationsLocked(now); } if (callbackInvocations.size() > 0) { //回调所有对象的onDispSyncEvent方法 fireCallbackInvocations(callbackInvocations); } } return false; }
线程”DispSync”停留在mCond的wait()过程,等待被唤醒。
3.4.3 addResyncSample
[-> DispSync.cpp]
bool DispSync::addResyncSample(nsecs_t timestamp) { Mutex::Autolock lock(mMutex); size_t idx = (mFirstResyncSample + mNumResyncSamples) % MAX_RESYNC_SAMPLES; mResyncSamples[idx] = timestamp; if (mNumResyncSamples < MAX_RESYNC_SAMPLES) { mNumResyncSamples++; } else { mFirstResyncSample = (mFirstResyncSample + 1) % MAX_RESYNC_SAMPLES; } updateModelLocked(); //【见小节3.5】 if (mNumResyncSamplesSincePresent++ > MAX_RESYNC_SAMPLES_WITHOUT_PRESENT) { resetErrorLocked(); } if (kIgnorePresentFences) { return mThread->hasAnyEventListeners(); } return mPeriod == 0 || mError > kErrorThreshold;}
3.5 DS.updateModelLocked
[-> DispSync.cpp]
void DispSync::updateModelLocked() { ... //【见小节3.6】 mThread->updateModel(mPeriod, mPhase);}
3.6 DST.updateModel
[-> DispSyncThread.cpp]
class DispSyncThread: public Thread { void updateModel(nsecs_t period, nsecs_t phase) { Mutex::Autolock lock(mMutex); mPeriod = period; mPhase = phase; mCond.signal(); //唤醒目标线程 }}
唤醒DispSyncThread线程,接下里进入DispSyncThread线程。
3.7 DispSyncThread线程
[-> DispSync.cpp]
virtual bool threadLoop() { ... while (true) { Vector<CallbackInvocation> callbackInvocations; nsecs_t targetTime = 0; { // Scope for lock Mutex::Autolock lock(mMutex); ... if (now < targetTime) { err = mCond.waitRelative(mMutex, targetTime - now); ... } ... //收集vsync信号的所有回调方法 callbackInvocations = gatherCallbackInvocationsLocked(now); } if (callbackInvocations.size() > 0) { //回调所有对象的onDispSyncEvent方法 【见小节3.7.1】 fireCallbackInvocations(callbackInvocations); } } return false; }
3.7.1 fireCallbackInvocations
void fireCallbackInvocations(const Vector<CallbackInvocation>& callbacks) { for (size_t i = 0; i < callbacks.size(); i++) { //【见小节3.8】 callbacks[i].mCallback->onDispSyncEvent(callbacks[i].mEventTime); }}
在前面小节SurfaceFlinger调用init()的过程,创建了两个DispSyncSource对象。接下里便是回调该对象的 onDispSyncEvent。
3.8 DSS.onDispSyncEvent
[-> SurfaceFlinger.cpp ::DispSyncSource]
virtual void onDispSyncEvent(nsecs_t when) { sp<VSyncSource::Callback> callback; { Mutex::Autolock lock(mCallbackMutex); callback = mCallback; } if (callback != NULL) { callback->onVSyncEvent(when); //【见小节3.9】 }}
3.9 ET.onVSyncEvent
[-> EventThread.java]
void EventThread::onVSyncEvent(nsecs_t timestamp) { Mutex::Autolock _l(mLock); mVSyncEvent[0].header.type = DisplayEventReceiver::DISPLAY_EVENT_VSYNC; mVSyncEvent[0].header.id = 0; mVSyncEvent[0].header.timestamp = timestamp; mVSyncEvent[0].vsync.count++; mCondition.broadcast(); //唤醒EventThread线程}
mCondition.broadcast能够唤醒处理waitForEvent()过程的EventThread【见小节2.7.2】,并往下执行conn的postEvent().
3.10 ET.postEvent
[-> EventThread.java]
status_t EventThread::Connection::postEvent( const DisplayEventReceiver::Event& event) { ssize_t size = DisplayEventReceiver::sendEvents(mChannel, &event, 1); return size < 0 ? status_t(size) : status_t(NO_ERROR);}
3.11 DER.sendEvents
[-> DisplayEventReceiver.cpp]
ssize_t DisplayEventReceiver::sendEvents(const sp<BitTube>& dataChannel, Event const* events, size_t count){ return BitTube::sendObjects(dataChannel, events, count);}
根据小节【2.8】可知监听BitTube,此处调用BitTube来sendObjects。一旦收到数据,则调用MQ.cb_eventReceiver()方法。
3.11.1 MQ.cb_eventReceiver
[-> MessageQueue.cpp]
int MessageQueue::cb_eventReceiver(int fd, int events, void* data) { MessageQueue* queue = reinterpret_cast<MessageQueue *>(data); return queue->eventReceiver(fd, events);}
3.11.2 MQ.eventReceiver
[-> MessageQueue.cpp]
int MessageQueue::eventReceiver(int /*fd*/, int /*events*/) { ssize_t n; DisplayEventReceiver::Event buffer[8]; while ((n = DisplayEventReceiver::getEvents(mEventTube, buffer, 8)) > 0) { for (int i=0 ; i<n ; i++) { if (buffer[i].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) {#if INVALIDATE_ON_VSYNC mHandler->dispatchInvalidate();#else mHandler->dispatchRefresh(); //【见小节3.12】#endif break; } } } return 1;}
3.12 MQ.dispatchRefresh
void MessageQueue::Handler::dispatchRefresh() { if ((android_atomic_or(eventMaskRefresh, &mEventMask) & eventMaskRefresh) == 0) { //发送消息,则进入handleMessage过程【见小节3.13】 mQueue.mLooper->sendMessage(this, Message(MessageQueue::REFRESH)); }}
3.13 MQ.handleMessage
void MessageQueue::Handler::handleMessage(const Message& message) { switch (message.what) { case INVALIDATE: android_atomic_and(~eventMaskInvalidate, &mEventMask); mQueue.mFlinger->onMessageReceived(message.what); break; case REFRESH: android_atomic_and(~eventMaskRefresh, &mEventMask); mQueue.mFlinger->onMessageReceived(message.what);//【见小节3.14】 break; case TRANSACTION: android_atomic_and(~eventMaskTransaction, &mEventMask); mQueue.mFlinger->onMessageReceived(message.what); break; }}
对于REFRESH操作,则进入onMessageReceived().
3.14 SF.onMessageReceived
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::onMessageReceived(int32_t what) { ATRACE_CALL(); switch (what) { case MessageQueue::TRANSACTION: { handleMessageTransaction(); break; } case MessageQueue::INVALIDATE: { bool refreshNeeded = handleMessageTransaction(); refreshNeeded |= handleMessageInvalidate(); refreshNeeded |= mRepaintEverything; if (refreshNeeded) { signalRefresh(); } break; } case MessageQueue::REFRESH: { handleMessageRefresh(); break; } }}
3.15 SF.handleMessageRefresh
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::handleMessageRefresh() { ATRACE_CALL(); preComposition(); rebuildLayerStacks(); setUpHWComposer(); doDebugFlashRegions(); doComposition(); postComposition();}
下一篇文章,再来介绍图形输出过程。
四 总结
前面讲述过程中所涉及到的线程情况:
- 主线程“/system/bin/surfaceflinger”: 主线程
- 线程”EventThread”:EventThread
- 线程”EventControl”: EventControlThread
- 线程”DispSync”:DispSyncThread
Vsync处理流程图:点击查看大图
欢迎关注我的微博: weibo.com/gityuan !请随意 ¥打赏支持 将激励创作更多技术干货!- SurfaceFlinger principl
- surfaceflinger
- SurfaceFlinger
- SurfaceFlinger
- SurfaceFlinger
- surfaceflinger 详解
- 学习SurfaceFlinger
- surfaceflinger类图
- android surfaceflinger
- SurfaceFlinger详解
- SurfaceFlinger研究
- SurfaceFlinger研究
- SurfaceFlinger详解
- dumpsys SurfaceFlinger
- SurfaceFlinger简介
- SurfaceFlinger学习
- Surfaceflinger 概述
- surfaceflinger workflow
- Java中对象初始化顺序
- JAVA反射的使用之ResultSet的自动转换
- webview的返回finish问题
- Java IO学习笔记二
- 正则表达式集合
- SurfaceFlinger principl
- TS数据结构分析(写的很清晰)
- GetHashCode解析
- 在Android设备上不支持requestAnimationFrame
- JS 将秒转为x天x时x分x秒
- [leetcode]: 26. Remove Duplicates from Sorted Array
- Snowflake算法核心
- 添加动态库的四种方式
- 元件更新与替换