surface-----surfaceflinger (createSurface)

下面对Surface与SurfaceControl类之间的关系进行一下分析。

在android_view_Surface.cpp中,可以看到这样一条语句:

SurfaceComposerClient* client =

            (SurfaceComposerClient*)env->GetIntField(session, sso.client);

 

    sp<SurfaceControl> surface(client->createSurface(pid, dpy, w, h, format, flags));

 

从字面意思猜测,由SurfaceComposerClient的一个对象创建了一个Surface交由SurfaceControl进行管理。

从一些参考资料中看到,创建一个Surface的过程如下

(1)       调用libui的接口SurfaceComposerClient::CreateSurface();

(2)       调用ISurfaceFlingerClient::CreateSurface();

(3)       由于继承关系,实际上调用的是SurfaceFlinger中的接口,即BClient::CreateSurface()

(4)       继续调用SurfaceFlinger::createSurface()

我们分析下代码,看看过程是不是这样的。

跟踪到SurfaceComposerClient::createSurface中,看到这样一条语句

sp<ISurface> surface = mClient->createSurface(&data, pid,

                display, w, h, format, flags);

其中mClient是在SurfaceComposerClient中定义的一个sp<ISurfaceFlingerClient>类型的对象(还记得sp对->进行了重载吗?它其实返回了一个ISurfaceFlingerClient *)。由此可以看出,是调用的ISurfaceFlingerClient创建的Surface。而ISurfaceFlingerClient中的CreateSurface函数是一个纯虚函数,C++中,通过父类的指针可以调用子类中的函数,我们分析一下,看看在何处对mSurface进行了赋值操作,以至于产生了真正的调用。在SurfaceComposerClient::_init函数中,我们惊奇的发现,确实有一个对mSurface的赋值操作,但可惜的是,这也是将一个ISurfaceFlingerClient*类型的数赋值给了它。那它到底在什么地方进行了赋值呢?继续跟踪,找出SurfaceComposerClient::_init函数的调用者。在SurfaceComposerClient的构造函数中,有对_init函数的调用。代码如下

 

    sp<ISurfaceComposer> sm(getComposerService());

    if (sm == 0) {

        _init(0, 0);

        return;

    }

 

_init(sm, sm->createConnection());

由此,我们需要继续跟踪ISurfaceComposer中的createConnection函数,跟踪过去,竟然也是纯虚函数,杯具啊!!

 

 

在调用Surface时,调用createSurface()函数,创建各个层之后,分别调用不同层中的getSurface()接口来得到一个ISurface类型的实例,然后在SurfaceComposerClient::createSurface()中得到Surface,并将其返回。

 

3.       SurfaceFlinger和显示硬件的接口

4.       SurfaceFlinger的显示设备,是由DisplayHardware目录中的DisplayHardware.cpp文件来实现的,其中创建了一个DisplayHardware来作为主要的显示界面。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值