Android平台——Surfaceflinger机制

看到有人在 blog上留言,说希望看到Surfaceflinger这一部分的内容,最近没有时间写blog,只能先暂时掐断Binder机制,写这部分的内容。同 样从几个月前的工作笔记中摘录下来。也没有细细去回顾一下,全当交个差。忙过了这段,我一定会回过头来整理的!!!
   首先声明,我们忽略Binder机制的细节。 
    从头开始查找数据的流向,也就是 SurfaceFlinger 类这一层从上层接受数据的过程,先看一组继承关系以便于分析(这个总略图将帮你看清数据流向)
MSN的图片太不清楚了  抑郁!,大家凑和看吧!!

这里 LayerBuffer 的创建是在 SurfaceFlinger 中由 SurfaceFlinger 的友员类 BClient 调用 createSurface 函数 new LayBuffer 对象。

数据流向过程,以 opencore 解码举例: opencore 中调用 ISuface postBuff ,实际 ISurface 的继承类 BpSurface 中的 postBuffer 被调用,通过 Binder 机制向同样是 ISurface 的继承类的 BnSurface 请求服务(通过发送 POST_BUFFER 命令):

    virtual void BpSurface ::postBuffer(ssize_t offset)

    {

……………………………………………….

        remote()->transact(POST_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);

    }

BnSurface 响应相应命令,同样调用 postBuffer 函数:

  case POST_BUFFER: {

          …………………………….

            postBuffer(offset);

          …………………………….

        }

实际将会调用 BnSurface 的继承类 Surface postBuffer 函数 (class Surface : public BnSurface ) Surface LayBaseClient 的嵌入类,而 Surface 类的 postBuffer 函数未实现,这会导致最终调用 Surface 类的继承类 SurfaceBuffer postBuffer 函数 (class SurfaceBuffer : public LayerBaseClient::Surface ):

void LayerBuffer::SurfaceBuffer::postBuffer(ssize_t offset)

{

       ……………………………………………..

        owner->postBuffer(offset);

}

SurfaceBuffer 类是 LayBaseClient 的继承类 LayerBuffer 的嵌入类, SurfaceBuffer postBuffer 最终会调用 LayerBuffer postBuffer 函数 :

void LayerBuffer::postBuffer(ssize_t offset)

{

    …………………………………………….

    sp<Buffer> buffer;

    if (heap != 0) {

        buffer = new Buffer(heap, offset, w, h, hs, vs, f);

        if (buffer->getStatus() != NO_ERROR)

            buffer.clear();

         setBuffer(buffer);               // 这个函数将会置 mBuffer 指针

        invalidate();

    }

}

在此函数中将会创建 Buffer 类用来存储数据, LayerBuffer 类中的 mBuffer 指针会指向这个数据区由 BClient 利用。

   

另一方面,关于 LayerBuffer 类的创建。 Java 层,我们调用 Surface_init 函数之后,会对应于 android_view_Surface.cpp 函数中的 Surface_init 函数,此函数会调用 SurfaceComposerClient 类的 createSurface 函数,

sp<Surface> SurfaceComposerClient::createSurface(

        int pid,

        DisplayID display,

        uint32_t w,

        uint32_t h,

        PixelFormat format,

        uint32_t flags)

{

……………………………………………..

 

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

                display, w, h, format, flags);

        if (surface != 0) {

            if (uint32_t(data.token) < NUM_LAYERS_MAX) {

                result = new Surface(this, surface, data, w, h, format, flags);

            }

        }

         ……………………………………………..

}

红色代码行将会调用 BpSurfaceFlingerClient 类的 CreateSurface 函数( mClient BpSurfaceFlingerClient 类指针)同样使用 Binder 机制向 BnSurfaceFlingerClient 类请求服务(通过发送命令 CREATE_SURFACE ):

virtual sp<ISurface> createSurface( surface_data_t* params,

                                        int pid,

                                        DisplayID display,

                                        uint32_t w,

                                        uint32_t h,

                                        PixelFormat format,

                                         uint32_t flags)

    {

         ………………………………………..

 

        remote()->transact(CREATE_SURFACE, data, &reply);

         ………………………………………..

    }

BnSurfaceFlingerClient CREATE_SURFACE 的相应将同样调用 CreateSurface 函数。但此函数在这个类中未实现。

        case CREATE_SURFACE: {

             ……………………………………………..

 

            sp<ISurface> s = createSurface(&params, pid, display, w, h, format, flags);

………………………………………………..

        }

因此这个函数会由其继承类 BClient 来调用, BClient 类调用 CreateSurface 时会导致其友员类 SurfaceFlinger 类的 createSurface 函数被调用而 new LayerBuffer 的对象:

sp<ISurface> BClient::createSurface(

        ISurfaceFlingerClient::surface_data_t* params, int pid,

        DisplayID display, uint32_t w, uint32_t h, PixelFormat format,

        uint32_t flags)

{

//BClient 类的调用会调用 SurfaceFlinger 类的 createSurface

    return mFlinger->createSurface(mId, pid, params, display, w, h, format, flags);  // 这里从 JAVA 层来看,将会完成对 LayerBuffer 对象的创建,这个对象是图像合成的关键。

}

 

sp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid,

        ISurfaceFlingerClient::surface_data_t* params,

        DisplayID d, uint32_t w, uint32_t h, PixelFormat format,

        uint32_t flags)

{

……………………………………………….

 

    switch (flags & eFXSurfaceMask) {

        case eFXSurfaceNormal:

            if (UNLIKELY(flags & ePushBuffers)) {

                layer = createPushBuffersSurfaceLocked(c, d, id, w, h, flags);    // 这个函数会 new LayerBuffer 对象

            } else {

                layer = createNormalSurfaceLocked(c, d, id, w, h, format, flags);   //Layer 对象

            }

            break;

        case eFXSurfaceBlur:

            layer = createBlurSurfaceLocked(c, d, id, w, h, flags);          //LayerBlur 对象

            break;

        case eFXSurfaceDim:

            layer = createDimSurfaceLocked(c, d, id, w, h, flags);          //LayerDim 对象

            break;

}

…………………………………………..

}

在这里我们开始进入 SurfaceFlinger 的服务。

注意: 关于 SurfaceComposerClient 类的作用,它是用来产生 Binder 机制的,举例:

status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags)

{

    const sp<ISurfaceComposer>& sm(_get_surface_manager ());

    return sm->freezeDisplay(dpy, flags);

}

 

 

const sp<ISurfaceComposer>& _get_surface_manager()

{

    if (gSurfaceManager != 0) {

        return gSurfaceManager;

    }

 

    sp<IBinder> binder;

    sp<IServiceManager> sm = defaultServiceManager();

    do {

        binder = sm->getService(String16("SurfaceFlinger"));

        if (binder == 0) {

            LOGW("SurfaceFlinger not published, waiting...");

            usleep(500000); // 0.5 s

        }

    } while(binder == 0);

    sp<ISurfaceComposer> sc(interface_cast<ISurfaceComposer>(binder));

 

    Mutex::Autolock _l(gLock);

    if (gSurfaceManager == 0) {

        gSurfaceManager = sc;

    }

    return gSurfaceManager;

}

这是一个全局函数,我们在 Binder 机制中说明过,这个函数的作用就是用来生成继承自

ISurfaceComposer BpSurfaceComposer 继承类对象。使得 return sm->freezeDisplay(dpy, flags); 调用的是 BpSurfaceComposer 类的函数。

SurfaceComposerClient 另一个作用,它还可以调用 BpSurfaceFlingerClient 类的相应函数,同时也可以设置其他类的类成员,也就是说它是一个对外的总接口。

 

这里先写到这儿,Surfaceflinger也是非常复杂,我的 工作笔 记还有一半多的内容,在贴完工作笔记后,我会给出一个总结来理顺大家的思路!!!

 

来源:http://wsqhs.spaces.live.com/blog/cns!94F639580F58209C!668.entry?ccr=7415#comment

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值