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 的相关属性。
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 等)
更多相关文章
- Android(安卓)LayoutAnimation
- Android(安卓)知识图谱
- Android定制出厂默认输入法(其他设置类似)
- Android使用DefaultHttpClient访问Wap网络
- EditText
- Unity与Android权限设置
- Android(安卓)最强RecyclerView分割线XRecyclerViewDivider重磅
- 教你如何开关Android的APN网络
- Android精讲--界面编程3