07.显示系统:第004课_SurfaceFlinger内部机制:第001节_APP与SurfaceFlinger的数据结构

在上一节中,我们编写了一个最简单的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<SurfaceComposerClient> client = new SurfaceComposerClient();
	sp<SurfaceControl> surfaceControl = client>createSurface(String8("resize"),160, 240, PIXEL_FORMAT_RGB_565, 0);
	sp<Surface> 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<SurfaceComposerClient> client = new SurfaceComposerClient();

我们进入其SurfaceComposerClient的构造函数:

SurfaceComposerClient::SurfaceComposerClient()
    : mStatus(NO_INIT), mComposer(Composer::getInstance())
{
}

void SurfaceComposerClient::onFirstRef() {
    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
    if (sm != 0) {
        sp<ISurfaceComposerClient> conn = sm->createConnection();
        if (conn != 0) {
            mClient = conn;
            mStatus = NO_ERROR;
        }
    }
}

当创建SurfaceComposerClient之后,在第一次引用时,调用onFirstRef函数,就会执行:

 sp<ISurfaceComposer> sm(ComposerService::getComposerService());
 	ComposerService::getInstance().connectLocked();
 	......

详细的细节,下小节为大家讲解。在其获得服务之后,就会调用SurfaceFlinger中的createConnecyion导致client产生,用这个client便是这个连接。

client派生于BnSurfaceComposerClient。最后通过createSuface会产生Layer,Layer对应着surfacecontrl。前面提到Layer中有一个生产者和一个消费者,

猜你喜欢

转载自blog.csdn.net/weixin_43013761/article/details/88823245
今日推荐