Android60 显示系统六 图像的输出过程.docx
- 文档编号:5799681
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:39
- 大小:75.39KB
Android60 显示系统六 图像的输出过程.docx
《Android60 显示系统六 图像的输出过程.docx》由会员分享,可在线阅读,更多相关《Android60 显示系统六 图像的输出过程.docx(39页珍藏版)》请在冰豆网上搜索。
Android60显示系统六图像的输出过程
Android6.0显示系统(六)图像的输出过程
主要就是分析这个函数,我们先看看它的代码:
[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片
voidSurfaceFlinger:
:
handleMessageRefresh(){
ATRACE_CALL();
staticnsecs_tpreviousExpectedPresent=0;
nsecs_texpectedPresent=mPrimaryDispSputeNextRefresh(0);
staticboolpreviousFrameMissed=false;
boolframeMissed=(expectedPresent==previousExpectedPresent);
if(frameMissed!
=previousFrameMissed){
ATRACE_INT("FrameMissed",static_cast
}
previousFrameMissed=frameMissed;
if(CC_UNLIKELY(mDropMissedFrames&&frameMissed)){
//Latchbuffers,butdon'tsendanythingtoHWC,thensignalanother
//wakeupforthenextvsync
preComposition();
repaintEverything();
}else{
preComposition();
rebuildLayerStacks();
setUpHWComposer();
doDebugFlashRegions();
doComposition();
postComposition();
}
previousExpectedPresent=mPrimaryDispSputeNextRefresh(0);
}
我们主要看下下面几个函数。
[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片
preComposition();
rebuildLayerStacks();
setUpHWComposer();
doDebugFlashRegions();
doComposition();
postComposition();
一、preComposition函数
我们先来看第一个函数preComposition
[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片
voidSurfaceFlinger:
:
preComposition()
{
boolneedExtraInvalidate=false;
constLayerVector&layers(mDrawingState.layersSortedByZ);
constsize_tcount=layers.size();
for(size_ti=0;i if(layers[i]->onPreComposition()){ needExtraInvalidate=true; } } if(needExtraInvalidate){ signalLayerUpdate(); } } 上面函数先是调用了mDrawingState的layersSortedByZ来得到上次绘图的Layer层列表。 并不是所有的Layer都会参与屏幕图像的绘制,因此SurfaceFlinger用state对象来记录参与绘制的Layer对象。 记得在之前的博客,我们分析过createLayer函数来创建Layer,创建之后会调用addClientLayer函数。 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 status_tSurfaceFlinger: : createLayer( constString8&name, constsp uint32_tw,uint32_th,PixelFormatformat,uint32_tflags, sp { //ALOGD("createLayerfor(%dx%d),name=%s",w,h,name.string()); if(int32_t(w|h)<0){ ALOGE("createLayer()failed,worhisnegative(w=%d,h=%d)", int(w),int(h)); returnBAD_VALUE; } status_tresult=NO_ERROR; sp switch(flags&ISurfaceComposerClient: : eFXSurfaceMask){ caseISurfaceComposerClient: : eFXSurfaceNormal: result=createNormalLayer(client, name,w,h,flags,format, handle,gbp,&layer); break; caseISurfaceComposerClient: : eFXSurfaceDim: result=createDimLayer(client, name,w,h,flags, handle,gbp,&layer); break; default: result=BAD_VALUE; break; } if(result! =NO_ERROR){ returnresult; } result=addClientLayer(client,*handle,*gbp,layer); if(result! =NO_ERROR){ returnresult; } setTransactionFlags(eTransactionNeeded); returnresult; } 我们来看下addClientLayer函数,这里会把Layer对象放在mCurrentState的layersSortedByZ对象中。 而mDrawingState和mCurrentState什么关系呢? 在后面我们会介绍,mDrawingState代表上一次绘图时的状态,处理完之后会把mCurrentState赋给mDrawingState。 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 status_tSurfaceFlinger: : addClientLayer(constsp constsp constsp constsp { //addthislayertothecurrentstatelist { Mutex: : Autolock_l(mStateLock); if(mCurrentState.layersSortedByZ.size()>=MAX_LAYERS){ returnNO_MEMORY; } mCurrentState.layersSortedByZ.add(lbc); mGraphicBufferProducerList.add(IInterface: : asBinder(gbc)); } //attachthislayertotheclient client->attachLayer(handle,lbc); returnNO_ERROR; } 回到preComposition函数,遍历所有的Layer对象,调用其onPreComposition函数来检测Layer层中的图像是否有变化。 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidSurfaceFlinger: : preComposition() { boolneedExtraInvalidate=false; constLayerVector&layers(mDrawingState.layersSortedByZ); constsize_tcount=layers.size(); for(size_ti=0;i if(layers[i]->onPreComposition()){ needExtraInvalidate=true; } } if(needExtraInvalidate){ signalLayerUpdate(); } } 1.1每个Layer的onFrameAvailable函数 onPreComposition函数来根据mQueuedFrames来判断图像是否发生了变化,或者是mSidebandStreamChanged。 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 boolLayer: : onPreComposition(){ mRefreshPending=false; returnmQueuedFrames>0||mSidebandStreamChanged; } 当Layer所对应的Surface更新图像后,它所对应的Layer对象的onFrameAvailable函数会被调用来通知这种变化。 我们看Layer的onFirstRef函数,先调用BufferQueue: : createBufferQueue来获取一个Buffer的消费者和生产者。 然后新建了一个MonitoredProducer和一个SurfaceFlingerConsumer [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidLayer: : onFirstRef(){ //CreatesacustomBufferQueueforSurfaceFlingerConsumertouse sp sp BufferQueue: : createBufferQueue(&producer,&consumer); mProducer=newMonitoredProducer(producer,mFlinger); mSurfaceFlingerConsumer=newSurfaceFlingerConsumer(consumer,mTextureName); mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); mSurfaceFlingerConsumer->setContentsChangedListener(this); mSurfaceFlingerConsumer->setName(mName); 我们再来看SurfaceFlingerConsumer的setContentsChangedListener函数 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidSurfaceFlingerConsumer: : setContentsChangedListener( constwp setFrameAvailableListener(listener); Mutex: : Autolocklock(mMutex); mContentsChangedListener=listener; } 上面函数是调用了基类ConsumerBase的setFrameAvailableListener函数,将listener赋给了mFrameAvailableListener。 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidConsumerBase: : setFrameAvailableListener( constwp CB_LOGV("setFrameAvailableListener"); Mutex: : Autolocklock(mMutex); mFrameAvailableListener=listener; } 而最终在其onFrameAvailable函数中调用了listener->onFrameAvailable函数。 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidConsumerBase: : onFrameAvailable(constBufferItem&item){ CB_LOGV("onFrameAvailable"); sp {//scopeforthelock Mutex: : Autolocklock(mMutex); listener=mFrameAvailableListener.promote(); } if(listener! =NULL){ CB_LOGV("actuallycallingonFrameAvailable"); listener->onFrameAvailable(item); } } 因此我们再来看看Layer的onFrameAvailable函数,主要是将mQueuedFrames加1,然后调用了SurfaceFlinger的signalLayerUpdate函数。 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidLayer: : onFrameAvailable(constBufferItem&item){ //Addthisbufferfromourinternalqueuetracker {//Autolockscope Mutex: : Autolocklock(mQueueItemLock); //Resettheframenumbertrackerwhenwereceivethefirstbufferafter //aframenumberreset if(item.mFrameNumber==1){ mLastFrameNumberReceived=0; } //Ensurethatcallbacksarehandledinorder while(item.mFrameNumber! =mLastFrameNumberReceived+1){ status_tresult=mQueueItemCondition.waitRelative(mQueueItemLock, ms2ns(500)); if(result! =NO_ERROR){ ALOGE("[%s]Timedoutwaitingoncallback",mName.string()); } } mQueueItems.push_back(item); android_atomic_inc(&mQueuedFrames); //Wakeupanypendingcallbacks mLastFrameNumberReceived=item.mFrameNumber; mQueueItemCondition.broadcast(); } mFlinger->signalLayerUpdate(); } 同样在SurfaceFlinger的preComposition函数中当有Layer的图像改变了,最后也会调用SurfaceFlinger的signalLayerUpdate函数。 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidSurfaceFlinger: : preComposition() { boolneedExtraInvalidate=false; constLayerVector&layers(mDrawingState.layersSortedByZ); constsize_tcount=layers.size(); for(size_ti=0;i if(layers[i]->onPreComposition()){ needExtraInvalidate=true; } } if(needExtraInvalidate){ signalLayerUpdate(); } } SurfaceFlinger: : signalLayerUpdate是调用了MessageQueue的invalidate函数 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidSurfaceFlinger: : signalLayerUpdate(){ mEventQueue.invalidate(); } 调用了handler的dispatchInvalidate函数, [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidMessageQueue: : invalidate(){ #ifINVALIDATE_ON_VSYNC mEvents->requestNextVsync(); #else mHandler->dispatchInvalidate(); #endif } Handler: : dispatchInvalidate只是发送了一个消息 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidMessageQueue: : Handler: : dispatchInvalidate(){ if((android_atomic_or(eventMaskInvalidate,&mEventMask)&eventMaskInvalidate)==0){ mQueue.mLooper->sendMessage(this,Message(MessageQueue: : INVALIDATE)); } } 最后处理还是调用了SurfaceFlinger的onMessageReceived函数。 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 caseINVALIDATE: android_atomic_and(~eventMaskInvalidate,&mEventMask); mQueue.mFlinger->onMessageReceived(message.what); break; 我们再来看看SurfaceFlinger的onMessageReceived函数对NVALIDATE的处理 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidSurfaceFlinger: : onMessageReceived(int32_twhat){ ATRACE_CALL(); switch(what){ ...... caseMessageQueue: : INVALIDATE: { boolrefreshNeeded=handleMessageTransaction(); refreshNeeded|=handleMessageInvalidate(); refreshNeeded|=mRepaintEverything; if(refreshNeeded){ //Signalarefreshifatransactionmodifiedthewindowstate, //anewbufferwaslatched,orifHWChasrequestedafull //repaint signalRefresh(); } break; 我们先来看下handleMessageTransaction和handleMessageInvalidate函数。 [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 boolSurfaceFlinger: : handleMessageTransaction(){ uint32_ttransactionFlags=peekTransactionFlags(eTransactionMask); if(transactionFlags){ handleTransaction(transactionFlags); returntrue; } returnfalse; } boolSurfaceFlinger: : handleMessageInvalidate(){ ATRACE_CALL(); returnhandlePageFlip(); } handleMessageInvalidate函数中调用了handle
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android60 显示系统六 图像的输出过程 显示 系统 图像 输出 过程