转 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 的相关属性。

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

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

a1 SurfaceID 根据此 ID 把相关 surface layer 对应起来

a2 SurfaceInfo

包括宽高格式等信息

a3 2 buffer 指针、 buffer 索引等信息

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

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

更多相关文章

  1. Android(安卓)LayoutAnimation
  2. Android(安卓)知识图谱
  3. Android定制出厂默认输入法(其他设置类似)
  4. Android使用DefaultHttpClient访问Wap网络
  5. EditText
  6. Unity与Android权限设置
  7. Android(安卓)最强RecyclerView分割线XRecyclerViewDivider重磅
  8. 教你如何开关Android的APN网络
  9. Android精讲--界面编程3

随机推荐

  1. js中的循环和php循环的区别
  2. 数字金额转大写文字
  3. PHP:实例演示PHP模块加载和JavaScript和P
  4. PHP第一课
  5. 210406 类数组 获取遍历DOM元素 向元素添
  6. IOC 控制反转与 DI 依赖注入
  7. 基于Redis实现PHP消息队列
  8. 函数编写2的平方的阶乘加3的平方的阶乘
  9. 对企业来说,坚果云和亿方云哪个好?
  10. ContOS下Firewalld的相关命令