基于Android 6.0源码, 分析SurfaceFlinger原理
frameworks/native/services/surfaceflinger/- main_surfaceflinger.cpp- SurfaceFlinger.cpp- DispSync.cpp- MessageQueue.cpp- DisplayHardware/HWComposer.cppframeworks/native/libs/gui/DisplayEventReceiver.cpp frameworks/native/libs/gui/BitTube.cpp
Android系统的图形处理相关的模块,就不得不提surfaceflinger,这是由init进程所启动的 守护进程,在中该服务如下:
service surfaceflinger /system/bin/surfaceflingerclass coreuser systemgroup graphics drmrpconrestart restart zygotewritepid /dev/cpuset/system-background/tasks
surfaceflinger服务属于核心类(core class),另外,当surfaceflinger重启时会触发zygote的重启。 surfaceflinger服务启动的起点便是如下的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 Managersp<IServiceManager> sm(defaultServiceManager());sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);// 运行在当前线程【见小节2.11】flinger->run();return 0; }
该方法的主要功能:
[-> 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()
void SurfaceFlinger::onFirstRef()
{mEventQueue.init(this);
}
[-> 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。
[-> 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();};...
}
[-> 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时,则设置软件vsyncif (mHwc->initCheck() != NO_ERROR) {mPrimaryDispSync.setPeriod(16666667);}//初始化绘图状态mDrawingState = mCurrentState;//初始化显示设备initializeDisplays();//启动开机动画【2.10】startBootAnim();
}
主要功能:
[-> 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 IDfor (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;elsemCBContext->procs.hotplug = NULL;memset(mCBContext-&, 0, sizeof(mCBContext-&));//注册回调函数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信号。
[-> 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,
[-> 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) {}... }
[-> 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].pe = DisplayEventReceiver::DISPLAY_EVENT_VSYNC;mVSyncEvent[i].header.id = 0;mVSyncEvent[i].header.timestamp = 0;mVSyncEvent[i].unt = 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两个类。
[-> EventThread.cpp]
void EventThread::onFirstRef() {//运行EventThread线程【见小节2.7.2】run("EventThread", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE); }
[-> 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",pe, ());} else if (err < 0) {//发生致命错误,则清理该连接removeDisplayEventConnection(signalConnections[i]);}}return true;
}
[-> 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].unt;break;}}if (!timestamp) {//没有vsync事件,则查看其它事件eventPending = !mPendingEvents.isEmpty();if (eventPending) {//存在其它事件可用于分发*event = mPendingEvents[0];veAt(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事件,由于至少存在一个连接正在等待vsyncwaitForVSync = 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 {//该连接已死亡,则直接清理veAt(i);--i; --count;}}if (timestamp && !waitForVSync) {//接收到VSYNC,但没有client需要它,则直接关闭VSYNCdisableVSyncLocked();} else if (!timestamp && waitForVSync) {//至少存在一个client,则需要使能VSYNCenableVSyncLocked();}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].pe = DisplayEventReceiver::DISPLAY_EVENT_VSYNC;mVSyncEvent[0].header.id = DisplayDevice::DISPLAY_PRIMARY;mVSyncEvent[0].header.timestamp = systemTime(SYSTEM_TIME_MONOTONIC);mVSyncEvent[0].unt++;}} else {//不存在对vsync感兴趣的连接,即将要进入休眠mCondition.wait(mLock);}}} while (signalConnections.isEmpty());//到此处,则保证存在timestamp以及连接return signalConnections; }
EventThread线程,进入mCondition的wait()方法,等待唤醒。
[-> MessageQueue.cpp]
void MessageQueue::setEventThread(const sp<EventThread>& eventThread) {mEventThread = eventThread;//创建连接mEvents = eventThread->createEventConnection();//获取BitTube对象mEventTube = mEvents->getDataChannel();//监听BitTube,一旦有数据,则调用cb_eventReceivermLooper->addFd(mEventTube->getFd(), 0, Looper::EVENT_INPUT,MessageQueue::cb_eventReceiver, this); }
[-> 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。
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::startBootAnim() {property_set("it", "0");property_set("ctl.start", "bootanim"); }
通过控制ctl.start属性,设置成bootanim值,则触发init进程来创建开机动画进程bootanim, 到此,则开始显示开机过程的动画。 从小节[2.4 ~2.9]都是介绍SurfaceFlinger的init()过程, 紧接着便执行其run()方法。
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::run() {do {//不断循环地等待事件【见小节2.12】waitForEvent(); } while (true);
}
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::waitForEvent() {mEventQueue.waitMessage(); //【2.13】 }
mEventQueue的数据类型为MessageQueue。
[-> MessageQueue.cpp]
void MessageQueue::waitMessage() {do {IPCThreadState::self()->flushCommands();int32_t ret = mLooper->pollOnce(-1);...} while (true); }
可见SurfaceFlinger主线程进入waitMessage来等待消息的到来。
HWComposer对象创建过程,会注册一些回调方法,当硬件产生VSYNC信号时,则会回调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】
}
[-> 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】VSyncReceived(disp, timestamp);}
}
当收到VSYNC信号则会回调EventHandler的onVSyncReceived()方法,此处mEventHandler是指SurfaceFlinger对象。
[-> 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);}
}
此处调用addResyncSample对象的addResyncSample方法,那么先来看看DispSync对象的初始化过程
[-> DispSync.cpp]
DispSync::DispSync() :mRefreshSkipCount(0),mThread(new DispSyncThread()) {//【见小节3.4.2】mThread->run("DispSync", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE);reset();beginResync();... }
[-> 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 lockMutex::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()过程,等待被唤醒。
[-> 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;
}
[-> DispSync.cpp]
void DispSync::updateModelLocked() {...//【见小节3.6】mThread->updateModel(mPeriod, mPhase); }
[-> 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线程。
[-> DispSync.cpp]
virtual bool threadLoop() {...while (true) {Vector<CallbackInvocation> callbackInvocations;nsecs_t targetTime = 0;{ // Scope for lockMutex::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;}
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。
[-> 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】}
}
[-> EventThread.java]
void EventThread::onVSyncEvent(nsecs_t timestamp) {Mutex::Autolock _l(mLock);mVSyncEvent[0].pe = DisplayEventReceiver::DISPLAY_EVENT_VSYNC;mVSyncEvent[0].header.id = 0;mVSyncEvent[0].header.timestamp = timestamp;mVSyncEvent[0].unt++;mCondition.broadcast(); //唤醒EventThread线程 }
mCondition.broadcast能够唤醒处理waitForEvent()过程的EventThread【见小节2.7.2】,并往下执行conn的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);
}
[-> 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()方法。
[-> MessageQueue.cpp]
int MessageQueue::cb_eventReceiver(int fd, int events, void* data) {MessageQueue* queue = reinterpret_cast<MessageQueue *>(data);return queue->eventReceiver(fd, events);
}
[-> 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].pe == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) { #if INVALIDATE_ON_VSYNCmHandler->dispatchInvalidate(); #elsemHandler->dispatchRefresh(); //【见小节3.12】 #endifbreak;}}}return 1; }
void MessageQueue::Handler::dispatchRefresh() {if ((android_atomic_or(eventMaskRefresh, &mEventMask) & eventMaskRefresh) == 0) {//发送消息,则进入handleMessage过程【见小节3.13】mQueue.mLooper->sendMessage(this, Message(MessageQueue::REFRESH));} }
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().
[-> 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;}} }
[-> SurfaceFlinger.cpp]
void SurfaceFlinger::handleMessageRefresh() {ATRACE_CALL();preComposition();rebuildLayerStacks();setUpHWComposer();doDebugFlashRegions();doComposition();postComposition(); }
下一篇文章,再来介绍图形输出过程。
前面讲述过程中所涉及到的线程情况:
Vsync处理流程图:点击查看大图
欢迎关注我的微博: weibo/gityuan !请随意 ¥打赏支持 将激励创作更多技术干货!
本文发布于:2024-01-27 17:05:05,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063463111547.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |