Android SurfaceFlinger服务(二) ----- 本地Surface创建

Android显示系统层次分析

  • 应用层,app从WindowManager服务获取图层,渲染图层
  • WindowManager管理层,主要管理APP渲染的图层,调用SurfaceFlinger服务, 创建Surface,并将Surface传递给应用
  • SurfaceFlinger层,对上层负责Surface的创建,对下层管理各个显示设备, 以及将Surface合成合显示到显示设备上
  • 显示驱动层,属于内核层次。SurfaceFlinger最终调用显示驱动显示图像

有了上面的这个整体把握,我们就可以一层一层的去分析整个显示系统源码了。首先,以SurfaceFlinger测试程序resize来看看本地SufaceFlinger的创建和使用。

Surface本地创建

// resize测试程序源码,略有修改,解决编译不通过的问题
int main(void)
{
    // set up the thread-pool
    sp<ProcessState> proc(ProcessState::self());
    ProcessState::self()->startThreadPool();

    // create a client to surfaceflinger
    sp<SurfaceComposerClient> client = new SurfaceComposerClient();

    sp<SurfaceControl> surfaceControl = client->createSurface(String8("resize"), 160, 240, PIXEL_FORMAT_RGB_565, 0);

    sp<Surface> surface = surfaceControl->getSurface();

    SurfaceComposerClient::openGlobalTransaction();
    surfaceControl->setLayer(100000);
    SurfaceComposerClient::closeGlobalTransaction();

    ANativeWindow_Buffer outBuffer;
    surface->lock(&outBuffer, NULL);
    ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format);
    android_memset16((uint16_t*)outBuffer.bits, 0xF800, bpr*outBuffer.height);
    surface->unlockAndPost();

    surface->lock(&outBuffer, NULL);
    android_memset16((uint16_t*)outBuffer.bits, 0x07E0, bpr*outBuffer.height);
    surface->unlockAndPost();

    SurfaceComposerClient::openGlobalTransaction();
    surfaceControl->setSize(320, 240);
    SurfaceComposerClient::closeGlobalTransaction();


    IPCThreadState::self()->joinThreadPool();

    return 0;
}
  1. 创建一个SurfaceComposerClient对象
  2. 调用SurfaceComposerClient对象的createSurface方法,得到一个SurfaceControl的引用
  3. 调用SurfaceControl的getSurface方法得到一个Surface引用

创建Surface的代码看上去没几行,但涉及的内容远不止看上去的这些。下面来逐一分析,先看看SurfaceComposerClient这个类:

class SurfaceComposerClient : public RefBase
{   
    friend class Composer;
public:
                SurfaceComposerClient();
    virtual     ~SurfaceComposerClient();

    ......

    // Return the connection of this client
    sp<IBinder> connection() const;
        
    ......

    //! Create a surface
    sp<SurfaceControl> createSurface(
            const String8& name,// name of the surface
            uint32_t w,         // width in pixel
            uint32_t h,         // height in pixel
            PixelFormat format, // pixel-format desired
            uint32_t flags = 0  // usage flags
    );


private:
    virtual void onFirstRef();
    Composer& getComposer();

    mutable     Mutex                       mLock;
                status_t                    mStatus;
                sp<ISurfaceComposerClient>  mClient;
                Composer&                   mComposer;
};

SurfaceComposerClient继承于RefBase,所以他new一个SurfaceComposerClient对象时。其构造方法和onFirstRef方法被调用。

// 构造函数
SurfaceComposerClient::SurfaceComposerClient()
    : mStatus(NO_INIT), mComposer(Composer::getInstance())
{
} 
  • mStatus状态设置为NO_INIT
  • mComposer指向单实例类Composer
void SurfaceComposerClient::onFirstRef() {
    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
    if (sm != 0) {
        sp<ISurfaceComposerClient> conn = sm->createConnection();
        if (conn != 0) {
            mClient = conn;
            mStatus = NO_ERROR;
        }
    }
}
  • 获取ISurfaceComposer代理对象接口。
  • 调用ISurfaceComposer接口方法createConnection得到ISurfaceComposerClient代理对象接口。如果获取成功,将ISurfaceComposerClient代理对象接口赋值给mClient,并将mStatus设置为NO_ERROR

创建ISurfaceComposerClientBinder实体对象过程就要去看看ISurfaceComposer的远程实现。正好ISurfaceComposer的远程实现类就是SurfaceFlinger类。

sp<ISurfaceComposerClient> SurfaceFlinger::createConnection()
{
    sp<ISurfaceComposerClient> bclient;
    sp<Client> client(new Client(this));
    status_t err = client->initCheck();
    if (err == NO_ERROR) {
        bclient = client;
    }  
    return bclient;
}
  • new一个Client类对象,构造函数中传入SurfaceFlinger对象指针。
  • 调用initCheck函数进行初始化,如果初始化成功就返回该对象引用,否则返回空
  • 每次调用createConnection都会创建一个Client类对象,每个对象都是一个远程服务实体,为客户端服务(既mClient方法的实现)。

从SurfaceComposerClient::onFirstRef可以看出,SurfaceComposerClient类里有一个比较重要的成员变量mClient,它指向ISurfaceComposerClient代理对象。
SurfaceComposerClient创建完成了,接下来看看它的createSurface方法。研究下如何创建SurfaceControl对象。

sp<SurfaceControl> SurfaceComposerClient::createSurface(
        const String8& name,
        uint32_t w,
        uint32_t h,
        PixelFormat format,
        uint32_t flags)
{
    sp<SurfaceControl> sur;
    if (mStatus == NO_ERROR) {
        sp<IBinder> handle;
        sp<IGraphicBufferProducer> gbp;
        status_t err = mClient->createSurface(name, w, h, format, flags,                                                                                                                     
                &handle, &gbp);
        ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err));
        if (err == NO_ERROR) {
            sur = new SurfaceControl(this, handle, gbp);
        }
    }  
    return sur;
}
  • 调用mClient(ISurfaceComposerClient)的createSurface方法,然而,这个方法好像并没有返回Surface对象。但是我们得到了另外两个东西,hander和gbp。这些是什么怪物,下篇文章在分析。
  • 通过上面获取的两个怪物创建SurfaceControl对象,构造函数中传入有三个参数。this指针(SurfaceComposerClient对象)、handle、gbp。

ISurfaceComposerClient为Binder接口,createSurface方法最终在远程服务中实现。直接看看这个方法的远程实现

// FILE: frameworks/native/services/surfaceflinger/Client.cpp
status_t Client::createSurface(
        const String8& name,            
        uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
        sp<IBinder>* handle,            
        sp<IGraphicBufferProducer>* gbp)
{
    /*
     * createSurface must be called from the GL thread so that it can
     * have access to the GL context.   
     */

    class MessageCreateLayer : public MessageBase {
        SurfaceFlinger* flinger;
        Client* client;
        sp<IBinder>* handle;
        sp<IGraphicBufferProducer>* gbp;
        status_t result;
        const String8& name;
        uint32_t w, h;                  
        PixelFormat format;
        uint32_t flags;
    public:
        MessageCreateLayer(SurfaceFlinger* flinger,      
                const String8& name, Client* client,     
                uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
                sp<IBinder>* handle,
                sp<IGraphicBufferProducer>* gbp)     
            : flinger(flinger), client(client),        
              handle(handle), gbp(gbp),
              name(name), w(w), h(h), format(format), flags(flags) {                                                                                                                         
        }
        status_t getResult() const { return result; }
        virtual bool handler() {
            result = flinger->createLayer(name, client, w, h, format, flags,                                                                                                                 
                    handle, gbp);
            return true;
        }
    };

    sp<MessageBase> msg = new MessageCreateLayer(mFlinger.get(), 
            name, this, w, h, format, flags, handle, gbp);
    mFlinger->postMessageSync(msg);
    return static_cast<MessageCreateLayer*>( msg.get() )->getResult();                                                                                                                       
}
  • 这个函数啥也没干,只是把工作给转移了。发消息给SurfaceFlinger创建Layer。
  • 消息发送与处理不是关心的重点就不展开了。只要知道最后SurfaceFlinger工作线程去执行Message的handler函数就行了
  • 看看这个消息的handler函数,还是去调用SurfaceFlinger的createLayer函数去创建Layer,真是绕啊。
status_t SurfaceFlinger::createLayer(
        const String8& name,
        const sp<Client>& client,
        uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
        sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp)
{   
    //ALOGD("createLayer for (%d x %d), name=%s", w, h, name.string());
    if (int32_t(w|h) < 0) {
        ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
                int(w), int(h));
        return BAD_VALUE;
    }

    status_t result = NO_ERROR;
    
    sp<Layer> layer;
    
    switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
        case ISurfaceComposerClient::eFXSurfaceNormal:
            result = createNormalLayer(client,
                    name, w, h, flags, format,
                    handle, gbp, &layer);
            break;
        case ISurfaceComposerClient::eFXSurfaceDim:
            result = createDimLayer(client,
                    name, w, h, flags,
                    handle, gbp, &layer);
            break;
        default:
            result = BAD_VALUE;
            break;
    }

    if (result != NO_ERROR) {
        return result;
    }

    result = addClientLayer(client, *handle, *gbp, layer);
    if (result != NO_ERROR) {
        return result;
    }

    setTransactionFlags(eTransactionNeeded);
    return result;
}
  • 根据flags调用不同的函数创建Layer
  • 调用addClientLayer将创建的Layer添加到相关的数据结构中
  • handler gbp将在创建layer时赋值。关于Layer创建下篇文章在分析,一下子写多了容易糊涂。

在回来看看得到handle gbp以后,用它们来构造一个SurfaceControl对象。

SurfaceControl::SurfaceControl(
        const sp<SurfaceComposerClient>& client, 
        const sp<IBinder>& handle,
        const sp<IGraphicBufferProducer>& gbp) 
    : mClient(client), mHandle(handle), mGraphicBufferProducer(gbp)
{
}

  • handle赋值给了成员变量mHandler
  • gbp赋值给了成员变量mGraphicBufferProducer, 图像缓冲区生产者接口

然后调用SurfaceControl的getSurface方法得到Surface,看看该方法

sp<Surface> SurfaceControl::getSurface() const
{
    Mutex::Autolock _l(mLock);
    if (mSurfaceData == 0) {
        // This surface is always consumed by SurfaceFlinger, so the
        // producerControlledByApp value doesn't matter; using false.
        mSurfaceData = new Surface(mGraphicBufferProducer, false);
    }  
    return mSurfaceData;
}
  • 构造函数中主要传入的是mGraphicBufferProducer
Surface::Surface(
        const sp<IGraphicBufferProducer>& bufferProducer,
        bool controlledByApp)
    : mGraphicBufferProducer(bufferProducer),
      mGenerationNumber(0)
{
    // Initialize the ANativeWindow function pointers.
    ANativeWindow::setSwapInterval  = hook_setSwapInterval;
    ANativeWindow::dequeueBuffer    = hook_dequeueBuffer;
    ANativeWindow::cancelBuffer     = hook_cancelBuffer;
    ANativeWindow::queueBuffer      = hook_queueBuffer;
    ANativeWindow::query            = hook_query;
    ANativeWindow::perform          = hook_perform;

    ANativeWindow::dequeueBuffer_DEPRECATED = hook_dequeueBuffer_DEPRECATED;
    ANativeWindow::cancelBuffer_DEPRECATED  = hook_cancelBuffer_DEPRECATED;
    ANativeWindow::lockBuffer_DEPRECATED    = hook_lockBuffer_DEPRECATED;
    ANativeWindow::queueBuffer_DEPRECATED   = hook_queueBuffer_DEPRECATED;
    ......
}
  • Surface在构造函数中最终将gbp赋值给了成员变量mGraphicBufferProducer。
  • 每个Surface对象中都含有一个图像缓冲区生产者接口用于画图。

做个总结:

  1. 客户端首先通过ISurfaceComposer接口创建与SurfaceFlinger的连接,得到ISurfaceComposerClient代理接口。
  2. 调用ISurfaceComposerClient的createSurface,得到handle和gdp
  3. 客户端利用SurfaceComposerClient对象指针、handle、gdp创建SurfaceControl对象。
  4. 最后通过SurfaceControl的getSurface得到surface对象引用
posted @ 2018-03-31 17:51  qzhang1535  阅读(1415)  评论(0编辑  收藏  举报