1.1.1 handleTransaction
有两个相似的函数,handleTransaction需要获取mStateLock锁,执行handleTransactionLocked,最后再将mHwWorkListDirty置为true。
后一个handleTransactionLocked才是真正处理业务的地方。从前面我们对transactionflags的解释来推断,它的具体工作应该会分为两部分,即traversal(对应eTraversalNeeded)和transaction(对应eTransactionNeeded)。
void SurfaceFlinger::handleTransactionLocked(uint32_ttransactionFlags)
{
const LayerVector¤tLayers(mCurrentState.layersSortedByZ);
const size_t count =currentLayers.size();
/*第一部分,traversal所有layer*/
const boollayersNeedTransaction = transactionFlags & eTraversalNeeded;
if (layersNeedTransaction){//是否需要traversal
for (size_t i=0 ; i<count ; i++) {//逐个layer来处理
constsp<LayerBase>& layer = currentLayers[i];
uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);/*这个layer是否
需要doTransaction*/
if (!trFlags)continue;//如果不需要的话,直接进入下一个
const uint32_tflags = layer->doTransaction(0);//由各layer做内部处理,下面会做详细分析
if (flags &Layer::eVisibleRegion)//各layer计算可见区域是否变化
mVisibleRegionsDirty = true;//可见区域发生变化
}
}
/*第二部分,SurfaceFlinger执行transaction*/
if (transactionFlags &eTransactionNeeded) {
if (mCurrentState.orientation != mDrawingState.orientation) {
/*角度产生变化,需要重新计算所有的可见区域,并且重绘*/
const int dpy = 0;//第一个Display
const intorientation = mCurrentState.orientation; //新的orientation
GraphicPlane&plane(graphicPlane(dpy));
plane.setOrientation(orientation);//将改变后的旋转角度设置到底层管理者
// update theshared control block
constDisplayHardware& hw(plane.displayHardware());
/*下面的dcblk是一个供应用程序查询当前显示属性的“服务机构”,因而需要同步更新它*/
volatiledisplay_cblk_t* dcblk = mServerCblk->displays + dpy;
dcblk->orientation = orientation;
dcblk->w =plane.getWidth();
dcblk->h =plane.getHeight();
mVisibleRegionsDirty= true; //旋转角度变化,当然可见区域也会变化
mDirtyRegion.set(hw.bounds());//整个屏幕区域都是“脏”的
}
if (currentLayers.size() > mDrawingState.layersSortedByZ.size()) {// 有新的layer增加
mVisibleRegionsDirty = true;//可见区域需要重新计算
}
if (mLayersRemoved) {/*也可能有layers已经被移除,这样可见区域也会有变化。
比如原本被遮盖的部分或许就暴露出来了*/
mLayersRemoved =false; //
mVisibleRegionsDirty = true;
constLayerVector& previousLayers(mDrawingState.layersSortedByZ);
const size_t count= previousLayers.size();
for (size_t i=0 ;i<count ; i++) {
constsp<LayerBase>& layer(previousLayers[i]);
if(currentLayers.indexOf( layer ) < 0) {/*在之前状态中存在,在现有状态中找不到,
说明它被removed了*/
mDirtyRegionRemovedLayer.orSelf(layer->visibleRegionScreen);/*被移除layer的可见
区域*/
}
}
}
}
commitTransaction();//和Layer::doTransaction()的做法基本一样,多了几步操作
}