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等)
?