您当前的位置: 首页 > 
  • 3浏览

    0关注

    417博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

07.显示系统:第004课_SurfaceFlinger内部机制:第007节_APP提交(unlockAndPost)Buffer的过程_框架

江南才尽,年少无知! 发布时间:2019-03-29 18:11:46 ,浏览量:3

通过前面的小节我们知道,一个应用程序需要显示界面,就要通过SurfaceFlinger服务。我们简单的回顾一下。

在这里插入图片描述 如上图,APP显示界面,肯定要是使用到SurfaceFlinger服务,每一个APP在SurfaceFlinger中都有一个与之对应的client。他们之间通过binder进行通信。

一个APP可以创建一个或者多个Surface(界面),Surface与SurfaceFlinger服务中的Layer对应,之前提到过,Layer中存在生产者,与消费者。生产者肯定是APP,所以在APP的每个Surface都存在一个生产者代理,其指向Layer中的生产者。

SurfaceFlinger中的生产者与消费者都存在mcore与mslots的引用。其他们的mcore指向都指向BufferQueueCore,mslots引用的是一个BufferSlot[]数组。

应用程序通过client->createSurface()获得surfaceControl之后,会使用

sp surface = surfaceControl->getSurface();

获得一个Surface,

应用程序已开始没有存放显示数据的地方,所以他需要向SurfaceFlinger服务申请缓存,一个surface可能存在一个或者多个buf,但是最开始的是时候他是没有buf的,他需要去申请。其申请是通过surface->lock(&outBuffer, NULL)函数,进而生产者代理被调用,发送dequeueBuffer请求给SurfaceFlinger。

SurfaceFlinger接收到请求之后,1.向ashmem申请Buffer,得到一个文件句柄,并且使用mmap2.通过binder返回文件句柄fd给APP。3.APP得到文件句柄之后,会使用mmap获得vaddr(虚拟地址),会填入一个到APP的mSlots。同样,在SurfaceFlinger端也会填入某个mSlots。

SurfaceFlinger与APP都使用了mmap,即对于同一个buffer他们都可以进行访问。在mmap之后,我们就能把需要显示的数据通过android_memset() 填充到buffer(vaddr)之中,然后通过surface->unlockAndPost()提交数据。

该小节我们就来分析unlockAndPost()的过程,先看框图如下: 在这里插入图片描述 在Layer中生产者为(Layer.cpp文件):

mProducer = new MonitoredProducer(producer, mFlinger);

其中MonitoredProducer包含有BufferQueueProduce对象

消费者为:

mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer,mTextureName,this);

SurfaceFlingerConsumer包含有BufferQueueConsumer对象

APP是真正的生产者,SurfaceFlinger是消费者,应用程序产生的显示数据最终肯定是提交给SurfaceFlinger进程。

应用程序中的surface->lock()导致SurfaceFlinger中生产者的dequeueBuffer函数被调用。

应用程序中的surface->unlockAndPost()盘导致SurfaceFlinger中生产者的queueBuffer函数被调用。queueBuffer为入队列的意思,那么肯定还有有一个通知,先通知Layer中的消费者,然后通知Layer,Layer通知SurfaceFlinger,

小小节我们将详细分析其通知传递过程。

关注
打赏
1592542134
查看更多评论
立即登录/注册

微信扫码登录

0.0361s