在上一节中,我们编写了一个最简单的Surface测试程序,在后续,我们会分析这个程序,以其为索引,深入了解SurfaceFlinger的内部机制。
相关结构体介绍该小节主要讲解APP与SurfaceFlinger之间重要的数据结构,我们知道,一个应用程序可以构造多个界面,如下图:
一个APP有两个surface(一般来说,只有一个surface),一个surface中存在多个buffer。这些APP的buffer都需要向SurfaceFlinger进行申请,那么在SurfaceFlinger中肯定存在结构体,用来表示应用程序之中的surface,也有结构体表示surface之中的buf。
在SurfaceFlinger中是使用Client表示APP,有多少个应用程序,就有多好个Client,Client中包括了Layer(用来表示应用层的surfacecontrl)。Layer中包含什么呢?在其中分为(layer.h文件): 生产者:sp mProducer; 消费者:sp mSurfaceFlingerConsumer;
现在我们回顾一下生产者与消费者的关系,生产者把数据放入一个buf,消费者中这个buf取出数据。在mProducer与mSurfaceFlingerConsumer存在同一个mCore(其类型为:BufferQueueCore)。
进入BufferQueueCore.h文件,可以找到:
BufferQueueDefs::SlotsType mSlots;
其中的typedef BufferSlot SlotsType[NUM_BUFFER_SLOTS],可以知道mSlots本质为一个数组,其中NUM_BUFFER_SLOTS = 64,表示我们一个surface中最多可以存在64个buffer。那么当然没一个数组项代表着一个buffer,BufferSlot中的sp mGraphicBuffer表示buffer。
我们注意到,以上涉及的类,都是SurfaceFlinger进程用来表示APP1,APP2等等应用程序的。
测试程序分析现在打开上小节编写的测试程序:
int main()
sp client = new SurfaceComposerClient();
sp surfaceControl = client>createSurface(String8("resize"),160, 240, PIXEL_FORMAT_RGB_565, 0);
sp surface = surfaceControl->getSurface();
每一个应用程序,都与SurfaceFlinger有一个连接,用SurfaceComposerClient表示,我们进入SurfaceComposerClient.h文件可以找到:sp mClient,该处的mClient指向SurfaceFlinger中的Client。
同时每一个Surface都对应一个SurfaceControl,从上面的代码我们可以看到,surface 是通过surfaceControl->getSurface();获得的,我们可以知道surface 是被surfaceControl管理的,
然后调用:
surface->lock(&outBuffer, NULL);
获得buffer,那么我们先查看surface中有那些成员,进入surface.h文件,可以找到:
BufferSlot mSlots[NUM_BUFFER_SLOTS];
NUM_BUFFER_SLOTS = 64
同样每个BufferSlot 中都含有mGraphicBuffer。
这样surface中的成员,就与SurfaceFlinger的成员对应起来了。大家可以参考前面的框图,更加直观的体会。
在图中SurfaceFlinger中的buffer,与APP的Surface中的buf都是指物理上同一块内存。
内存的申请过程,一般流程为: 1.应用程序发送请求给SurfaceFlinger 2.SurfaceFlinger接收到请求只够,使用gralloc模块,从匿名共享内存中分配出一块内存,然后记录在sp mGraphicBuffer中,并且把这个信息返回给应用程序。 3.应用程序接收到返回信息之后,在构造出对应的sp mGraphicBuffer
为了大家更形象的了解,下面是一个思维导图: 左边是应用程序,右边是SurfaceFlinger进程,他们之间是通过binder进行通信,应用程序想获得SurfaceFlinger服务,首先要调用
getService("SurfaceFlinger",&mComposerService)
获得服务,那么我们自己编写的应用程序是怎么获得的呢?找到下面代码:
sp client = new SurfaceComposerClient();
我们进入其SurfaceComposerClient的构造函数:
SurfaceComposerClient::SurfaceComposerClient()
: mStatus(NO_INIT), mComposer(Composer::getInstance())
{
}
void SurfaceComposerClient::onFirstRef() {
sp sm(ComposerService::getComposerService());
if (sm != 0) {
sp conn = sm->createConnection();
if (conn != 0) {
mClient = conn;
mStatus = NO_ERROR;
}
}
}
当创建SurfaceComposerClient之后,在第一次引用时,调用onFirstRef函数,就会执行:
sp sm(ComposerService::getComposerService());
ComposerService::getInstance().connectLocked();
......
详细的细节,下小节为大家讲解。在其获得服务之后,就会调用SurfaceFlinger中的createConnecyion导致client产生,用这个client便是这个连接。
client派生于BnSurfaceComposerClient。最后通过createSuface会产生Layer,Layer对应着surfacecontrl。前面提到Layer中有一个生产者和一个消费者,