《android6.0 显示系统(六) 图像的输出过程》由会员分享,可在线阅读,更多相关《android6.0 显示系统(六) 图像的输出过程(28页珍藏版)》请在金锄头文库上搜索。
1、Android6.0 显示系统(六) 图像的输出过程主要就是分析这个函数,我们先看看它的代码:cpp view plain copy 在 CODE 上查看代码片派生到我的代码片void SurfaceFlinger:handleMessageRefresh() ATRACE_CALL(); static nsecs_t previousExpectedPresent = 0; nsecs_t expectedPresent = mPrimaryDispSputeNextRefresh(0); static bool previousFrameMissed = false; bool frame
2、Missed = (expectedPresent = previousExpectedPresent); if (frameMissed != previousFrameMissed) ATRACE_INT(FrameMissed, static_cast(frameMissed); previousFrameMissed = frameMissed; if (CC_UNLIKELY(mDropMissedFrames & frameMissed) / Latch buffers, but dont send anything to HWC, then signal another / wa
3、keup for the next vsync preComposition(); repaintEverything(); else preComposition(); rebuildLayerStacks(); setUpHWComposer(); doDebugFlashRegions(); doComposition(); postComposition(); previousExpectedPresent = mPrimaryDispSputeNextRefresh(0); 我们主要看下下面几个函数。cpp view plain copy 在 CODE 上查看代码片派生到我的代码片p
4、reComposition(); rebuildLayerStacks(); setUpHWComposer(); doDebugFlashRegions(); doComposition(); postComposition(); 一、preComposition 函数我们先来看第一个函数 preCompositioncpp view plain copy 在 CODE 上查看代码片派生到我的代码片void SurfaceFlinger:preComposition() bool needExtraInvalidate = false; const LayerVector const siz
5、e_t count = layers.size(); for (size_t i=0 ; ionPreComposition() needExtraInvalidate = true; if (needExtraInvalidate) signalLayerUpdate(); 上面函数先是调用了 mDrawingState 的 layersSortedByZ 来得到上次绘图的 Layer 层列表。并不是所有的 Layer 都会参与屏幕图像的绘制,因此 SurfaceFlinger 用 state 对象来记录参与绘制的 Layer 对象。记得在之前的博客,我们分析过 createLayer 函数
6、来创建 Layer,创建之后会调用addClientLayer 函数。cpp view plain copy 在 CODE 上查看代码片派生到我的代码片status_t SurfaceFlinger:createLayer( const String8& name, const sp& client, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, sp* handle, sp* gbp) /ALOGD(createLayer for (%d x %d), name=%s, w, h, name.string(); if
7、(int32_t(w|h) layer; switch (flags & ISurfaceComposerClient:eFXSurfaceMask) case ISurfaceComposerClient:eFXSurfaceNormal: result = createNormalLayer(client, name, w, h, flags, format, handle, gbp, case ISurfaceComposerClient:eFXSurfaceDim: result = createDimLayer(client, name, w, h, flags, handle, g
8、bp, break; default: result = BAD_VALUE; break; if (result != NO_ERROR) return result; result = addClientLayer(client, *handle, *gbp, layer); if (result != NO_ERROR) return result; setTransactionFlags(eTransactionNeeded); return result; 我们来看下 addClientLayer 函数,这里会把 Layer 对象放在 mCurrentState 的layersSor
9、tedByZ 对象中。而 mDrawingState 和 mCurrentState 什么关系呢?在后面我们会介绍,mDrawingState 代表上一次绘图时的状态,处理完之后会把 mCurrentState 赋给mDrawingState。cpp view plain copy 在 CODE 上查看代码片派生到我的代码片status_t SurfaceFlinger:addClientLayer(const sp& client, const sp& handle, const sp& gbc, const sp& lbc) / add this layer to the current
10、state list Mutex:Autolock _l(mStateLock); if (mCurrentState.layersSortedByZ.size() = MAX_LAYERS) return NO_MEMORY; mCurrentState.layersSortedByZ.add(lbc); mGraphicBufferProducerList.add(IInterface:asBinder(gbc); / attach this layer to the client client-attachLayer(handle, lbc); return NO_ERROR; 回到 p
11、reComposition 函数,遍历所有的 Layer 对象,调用其 onPreComposition 函数来检测Layer 层中的图像是否有变化。cpp view plain copy 在 CODE 上查看代码片派生到我的代码片void SurfaceFlinger:preComposition() bool needExtraInvalidate = false; const LayerVector const size_t count = layers.size(); for (size_t i=0 ; ionPreComposition() needExtraInvalidate =
12、 true; if (needExtraInvalidate) signalLayerUpdate(); 1.1 每个 Layer 的 onFrameAvailable 函数onPreComposition 函数来根据 mQueuedFrames 来判断图像是否发生了变化,或者是mSidebandStreamChanged。cpp view plain copy 在 CODE 上查看代码片派生到我的代码片bool Layer:onPreComposition() mRefreshPending = false; return mQueuedFrames 0 | mSidebandStreamC
13、hanged; 当 Layer 所对应的 Surface 更新图像后,它所对应的 Layer 对象的 onFrameAvailable 函数会被调用来通知这种变化。我们看 Layer 的 onFirstRef 函数,先调用 BufferQueue:createBufferQueue 来获取一个 Buffer的消费者和生产者。然后新建了一个 MonitoredProducer 和一个 SurfaceFlingerConsumercpp view plain copy 在 CODE 上查看代码片派生到我的代码片void Layer:onFirstRef() / Creates a custom B
14、ufferQueue for SurfaceFlingerConsumer to use sp producer; sp consumer; BufferQueue:createBufferQueue( mProducer = new MonitoredProducer(producer, mFlinger); mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName); mSurfaceFlingerConsumer-setConsumerUsageBits(getEffectiveUsage(0)
15、; mSurfaceFlingerConsumer-setContentsChangedListener(this); mSurfaceFlingerConsumer-setName(mName); 我们再来看 SurfaceFlingerConsumer 的 setContentsChangedListener 函数cpp view plain copy 在 CODE 上查看代码片派生到我的代码片void SurfaceFlingerConsumer:setContentsChangedListener( const wp& listener) setFrameAvailableListener(listener); Mutex:Autolock lock(mMutex); mContentsChangedListener = listener; 上面函数是调用了基类 ConsumerBase 的 setFrameAvailableListener 函数,将 listener 赋给了mFrameAvailableListener。cpp view plain