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

通过前面的小节我们知道,一个应用程序需要显示界面,就要通过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> 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,

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

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南才尽,年少无知!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值