09 SurfaceFinger layer创建过程

目录

1 app创建surface

2 SurfaceFlinger端创建layer过程

3 构建SurfaceControl

上一篇了解了SurfaceFlinger的初始化过程《surfaceflinger初始化》。初始化了一些比较重要的成员。

本篇看下app创建Surface时SurfaceFlinger主要做哪些工作。

1 app创建surface

  • app使用w,h,format等参数,调用SurfaceComposerClient::createSurface
  • createSurface调用SurfaceComposerClient::createSurfaceChecked;createSurfaceChecked调用mClient->createSurface;mClient是surfaceflinger client的代理;mClient的初始化还没介绍,后面单独写一篇介绍。
  • mClient->createSurface会调用到android12\frameworks\native\services\surfaceflinger\Client.cpp 中Client::createSurface
  • Client::createSurface调用mFlinger->createLayer

详细代码如下:

surfaceComposerClient->createSurface(String8("SurfaceTestDemo"), resolution.getWidth(),
                  resolution.getHeight(), PIXEL_FORMAT_RGBA_8888,
                  ISurfaceComposerClient::eFXSurfaceBufferState,
                  /*parent*/ nullptr);
                  
sp<SurfaceControl> SurfaceComposerClient::createSurface(const String8& name, uint32_t w, uint32_t h,
                                      PixelFormat format, uint32_t flags,
                                      const sp<IBinder>& parentHandle,
                                      LayerMetadata metadata,
                                      uint32_t* outTransformHint) {
    sp<SurfaceControl> s;
    createSurfaceChecked(name, w, h, format, &s, flags, parentHandle, std::move(metadata),
                         outTransformHint);
    return s;
}

status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32_t w, uint32_t h,
                                PixelFormat format,
                                sp<SurfaceControl>* outSurface, uint32_t flags,
                                const sp<IBinder>& parentHandle,
                                LayerMetadata metadata,
                                uint32_t* outTransformHint) {
    status_t err = mStatus;

    if (mStatus == NO_ERROR) {
        sp<IBinder> handle;
        sp<IGraphicBufferProducer> gbp;
        err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),
                                     &handle, &gbp, &id, &transformHint);
            *outSurface =
                    new SurfaceControl(this, handle, gbp, id, w, h, format, transformHint, flags);
    }
    return err;
}

 mClient的初始化在《深入探究waitForService》中有详细讲解,这里简单画个流程

2 SurfaceFlinger端创建layer过程

  • 根据app的flags确定创建layer类型createBufferStateLayer;createEffectLayer还是createContainerLayer;目前尚不清楚不同layer之间的区别,以createBufferStateLayer为例
  • 将传入参数放入LayerCreationArgs args,调用getFactory().createBufferStateLayer(args)创建BufferStateLayer;获取layer handle,并返回
  • 调用SurfaceFlinger::addClientLayer,创建LayerCreatedState,放入mCreatedLayers[handle->localBinder()];使用handle等参数创建composerState,并传入SurfaceFlinger::setTransactionState
  • 创建TransactionState state,并将其放入mTransactionQueue.emplace(state)

不太想贴太多代码了,主要流程图如下,可以对照源码看下详细流程

3 构建SurfaceControl

status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32_t w, uint32_t h,
                                                     PixelFormat format,
                                                     sp<SurfaceControl>* outSurface, uint32_t flags,
                                                     const sp<IBinder>& parentHandle,
                                                     LayerMetadata metadata,
                                                     uint32_t* outTransformHint) {
    sp<SurfaceControl> sur;
    status_t err = mStatus;

    if (mStatus == NO_ERROR) {
        sp<IBinder> handle;
        sp<IGraphicBufferProducer> gbp;

        err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),
                                     &handle, &gbp, &id, &transformHint);

        if (outTransformHint) {
            *outTransformHint = transformHint;
        }

        if (err == NO_ERROR) {
            *outSurface =
                    new SurfaceControl(this, handle, gbp, id, w, h, format, transformHint, flags);
        }
    }
    return err;
}

可以看到调用createSurface获取到SurfaceFlinger中创建的layer handle,gbp等。

使用这些参数构建SurfaceControl,这样拿到SurfaceControl就拿到了SurfaceFlinger创建的layer。

总结:

在梳理这个流程的时候有两点花了比较长的时间:

  • SurfaceComposerClient的mClient就是对应SurfaceFlinger的Client
  • SurfaceFlinger::setTransactionState中比较复杂容易忽略将TransactionState state放入mTransactionQueue的过程,mTransactionQueue在后面创建hwc layer的时候会用到。

创作不易,欢迎评论点赞收藏。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值