SurfaceFlinger principl

2024-01-25 08:40
文章标签 surfaceflinger principl

本文主要是介绍SurfaceFlinger principl,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于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进程所启动的 守护进程,在init.rc中该服务如下:

service surfaceflinger /system/bin/surfaceflingerclass coreuser systemgroup graphics drmrpconrestart restart zygotewritepid /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 Managersp<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时,则设置软件vsyncif (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 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->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事件,由于至少存在一个连接正在等待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 {//该连接已死亡,则直接清理mDisplayEventConnections.removeAt(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].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_eventReceivermLooper->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 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()过程,等待被唤醒。

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 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;}
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_VSYNCmHandler->dispatchInvalidate();
#elsemHandler->dispatchRefresh(); //【见小节3.12】
#endifbreak;}}}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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/642719

相关文章

Android SurfaceFlinger——图形内存分配器(十一)

前面的文章中的图层合成器(HWC),这里我们接着看一下 SurfaceFlinger 中的另一个重要服务——图形内存分配器。 一、简介         android.hardware.graphics.allocator@2.0 是 Android 系统中硬件抽象层(HAL)的一个组件,专门用于图形内存的分配和管理。它是 SurfaceFlinger 在处理图形数据时所依赖的

Android SurfaceFlinger——注册监听调用流程(七)

这一篇我们介绍一下 IComposer 中的另一个比较重要的方法,通过注册监听 Hal 层实现监听驱动的关键动作。 一、注册监听         在前面文章 SurfaceFlinger 的 init() 方法中,我们注册了一个 Callback 到 Hal 层中。最终通过 HIDL 调用到 Hal 层。 1、SurfaceFlinger.cpp 源码位置:/framewo

Android SurfaceFlinger——HWC图层合成器加载(四)

在前面文章中的 Android.bp 文件中,我们可以看到里面加载了图层合成器和图形内存分配器的 HAL 服务,这里篇我们就来详细介绍一下其中的图层合成器——HWC。 一、HWC简介         HWC,全称为 Hardware Composer,是 Android 系统中一个至关重要的组件,位于硬件抽象层(HAL)。它的主要职责是利用图形处理器(GPU)和其他硬件资源来高

android L 的surfaceflinger服务启动分析

android L 与android 4.4相同,surfaceflinger直接由init启动,不是system server。 init进程根据init.rc启动surfaceflinger服务 service surfaceflinger /system/bin/surfaceflingerclass coreuser systemgroup graphics dr

adb shell service命令与SurfaceFlinger调试

“ 在Android上有丰富的shell命令便于开发者用来调试程序,非常方便,本文简单说明下service命令的用法。” 01 基本用法 首先看一下使用说明,带上参数-h 或 -? $ adb shell service -hUsage: service [-h|-?]service listservice check SERVICEservice call SERVICE COD

Android6.0 显示系统(二) SurfaceFlinger创建Surface

接上篇博客分析到SurfaceComposerClient中调用createSurface函数会最后调用到SurfaceFlinger的Client的createSurface函数。 我们来看下这个函数,其handle和gbp都是Binder对象,gbp就是图像缓冲区对象。这个handle对象的作用和前面介绍Activity中的token作用类似,也是利用Binder的唯一性为Surface

Android性能:SurfaceFlinger与BufferQueue(3)

Android性能:SurfaceFlinger与BufferQueue(3) Android显示系统的组成可以概括为两大部分:绘制(DrawFrame)+合成(SurfaceFlinger + HWC) 绘制:Surface中空的 GraphicBuffer->CPU或者GPU通过Canvas->将数据Draw到Surface。 合成:几块有数据的Buffer->叠合成一张Buffer->

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制(2)

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制(2)   计算fps帧率 用 adb shell dumpsys SurfaceFlinger --list 查询当前的SurfaceView,然后有好多行,再把要查询的行内容完整的传给 adb shell dumpsys Surfac

Android图形系统之SurfaceFlinger与WindowManager(八)

SurfaceFlinger 接受缓冲区,对它们进行合成,然后发送到屏幕。WindowManager 为 SurfaceFlinger 提供缓冲区和窗口元数据,而 SurfaceFlinger 可使用这些信息将 Surface 合成到屏幕。 1.SurfaceFlinger SurfaceFlinger 可通过两种方式接受缓冲区:通过 BufferQueue 和 SurfaceControl

GUI系统之SurfaceFlinger(7)应用程序的典型绘图流程

文章都是通过阅读源码分析出来的,还在不断完善与改进中,其中难免有些地方理解得不对,欢迎大家批评指正。 转载请注明:From LXS. http://blog.csdn.net/uiop78uiop78/ GUI系统之SurfaceFlinger章节目录: blog.csdn.net/uiop78uiop78/article/details/8954508 1.1.1 应用程序