Chinaunix首页 | 论坛 | 博客
  • 博客访问: 264816
  • 博文数量: 69
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 900
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-07 16:35
文章分类

全部博文(69)

文章存档

2011年(1)

2010年(68)

我的朋友

分类: LINUX

2010-08-02 22:10:28

声明本文转载于http://hi.baidu.com/leowenj/blog/item/3fe59f740a6fee17b051b991.html

4)、setClientState

处理上层的各个命令,并根据flag设置event通知Threadloop进行处理

status_t SurfaceFlinger::setClientState(

        ClientID cid,

        int32_t count,

        const layer_state_t* states)

{

    Mutex::Autolock _l(mStateLock);

    uint32_t flags = 0;

    cid <<= 16;

    for (int i=0 ; i//检测所有存在layer的状态标志

    {

        const layer_state_t& s = states[i];

        LayerBaseClient* layer = getLayerUser_l(s.surface | cid);

        if (layer)

             {

            const uint32_t what = s.what;

            // 检测应用层是否设置各个标志,如果有则通知底层完成对应操作,并通知ThreadLoop做对应的处理

            if (what & eDestroyed) //删除该层Layer

                 {

                if (removeLayer_l(layer) == NO_ERROR)

                 {

                    flags |= eTransactionNeeded;

                    continue;

                }

            }

            if (what & ePositionChanged) //显示位置变化

                 {

                if (layer->setPosition(s.x, s.y))

                    flags |= eTraversalNeeded;

            }

            if (what & eLayerChanged) //Layer改变

                 {

                if (layer->setLayer(s.z))

                  {

                    mCurrentState.layersSortedByZ.reorder(

                            layer, &Layer::compareCurrentStateZ);

                    flags |= eTransactionNeeded|eTraversalNeeded;

                }

            }

            if (what & eSizeChanged)

                  {

                if (layer->setSize(s.w, s.h))//设置宽高变化

                    flags |= eTraversalNeeded;

            }

            if (what & eAlphaChanged) {//设置Alpha效果

                if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))

                  flags |= eTraversalNeeded;

            }

            if (what & eMatrixChanged) {//矩阵参数变化

                if (layer->setMatrix(s.matrix))

                    flags |= eTraversalNeeded;

            }

            if (what & eTransparentRegionChanged) {//显示区域变化

                if (layer->setTransparentRegionHint(s.transparentRegion))

                    flags |= eTraversalNeeded;

            }

            if (what & eVisibilityChanged) {//是否显示

                if (layer->setFlags(s.flags, s.mask))

                    flags |= eTraversalNeeded;

            }

        }

    }

if (flags)

{

        setTransactionFlags(flags);//通过signal通知ThreadLoop

    }

    return NO_ERROR;

}

5)、composeSurfaces

该接口在Threadloop中被调用,负责将所有存在的surface进行合并,OpenGl模块负责这个部分。

6)、postFramebuffer

              该接口在Threadloop中被调用,负责将合成好的数据(存于back buffer中)推入在front buffer中,然后调用HAL接口命令底层显示。

7)、3中可知,上层每创建一个surface的时候,底层都会同时创建一个layer,下面看一下surfacelayer的相关属性。

Notecode中相关结构体太大,就不全部罗列出来了

   ASurface相关属性(详细参考文件surface.h

       a1SurfaceID根据此ID把相关surfacelayer对应起来

      a2SurfaceInfo

               包括宽高格式等信息

       a32buffer指针、buffer索引等信息

   BLayer相关属性(详细参考文件layer.h/layerbase.h/layerbitmap.h

               包括LayerID、宽高、位置、layeralpha指、前后buffer地址及索引、layer的状态信息(如eFlipRequestedeBusyeLocked等)

阅读(1246) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~