读书人

Android display架构分析(7-2)

发布时间: 2012-06-29 15:48:47 作者: rapoo

Android display架构分析(七-2)

转 http://hi.baidu.com/leowenj/blog/item/ba4c5d6378a5da48eaf8f86a.html

?

Android display架构分析(七-2)

?

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<count ; 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,下面看一下surface及layer的相关属性。

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

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

?????? a1SurfaceID根据此ID把相关surface和layer对应起来

????? a2SurfaceInfo

?????????????? 包括宽高格式等信息

?????? a32个buffer指针、buffer索引等信息

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

?????????????? 包括Layer的ID、宽高、位置、layer、alpha指、前后buffer地址及索引、layer的状态信息(如eFlipRequested、eBusy、eLocked等)

?

读书人网 >Android

热点推荐