通过前面的小节我们知道,一个应用程序需要显示界面,就要通过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,
小小节我们将详细分析其通知传递过程。