一旦有事件发生,MessageQueue::cb_eventReceiver就会执行,进一步调用eventReceiver,如果事件类型是DisplayEventReceiver::DISPLAY_EVENT_VSYNC,开始处理UI数据的合成。
MessageQueue.cpp
int MessageQueue::cb_eventReceiver(int fd, int events, void* data) { MessageQueue* queue = reinterpret_cast<MessageQueue *>(data); return queue->eventReceiver(fd, events); }
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) { mHandler->dispatchInvalidate(); break; } } } return 1; }
dispatchInvalidate会发出MessageQueue::INVALIDATE消息,然后触发surfaceflinger的onMessageReceived。
void SurfaceFlinger::onMessageReceived(int32_t what) { switch (what) { case MessageQueue::INVALIDATE: { bool refreshNeeded = handleMessageTransaction(); refreshNeeded |= handleMessageInvalidate(); refreshNeeded |= mRepaintEverything; if (refreshNeeded) { // Signal a refresh if a transaction modified the window state, // a new buffer was latched, or if HWC has requested a full // repaint signalRefresh(); } break; } case MessageQueue::REFRESH: { handleMessageRefresh(); break; } } }
在onMessageReceived中,除了INVALIDATE,还有REFRESH,什么时候会收到MessageQueue::REFRESH消息呢?一种情况就是signalRefresh()的调用,会发出MessageQueue::REFRESH消息,所以INVALIDATE可能包含了REFRESH,比REFRESH多执行了handleMessageTransaction,handleMessageInvalidate,mRepaintEverything这几个函数,这几个函数的返回值,也决定了会不会去触发signalRefresh()的调用。
所以先看这几个函数都做了什么事情,然后在分析handleMessageRefresh()做了什么事情。
1),handleMessageTransaction(),调用了handleTransaction(transactionFlags);真正处理事务的地方是handleTransactionLocked(transactionFlags);
void SurfaceFlinger::handleTransaction(uint32_t transactionFlags){ Mutex::Autolock _l(mStateLock); handleTransactionLocked(transactionFlags); //这个值会在build the h/w work list时用到。 mHwWorkListDirty = true; }
在调用handleTransactionLocked前,获取了mStateLock,保证在transaction提交之前,mCurrentState的不会被改变。
void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags){ // mCurrentState记录了系统中layers的状态,这个变量表示当前的状态,还有一个变量mDrawingState表示上一次drawing时的状态。其中的 layersSortedByZ成员变量保存的是按顺序排列的所有的layers。 const LayerVector& currentLayers(mCurrentState.); const size_t count = currentLayers.size(); if (transactionFlags & eTraversalNeeded) { //step1,遍历所有的layers,看其是否需要 doTransaction,这个判断的依据是 getTransactionFlags返回值,只要一个layers的位置、大小、可见度、Matrix等属性发生了变化,这个函数返回值都是true。 for (size_t i=0 ; i<count ; i++) { const sp<Layer>& layer(currentLayers[i]); uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded); if (!trFlags) continue; const uint32_t flags = layer→doTransaction(0); //当可见区域发生变化时,用 mVisibleRegionsDirty备注下。 if (flags & Layer::eVisibleRegion){ mVisibleRegionsDirty = true; } } } if (transactionFlags & eDisplayTransactionNeeded) { const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays); const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays); //判断displays是否有增加、移除,如果curr 、draw 这个两个向量是相等的,displays就没有变化。否则,如果在draw中有,在curr中没有,就要找出被移除的displays;如果在curr中有,在draw中没有,就要找到添加的displays。 if (!curr.isIdenticalTo(draw)) { const ssize_t j = curr.indexOfKey(draw.keyAt(i)); if (draw.indexOfKey(curr.keyAt(i)) < 0) {} } } //新增layer,当前的layer数量增加了,重新计算可见区域。 const LayerVector& layers(mDrawingState.layersSortedByZ); if (currentLayers.size() > layers.size()) { mVisibleRegionsDirty = true; } //layer被移除了,原来被其遮挡的区域可能需要重新显示,所以需要重新计算可见区域。 if (mLayersRemoved) { mVisibleRegionsDirty = true; const Layer::State& s(layer->getDrawingState()); Region visibleReg = s.active.transform.transform( Region(Rect(s.active.w, s.active.h))); invalidateLayerStack(s.layerStack, visibleReg); } //提交事务,一方面调用被移除layer的回调函数onRemoved(),另一方面mDrawingState = mCurrentState,这样他们的状态就又一样了,最后通过mTransactionCV.broadcast()唤醒在等待Transaction结束的线程。 commitTransaction(); }
每个layer的doTransaction()都做了什么事情呢?
uint32_t Layer::doTransaction(uint32_t flags) @Layer.cpp{ //layer中也有两个变量mCurrentState,mDrawingState跟surfaceflinger中变量名字一样,数据结构完全不同,表示的意义相同,一个是当前的状态,一个是上一次drawing的状态。 Layer::State c = getCurrentState(); const Layer::State& s(getDrawingState()); //如果尺寸有变化,需要告诉客户端申请一个新的buffer,通过 setDefaultBufferSize记录这个新的尺寸,当客户端申请一个buffer时,就会使用这个新的尺寸。 const bool sizeChanged = (c.requested.w != s.requested.w) || (c.requested.h != s.requested.h); if (sizeChanged) { mSurfaceFlingerConsumer->setDefaultBufferSize( c.requested.w, c.requested.h); } //active中包含w、h、transform属性,如果active不同了,也要重新计算可见区域。 if (s.active != c.active) { flags |= Layer::eVisibleRegion; } //sequence的值在每一个属性(position,size,alpha,flags,crop等)变化时都会自增, if (c.sequence != s.sequence) { flags |= eVisibleRegion; this->contentDirty = true; } //提交transaction,就是把mCurrentState赋值给mDrawingState,让两个状态又保持一样。 commitTransaction(c); return flags; }
2),handleMessageInvalidate,界面无效了需要重绘。
bool SurfaceFlinger::handleMessageInvalidate() @SurfaceFlinger_hwc1.cpp{ return handlePageFlip(); }
直接调用了handlePageFlip(),
bool SurfaceFlinger::handlePageFlip(){ const LayerVector& layers(mDrawingState.layersSortedByZ); //layer跟图层缓冲区buffer有关系的,layer间接继承了FrameAvailableListener(通过SurfaceFlingerConsumer的内部类ContentsChangedListener继承的),监听onFrameAvailable这个回调,当bufferqueue中一个bufferslot被应用进程填充好之后会被queued,这时会通知这个Listener,并增加mQueuedFrames的计数,判断是否有QueuedFrame的函数 hasQueuedFrame()就是根据这个mQueuedFrames是否大于0; Vector<Layer*> layersWithQueuedFrames; for (size_t i = 0, count = layers.size(); i<count ; i++) { const sp<Layer>& layer(layers[i]); if (layer->hasQueuedFrame()) { frameQueued = true; layersWithQueuedFrames.push_back(layer.get()); } } //循环处理有queued frame的layer,通过latchBuffer锁住这个layer要处理的缓冲区。 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) { Layer* layer = layersWithQueuedFrames[i]; const Region dirty(layer->latchBuffer(visibleRegions)); invalidateLayerStack(s.layerStack, dirty); } mVisibleRegionsDirty |= visibleRegions; //如果需要在将来的某个时间去处理一个在这次的vsync周期中不应该显示的queued frame,就需要发出一个invalidate信号,也就是请求下一个vsync,这是 signalLayerUpdate()做的事情。 if (frameQueued && layersWithQueuedFrames.empty()) { signalLayerUpdate(); } }
看下latchBuffer如何处理bufferQueue的关系的。
Layer.cpp Region Layer::latchBuffer(bool& recomputeVisibleRegions)@Layer.cpp{ // mQueuedFrames大于0,说明有需要处理的queued frame。 if (mQueuedFrames > 0 || mAutoRefresh) { sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; //定义了一个Reject数据结构, struct Reject : public SurfaceFlingerConsumer::BufferRejecter { // reject会被 mSurfaceFlingerConsumer调用,判断这个缓冲区 是否符合surfaceflinger的要求。 virtual bool reject(const sp<GraphicBuffer>& buf,const BufferItem& item) { uint32_t bufWidth = buf->getWidth(); uint32_t bufHeight = buf->getHeight(); if (item.mTransform & Transform::ROT_90) { swap(bufWidth, bufHeight); } if (isFixedSize ||(bufWidth == front.requested.w && bufHeight == front.requested.h)){} } }; Reject r(mDrawingState, getCurrentState(), recomputeVisibleRegions, getProducerStickyTransform() != 0, mName.string(), mOverrideScalingMode, mFreezePositionUpdates); //Reject类型的对象r作为参数传给了updateTexImage,surfaceflinger如果需要对某个buffer进行操作,要先accquire它,这个操作是在 updateTexImage中调用的, status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r, mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer, mLastFrameNumberReceived); // 如果updateResult 是成功的,就update the active buffer,更新 mCurrentCrop, mCurrentTransform, mCurrentScalingMode。 mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer(); Rect crop(mSurfaceFlingerConsumer→getCurrentCrop()); const uint32_t transform(mSurfaceFlingerConsumer→getCurrentTransform()); const uint32_t scalingMode(mSurfaceFlingerConsumer→getCurrentScalingMode()); mCurrentCrop = crop; mCurrentTransform = transform; mCurrentScalingMode = scalingMode; } }
SurfaceFlingerConsumer.cpp status_t SurfaceFlingerConsumer::updateTexImage(BufferRejecter* rejecter, const DispSync& dispSync, bool* autoRefresh, bool* queuedBuffer, uint64_t maxFrameNumber)@SurfaceFlingerConsumer.cpp{ //accquire下一个要处理的缓冲区,accquirebuffer的实现在BufferQueueConsumer.cpp中的acquireBuffer()函数中,源码的注释:In asynchronous mode the list is guaranteed to be one buffer deep,while in synchronous mode we use the oldest buffer.异步、同步模式下不同,不太理解,获取的buffer就是队列的第一个mCore->mQueue.begin()。获取这个buffer存在了 item(BufferItem)中,item中的变量mSlot是这个buffer在bufferSlots中的序号。 BufferItem item; err = acquireBufferLocked(&item, computeExpectedPresent(dispSync), maxFrameNumber); //调用 BufferRejecter的reject方法,判断这个buffer是否有效,如果返回值是true表明这个buffer是无效的,就要释放掉这个buffer, int slot = item.mSlot; if (rejecter && rejecter->reject(mSlots[slot].mGraphicBuffer, item)) { releaseBufferLocked(slot, mSlots[slot].mGraphicBuffer, EGL_NO_SYNC_KHR); return BUFFER_REJECTED; } //从buffer得到mEglImage,然后就可以释放掉这个buffer了。然后把转成ANativeWindowBuffer绑定到GLTexture。 err = updateAndReleaseLocked(item); err = bindTextureImageLocked(); }
3)前面两个函数是收到MessageQueue::INVALIDATE消息后的操作。接下来看下收到MessageQueue::REFRESH消息后操作,即handleMessageRefresh()中方法。
void SurfaceFlinger::handleMessageRefresh() @SurfaceFlinger_hwc1.cpp{ preComposition(); rebuildLayerStacks(); setUpHWComposer(); doDebugFlashRegions(); doComposition(); postComposition(refreshStartTime); }
先看preComposition()。
void SurfaceFlinger::preComposition()@SurfaceFlinger_hwc1.cpp{ bool needExtraInvalidate = false; const LayerVector& layers(mDrawingState.layersSortedByZ); const size_t count = layers.size(); //循环调用系统中每一个layer的接口 onPreComposition,以决定是否需要Invalidate, onPreComposition的返回值依赖一个关键的变量mQueuedFrames,只要layer中有被queued的frame,就需要执行Invalidate,也就是 needExtraInvalidate = true。 for (size_t i=0 ; i<count ; i++) { if (layers[i]->onPreComposition()) { needExtraInvalidate = true; } } if (needExtraInvalidate) { signalLayerUpdate(); } }
详细分析下signalLayerUpdate()做了什么,看下它的调用堆栈:
SurfaceFlinger::signalLayerUpdate()@SurfaceFlinger_hwc1.cpp--> mEventQueue.invalidate()@MessageQueue.cpp -->
EventThread::Connection::requestNextVsync()@EventThread.cpp$Connection→
EventThread::requestNextVsync(…)
最终的实现是在EventThread.cpp中。
void EventThread::requestNextVsync( const sp<EventThread::Connection>& connection) @EventThread.cpp{ //这里会执行一次硬件的vsync,条件是距离上次合成的时间间隔大于500ns(ms2ns(500))。 mFlinger.resyncWithRateLimit(); //connection->count 标示了eventthread传送vsync事件的频率,可以通过setVsyncRate(uint32_t count)函数设置,值大于等于1表示持续性发送事件,值为0表示发送一次性事件,值为-1(count ==-1 : one-shot event that fired this round / disabled) if (connection->count < 0) { connection->count = 0; //这里会唤醒eventthread线程。 mCondition.broadcast(); } }
4)rebuildLayerStacks()。rebuild所有可见的区域。
void SurfaceFlinger::rebuildLayerStacks()@SurfaceFlinger_hwc1.cpp { //所有已排好序的layers。 const LayerVector& layers(mDrawingState.layersSortedByZ); //rebuild每个屏幕的可见layer。 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { //计算需要重绘的脏区域和不透明区域,然后重新排序 layersSortedByZ。 Region opaqueRegion; Region dirtyRegion; Vector< sp<Layer> > layersSortedByZ; const sp<DisplayDevice>& hw(mDisplays[dpy]); const Transform& tr(hw→getTransform()); //这是Display的范围。 const Rect bounds(hw→getBounds()); //当前display是turn on的。 if (hw->isDisplayOn()) { //计算属于这个display的每个layer的可见区域,及可见区域中的脏区域。 computeVisibleRegions(hw->getHwcDisplayId(), layers, hw->getLayerStack(), dirtyRegion, opaqueRegion); const size_t count = layers.size(); for (size_t i=0 ; i<count ; i++) { const sp<Layer>& layer(layers[i]); Region drawRegion(tr.transform( layer→visibleNonTransparentRegion)); drawRegion.andSelf(bounds); //脏区域不为空,就是后面需要绘制的区域,添加到 layersSortedByZ。 if (!drawRegion.isEmpty()) { layersSortedByZ.add(layer); } } } //保存计算结果到hw,作用于后面的合成。 hw→setVisibleLayersSortedByZ(layersSortedByZ); hw->undefinedRegion.set(bounds); hw→undefinedRegion.subtractSelf(tr.transform(opaqueRegion)); hw->dirtyRegion.orSelf(dirtyRegion); } }
layer可见区域的计算,
void SurfaceFlinger::computeVisibleRegions(size_t dpy, const LayerVector& currentLayers, uint32_t layerStack, Region& outDirtyRegion, Region& outOpaqueRegion){ //这个layer上面的不透明区域,即上面的被覆盖区域(一个layer的可见区域减去它的完全透明区域)。 Region aboveOpaqueLayers; Region aboveCoveredLayers; Region dirty; //逐个处理当前所有的layer。 size_t i = currentLayers.size(); while (i--) { const sp<Layer>& layer = currentLayers[i]; const Layer::State& s(layer→getDrawingState()); //完全不透明区域。 Region opaqueRegion; //可见区域,就是可见的和不完全透明的区域,本质上就是layer的整个范围减去不透明区域,半透明区域也认为是可见区域。 Region visibleRegion; //被覆盖区域,被它上面的可见区域盖住的部分,它上面的可见区域包括半透明区域。 Region coveredRegion; //透明区域,就是完全透明的区域,这也说明当一个layer没有可见的不透明区域时,就可以把它从layer列表中删除了。 Region transparentRegion; if (CC_LIKELY(layer->isVisible())) { const bool translucent = !layer->isOpaque(s); Rect bounds(s.active.transform.transform(layer->computeBounds())); visibleRegion.set(bounds); //移除可见区域中的透明区域。 if (translucent) { const Transform tr(s.active.transform); transparentRegion = tr.transform(s.activeTransparentRegion); } //计算不透明区域,实际不透明区域就是它的可见区域。 const int32_t layerOrientation = s.active.transform.getOrientation(); if (s.alpha==255 && !translucent && ((layerOrientation & Transform::ROT_INVALID) == false)) opaqueRegion = visibleRegion; } //从可见区域中剪去被覆盖的区域。 coveredRegion = aboveCoveredLayers.intersect(visibleRegion); //为下一个layer计算被覆盖区域。 aboveCoveredLayers.orSelf(visibleRegion); //从可见区域中剪去被上面的layer覆盖的不透明区域。 visibleRegion.subtractSelf(aboveOpaqueLayers); //计算这个layer的脏区域。 if (layer->contentDirty) { //这里需要重绘所有区域,脏区域及时刚刚计算出的可见区域,加上老的可见区域。 dirty = visibleRegion; dirty.orSelf(layer->visibleRegion); }else{ //这里是不需要重绘所有区域。 // newExposed这次被暴露出来的区域,现在可见了原来不可见。 const Region newExposed = visibleRegion – coveredRegion; //上一次的可见区域。 const Region oldVisibleRegion = layer→visibleRegion; //上一次被覆盖的区域。 const Region oldCoveredRegion = layer→coveredRegion; //上一次暴露的区域, const Region oldExposed = oldVisibleRegion – oldCoveredRegion; dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed); } dirty.subtractSelf(aboveOpaqueLayers); //累加到全局变量中。 outDirtyRegion.orSelf(dirty); //为下一个layer更新它上面的不透明区域。 aboveOpaqueLayers.orSelf(opaqueRegion); //存储这个写可见区域。 layer->setVisibleRegion(visibleRegion); layer->setCoveredRegion(coveredRegion); layer->setVisibleNonTransparentRegion(visibleRegion.subtract(transparentRegion)); } //最终的不透明区域。 outOpaqueRegion = aboveOpaqueLayers; }
5,setUpHWComposer,前面把合成需要的数据都准备好了,现在就要把需要显示的layer的数据准备好,然后确定有opengles或者HWC进行最终的合成。如果layer对应的surface的图像缓冲区是在帧缓冲区分配的,是直接渲染到屏幕的,如果surface的图形缓冲区在匿名共享内存中分配,是要通过surfaceflinger执行合成操作的。
帧缓冲区对应的是显示设备,目前整个系统只有一个显示屏,所以只有一个帧缓冲区,由surfaceflinger来管理,只有surfaceflinger使用的图像缓冲区才会在帧缓冲区上分配,应用程序使用的图像缓冲区通常是在匿名共享内存上分配,app把这块图像缓冲区填充好UI数据,交给surfaceflinger合成渲染到帧缓冲区,也就送到了显示设备。
void SurfaceFlinger::setUpHWComposer() { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { bool dirty = !mDisplays[dpy]→getDirtyRegion(false).isEmpty(); bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0; bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers; //如果dirty为false,说明没有什么变化,就不需要recompose,如果有变化,但是当前没有可见的layers,而且当前也不是最后一次合成,那么就跳过这次。 //当所有的layers都从这个display移除了,就发出一个black frame,然后什么也不做直到获取到新的layers,当一个显示设备有一个private layer stack,我们不会发出任何black frames直到有一个layer添加到这个layer stack。 bool mustRecompose = dirty && !(empty && wasEmpty); mDisplays[dpy]->beginFrame(mustRecompose); if (mustRecompose) { mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty; } } //这个hwc是surfaceflinger为管理HWComposer硬件模块而设计的一个类,代码路径是frameworks/native/services/surfaceflinger/displayhardware。它会进一步加载模块名是HWC_HARDWARE_MODULE_ID的设备, HWComposer& hwc(getHwComposer()); // mHwWorkListDirty值为true,这个值是在第一步 handleMessageTransaction时设置的。 if (CC_UNLIKELY(mHwWorkListDirty)) { mHwWorkListDirty = false; //每个display,调用createWorkList构建worklist。 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { sp<const DisplayDevice> hw(mDisplays[dpy]); const int32_t id = hw->getHwcDisplayId(); const Vector< sp<Layer> >& currentLayers(hw→getVisibleLayersSortedByZ()); const size_t count = currentLayers.size(); if (hwc.createWorkList(id, count) == NO_ERROR) {} } } //通过setPerFrameData设置每一帧的数据,producer生产的数据是放在GraphicBuffer中的,mActiveBuffer就是保存了生产好的数据的buffer,通过layer.setBuffer(mActiveBuffer)设置到layer中。 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { sp<const DisplayDevice> hw(mDisplays[dpy]); const int32_t id = hw→getHwcDisplayId(); const Vector< sp<Layer> >& currentLayers(hw→getVisibleLayersSortedByZ()); const size_t count = currentLayers.size(); HWComposer::LayerListIterator cur = hwc.begin(id); const HWComposer::LayerListIterator end = hwc.end(id); for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) { const sp<Layer>& layer(currentLayers[i]); layer->setPerFrameData(hw, *cur); } } //这里调用surfaceflinger中的hwc的方法prepare。 status_t err = hwc.prepare(); // prepareFrame方法,设置合成类型,支持的合成类型定义在hwcomposer_defs.h中, //HWC_FRAMEBUFFER = 0,通过surfaceflinger把layer画到framebuffer中。 //HWC_OVERLAY = 1,这个layer将由HWC模块处理。 //HWC_BACKGROUND = 2,这是单一的背景layer,用于设置背景颜色值。 //HWC_FRAMEBUFFER_TARGET = 3,这个layer保存了合成的HWC_FRAMEBUFFER layers的结果, for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { sp<const DisplayDevice> hw(mDisplays[dpy]); hw->prepareFrame(hwc); } }
status_t HWComposer::prepare() @HWComposer_hwc1.cpp{ for (size_t i=0 ; i<mNumDisplays ; i++) { //对disp.list中属性赋值,然后保存到全局变量 mLists,它包括了所有Display的list。 DisplayData& disp(mDisplayData[i]); if (disp.framebufferTarget) { disp.framebufferTarget->compositionType = HWC_FRAMEBUFFER_TARGET; } mLists[i] = disp.list; } //这里的 mHwc对应HWC的HAL模块,代码路径是:hardware/libhardware/modules/hwcomposer/Hwcomposer.cpp。 int err = mHwc->prepare(mHwc, mNumDisplays, mLists); }
6,doComposition,前一步通过prepare把数据传给HWC,接下来就要执行合成操作。
void SurfaceFlinger::doComposition() @SurfaceFlinger_hwc1.cpp{ //是否要重绘所有的内容, const bool repaintEverything = android_atomic_and(0, &mRepaintEverything); //每个display,逐一处理。 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { const sp<DisplayDevice>& hw(mDisplays[dpy]); if (hw->isDisplayOn()) { //将dirty区域转成屏幕的坐标空间。 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything)); //绘制framebuffer。 doDisplayComposition(hw, dirtyRegion); hw->dirtyRegion.clear(); hw->flip(hw->swapRegion); hw->swapRegion.clear(); } //合成完成,先通过DisplayDevice,然后通过mDisplaySurface(FramebufferSurface),进一步调用mHwc(HWComposer_hwc1.cpp)的fbCompositionComplete,最后通知到到mFbDev( hardware/qcom/display/libgralloc/framebuffer.cpp)的fb_compositionComplete。 hw->compositionComplete(); } postFramebuffer(); }
//我们只需要实际的去合成显示,条件有两个:如果正在被hardwarecomposer处理,需要保持它跟虚拟显示状态机同步,或者脏区域不为空。
void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw, const Region& inDirtyRegion)@SurfaceFlinger_hwc1.cpp{ //计算脏区域,虽然前面已经计算好了,这里还要做些调整。 hw->swapRegion.orSelf(dirtyRegion); uint32_t flags = hw->getFlags(); if (flags & DisplayDevice::SWAP_RECTANGLE) { //只需要去绘制脏区域,但是这个区域必须是长方形, dirtyRegion.set(hw->swapRegion.bounds()); }else { if (flags & DisplayDevice::PARTIAL_UPDATES) { //硬件层面的部分区域更新,也要求是矩形。 dirtyRegion.set(hw->swapRegion.bounds()); }else { //需要重绘整个显示区域。 dirtyRegion.set(hw->bounds()); hw->swapRegion = dirtyRegion; } } //合成数据。 doComposeSurfaces(hw, dirtyRegion); //更新交换区域,清楚脏区域。 hw→swapRegion.orSelf(dirtyRegion); //交换前后台buffer。 hw->swapBuffers(getHwComposer()); }
bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)@SurfaceFlinger_hwc1.cpp{ RenderEngine& engine(getRenderEngine()); const int32_t id = hw->getHwcDisplayId(); HWComposer& hwc(getHwComposer()); HWComposer::LayerListIterator cur = hwc.begin(id); const HWComposer::LayerListIterator end = hwc.end(id); //是否需要opengl es合成。 bool hasGlesComposition = hwc.hasGlesComposition(id); if (hasGlesComposition) { //设置当前环境,设置当前的display。 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) { eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); } //是否也有需要HWC合成的layer。 const bool hasHwcComposition = hwc.hasHwcComposition(id) || isS3DLayerPresent(hw); if (hasHwcComposition) { //将窗口清除为(0,0,0)的颜色。 engine.clearWithColor(0, 0, 0, 0); }else { //计算要clear的区域,但是仅限定在dirty区域。 const Region bounds(hw->getBounds()); const Region letterbox(bounds.subtract(hw->getScissor())); Region region(hw→undefinedRegion.merge(letterbox)); region.andSelf(dirty); drawWormHoleIfRequired(cur, end, hw, region); } } //准备渲染数据到framebuffer中, const Vector< sp<Layer> >& layers(hw→getVisibleLayersSortedByZ()); const size_t count = layers.size(); const size_t count = layers.size(); if (cur != end) { //使用HWC合成,可见layer中可能既有需要hwc处理的,也有需要opengles处理的。 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) { const sp<Layer>& layer(layers[i]); const Region clip(dirty.intersect(tr.transform(layer->visibleRegion))); if (!clip.isEmpty()) { switch (cur->getCompositionType()) { case HWC_OVERLAY: { layer->clearWithOpenGL(hw, clip); break; } //由opengl es处理的layer, case HWC_FRAMEBUFFER: { layer->draw(hw, clip); break; } } } } }else{ //不使用HWC处理,核心实现都是 layer->draw。 const sp<Layer>& layer(layers[i]); const Region clip(dirty.intersect(tr.transform(layer→visibleRegion))); layer->draw(hw, clip); } }
layer->draw直接调用了onDraw。
void Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip, bool useIdentityTransform) const@Layer.cpp{ if (CC_UNLIKELY(mActiveBuffer == 0)) { //如果texture还没被创建,这个layer还没被绘制过,这是可能发生的,因为windowmanager不知道client什么时候执行第一次绘制。 //如果下面什么也没有,就把屏幕刷成黑色,否则跳过这个update。 Region under; const SurfaceFlinger::LayerVector& drawingLayers( mFlinger→mDrawingState.layersSortedByZ); const size_t count = drawingLayers.size(); for (size_t i=0 ; i<count ; ++i) { const sp<Layer>& layer(drawingLayers[i]); //找出这个layer下的可见区域。 if (layer.get() == static_cast<Layer const*>(this)) break; under.orSelf( hw->getTransform().transform(layer->visibleRegion) ); } //将可见区域外的区域,刷成黑色。 Region holes(clip.subtract(under)); clearWithOpenGL(hw, holes, 0, 0, 0, 1); } //绑定当前缓冲区到opengl纹理,然后等待绘制。 status_t err = mSurfaceFlingerConsumer→bindTextureImage(); //接下来就是调用opengl 的api,做最后的处理。 RenderEngine& engine(mFlinger->getRenderEngine()); drawWithOpenGL(hw, clip, useIdentityTransform); }
//对layer的处理完成后,回到doDisplayComposition最后一步,缓冲区交换。
void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw, const Region& inDirtyRegion)@SurfaceFlinger_hwc1.cpp{ hw->swapBuffers(getHwComposer()); }
//调用eglSwapBuffers交换前后台数据。
void DisplayDevice::swapBuffers(HWComposer& hwc) const @DisplayDevice.cpp{ if (hwc.initCheck() != NO_ERROR || (hwc.hasGlesComposition(mHwcDisplayId) && (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) { EGLBoolean success = eglSwapBuffers(mDisplay, mSurface); } }
//最后通过postFramebuffer送显。
void SurfaceFlinger::doComposition() @SurfaceFlinger_hwc1.cpp{ postFramebuffer(); }
//调用postComposition,来确定启动还是关闭硬件的vsync。
void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)@SurfaceFlinger_hwc1.cpp{ const HWComposer& hwc = getHwComposer(); sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY); if (presentFence->isValid()) { if (mPrimaryDispSync.addPresentFence(presentFence)) { enableHardwareVsync(); } else { disableHardwareVsync(false); } } }
一个layer的合成类型是在prepare时确定的。
status_t HWComposer::prepare() @HWComposer_hwc1.cpp{ disp.framebufferTarget->compositionType = HWC_FRAMEBUFFER_TARGET; //这里调用了HWC的hal模块的实现hardware/qcom/display/libhwcomposer。 int err = mHwc->prepare(mHwc, mNumDisplays, mLists); disp.hasFbComp = true; disp.hasOvComp = true; }
在不支持硬件合成的情况下,调用layer.draw函数逐层合成图像,然后通过eglswapbuffers将图像送到显示设备。