android6.0 显示系统(六) 图像的输出过程

上传人:第*** 文档编号:31311394 上传时间:2018-02-06 格式:DOC 页数:28 大小:243KB
返回 下载 相关 举报
android6.0 显示系统(六) 图像的输出过程_第1页
第1页 / 共28页
android6.0 显示系统(六) 图像的输出过程_第2页
第2页 / 共28页
android6.0 显示系统(六) 图像的输出过程_第3页
第3页 / 共28页
android6.0 显示系统(六) 图像的输出过程_第4页
第4页 / 共28页
android6.0 显示系统(六) 图像的输出过程_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号