开发者选项 Disable HW overlays -> 分析


1.Disable HW overlays

1../packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java

setting得到SurfaceFlinger服务,通过binder发命令。


private void writeDisableOverlaysOption() {

        try {
            IBinder flinger = ServiceManager.getService("SurfaceFlinger");
            if (flinger != null) {
                Parcel data = Parcel.obtain();
                data.writeInterfaceToken("android.ui.ISurfaceComposer");
                final int disableOverlays = mDisableOverlays.isChecked() ? 1 : 0;
                data.writeInt(disableOverlays);
                flinger.transact(1008, data, null, 0);
                data.recycle();

                updateFlingerOptions();
            }
        } catch (RemoteException ex) {
        }
    }


2.SurfaceFlinger.cpp

SurfaceFlinger处理命令,置位相应的标志,重新画图。

           case 1008:  // toggle use of hw composer
                n = data.readInt32();
                mDebugDisableHWC = n ? 1 : 0;
                invalidateHwcGeometry();  //mHwWorkListDirty = true;
                repaintEverything();            
                return NO_ERROR;

3.SurfaceFlinger.cpp

重新画图。

void SurfaceFlinger::repaintEverything() {
    android_atomic_or(1, &mRepaintEverything);
    signalTransaction();
}

4. 4-6给队列发消息

void SurfaceFlinger::signalTransaction() {
    mEventQueue.invalidate();

5.


#define INVALIDATE_ON_VSYNC 1

void MessageQueue::invalidate() {
#if INVALIDATE_ON_VSYNC
    mEvents->requestNextVsync();
#else
    mHandler->dispatchInvalidate();
#endif
}   
    

6.

frameworks/native/services/surfaceflinger/MessageQueue.cpp

void MessageQueue::Handler::dispatchInvalidate() {
    if ((android_atomic_or(eventMaskInvalidate, &mEventMask) & eventMaskInvalidate) == 0) {
        mQueue.mLooper->sendMessage(this, Message(MessageQueue::INVALIDATE));
    }
}

7.处理重画的消息

void SurfaceFlinger::onMessageReceived(int32_t what) {
    ATRACE_CALL();
    switch (what) {
    case MessageQueue::INVALIDATE:
        TF_PRINT(TF_EVENT_START, "SF", "Invalidate", "Composition invalidate start");
        handleMessageTransaction();
        handleMessageInvalidate();
        signalRefresh();
        TF_PRINT(TF_EVENT_STOP, "SF", "Invalidate", "Composition invalidate end");
        break;
    case MessageQueue::REFRESH:
        TF_PRINT(TF_EVENT_START, "SF", "CompositionRefresh", "Composition refresh start");
        handleMessageRefresh();
        TF_PRINT(TF_EVENT_STOP, "SF", "CompositionRefresh", "Composition refresh end");
        break;
    }
}

8.图形属性大小、旋转方向没有发生变化,所以不会调用

void SurfaceFlinger::handleMessageTransaction() {
    uint32_t transactionFlags = peekTransactionFlags(eTransactionMask);// transactionFlags=mTransactionFlags
    if (transactionFlags) { // transactionFlags = false 所以不会走下边。
        handleTransaction(transactionFlags);
    }
}

9.重新计算可视区,mVisibleRegionsDirty推测是false.

void SurfaceFlinger::handleMessageInvalidate() {
    ATRACE_CALL();
    handlePageFlip();
}


void SurfaceFlinger::handlePageFlip()
{
    Region dirtyRegion;

    bool visibleRegions = false;
    const LayerVector& currentLayers(mDrawingState.layersSortedByZ);
    const size_t count = currentLayers.size();
    for (size_t i=0 ; i<count ; i++) {
        const sp<LayerBase>& layer(currentLayers[i]);
        const Region dirty(layer->latchBuffer(visibleRegions));
        const Layer::State& s(layer->drawingState());
        invalidateLayerStack(s.layerStack, dirty);
    }    
   // ALOGE("visibleRegions =%s",visibleRegions ? "true" : "false");   false


    mVisibleRegionsDirty |= visibleRegions;
}


10.

void SurfaceFlinger::handleMessageRefresh() {
    ATRACE_CALL();
    preComposition();
    rebuildLayerStacks();
    setUpHWComposer();
    doDebugFlashRegions();
    doComposition();
    postComposition();
}

11.



void SurfaceFlinger::setUpHWComposer()

           if (CC_UNLIKELY(mHwWorkListDirty)) {
            ALOGE("test 718 setUpHWComposer mHwWorkListDirty==TURE");
            mHwWorkListDirty = false;//保证只运行一次

              if (mDebugDisableHWC || mDebugRegion) {
                                cur->setSkip(true);//设置HWC_SKIP_LAYER标志
              }


            status_t err = hwc.prepare();

  virtual void setSkip(bool skip) {
        if (skip) {
            getLayer()->flags |= HWC_SKIP_LAYER;
        } else {
            getLayer()->flags &= ~HWC_SKIP_LAYER;
        }
    }


hwc.prepare();--------->status_t HWComposer::prepare()------------>int err = mHwc->prepare(mHwc, mNumDisplays, mLists);


12. hardware/qcom/display/libhwcomposer/hwc.cpp  hwc_prepare 

在updateLayerCache中,HWC_SKIP_LAYER和HWC_FRAMEBUFFER处理的方式不一样。why??

hardware/qcom/display/libhwcomposer/hwc.cpp

static int hwc_prepare_primary(hwc_composer_device_1 *dev,
        hwc_display_contents_1_t *list)

                              ctx->mLayerCache[dpy]->updateLayerCache(list);

   for(uint32_t i = 0; i < list->numHwLayers; i++) {
             //Bail on skip layers
        if(list->hwLayers[i].flags & HWC_SKIP_LAYER) {
            resetLayerCache(list->numHwLayers);
            return;
        }
    
        if(list->hwLayers[i].compositionType == HWC_FRAMEBUFFER) {
            numFbLayers++;
            if(hnd[i] == NULL) {
                hnd[i] = list->hwLayers[i].handle;
            } else if (hnd[i] ==
                       list->hwLayers[i].handle) {
                numCacheableLayers++;
            } else {
                hnd[i] = NULL;
                return;
            }
        } else {
            hnd[i] = NULL;
        }
    }


void LayerCache::resetLayerCache(int num) {
    for(uint32_t i = 0; i < MAX_NUM_LAYERS; i++) {
        hnd[i] = NULL;
    }
    numHwLayers = num;
}


13.frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp

把有HWC_SKIP_LAYER标志的层设置合成方式是HWC_FRAMEBUFFER

status_t HWComposer::prepare()      

for (size_t i=0 ; i<disp.list->numHwLayers ; i++) {
                    hwc_layer_1_t& l = disp.list->hwLayers[i];

                    //ALOGD("prepare: %d, type=%d, handle=%p",
                    //        i, l.compositionType, l.handle);

                    if (l.flags & HWC_SKIP_LAYER) {
                        ALOGE("test 718 HWComposer::prepare() HWC_SKIP_LAYER");
                        l.compositionType = HWC_FRAMEBUFFER;// HWC_SKIP_LAYER  => HWC_FRAMEBUFFER
                    }
                    if (l.compositionType == HWC_FRAMEBUFFER) {
                        ALOGE("test 718 HWComposer::prepare() HWC_FRAMEBUFFER");
                        disp.hasFbComp = true;
                    }
                    if (l.compositionType == HWC_OVERLAY) {
                        disp.hasOvComp = true;
                    }
                }



14.

SurfaceFlinger.cpp

void SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)

      /*
     * and then, render the layers targeted at the framebuffer
     */

    const Vector< sp<LayerBase> >& layers(hw->getVisibleLayersSortedByZ());
    const size_t count = layers.size();
    const Transform& tr = hw->getTransform();
    if (cur != end) {
        // we're using h/w composer
        for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
            const sp<LayerBase>& layer(layers[i]);
            const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
            if (!clip.isEmpty()) {
                switch (cur->getCompositionType()) {
                    case HWC_OVERLAY: {
                        ALOGE("test 718 doComposeSurfaces case HWC_OVERLAY");
                        ALOGE("test 718 hasGlesComposition=%s",hasGlesComposition ? "true" : "false");
                        if ((cur->getHints() & HWC_HINT_CLEAR_FB)
                                && i
                                && layer->isOpaque()
                                && hasGlesComposition) {
                            // never clear the very first layer since we're
                            // guaranteed the FB is already cleared
                            ALOGE("test 718 clear");
                            layer->clearWithOpenGL(hw, clip);
                        }
                        break;
                    }
                    case HWC_FRAMEBUFFER: {
                        ALOGE("test 718 doComposeSurfaces case HWC_FRAMEBUFFER");
                        layer->draw(hw, clip);
                        break;

                    case HWC_FRAMEBUFFER_TARGET: {
                        // this should not happen as the iterator shouldn't
                        // let us get there.
                        ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%d)", i);
                        break;
                    }
                }
            }
            layer->setAcquireFence(hw, *cur);
        }











     
               

      








13.


当Disable HW overlays ,这个log‘test 718’会不停的打。如果不选,则不会打log。



                   if (l.flags & HWC_SKIP_LAYER) {
                        ALOGE("test 718 HWComposer::prepare() HWC_SKIP_LAYER");
                        l.compositionType = HWC_FRAMEBUFFER;
                    }
                    if (l.compositionType == HWC_FRAMEBUFFER) {
                        ALOGE("test 718 HWComposer::prepare() HWC_FRAMEBUFFER");
                        disp.hasFbComp = true;
                    }
                    if (l.compositionType == HWC_OVERLAY) {
                        disp.hasOvComp = true;
                    }





选中

D/CallStack(  275): #00  pc 00006f74  /system/lib/hw/hwcomposer.msm8960.so
D/CallStack(  275): #01  pc 00007248  /system/lib/hw/hwcomposer.msm8960.so
D/CallStack(  275): #02  pc 000233be  /system/lib/libsurfaceflinger.so (android::HWComposer::prepare()+145)
D/CallStack(  275): #03  pc 00026710  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::setUpHWComposer()+363)
D/CallStack(  275): #04  pc 00029324  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::handleMessageRefresh()+39)
D/CallStack(  275): #05  pc 00029f7a  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::onMessageReceived(int)+57)
D/CallStack(  275): #06  pc 00014c70  /system/lib/libutils.so (android::Looper::pollInner(int)+423)
D/CallStack(  275): #07  pc 00014d90  /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+103)
D/CallStack(  275): #08  pc 00024894  /system/lib/libsurfaceflinger.so (android::MessageQueue::waitMessage()+39)
D/CallStack(  275): #09  pc 00024e80  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::threadLoop()+5)
D/CallStack(  275): #10  pc 00011264  /system/lib/libutils.so (android::Thread::_threadLoop(void*)+111)
D/CallStack(  275): #11  pc 00010dca  /system/lib/libutils.so
D/CallStack(  275): #12  pc 0000e4f8  /system/lib/libc.so (__thread_entry+72)
D/CallStack(  275): #13  pc 0000dbe4  /system/lib/libc.so (pthread_create+160)
E/qdhwcomposer(  275): test 718 hwc_prepare_primary MDPcomp fails
E/qdhwcomposer(  275): test 718 updateLayerCache HWC_SKIP_LAYER
E/qdhwcomposer(  275): test 718 hwc_prepare_primary mCopyBit
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_SKIP_LAYER
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_FRAMEBUFFER
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_SKIP_LAYER
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_FRAMEBUFFER
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_SKIP_LAYER
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_FRAMEBUFFER

// prepare结束,就是清cache的时候,用到了HWC_SKIP_LAYER。

  
    目的把HWC_SKIP_LAYER,变为HWC_FRAMEBUFFER属性。disp.hasFbComp表示有FB合成。











D/CallStack(  276): #00  pc 00025ccc  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::doComposeSurfaces(android::sp<android::DisplayDevice const> const&, android::Region const&)+23)
D/CallStack(  276): #01  pc 00026014  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::doDisplayComposition(android::sp<android::DisplayDevice const> const&, android::Region const&)+123)
D/CallStack(  276): #02  pc 000290ac  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::doComposition()+95)
D/CallStack(  276): #03  pc 00029318  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::handleMessageRefresh()+51)
D/CallStack(  276): #04  pc 00029f62  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::onMessageReceived(int)+57)
D/CallStack(  276): #05  pc 00014c70  /system/lib/libutils.so (android::Looper::pollInner(int)+423)
D/CallStack(  276): #06  pc 00014d90  /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+103)
D/CallStack(  276): #07  pc 00024894  /system/lib/libsurfaceflinger.so (android::MessageQueue::waitMessage()+39)
D/CallStack(  276): #08  pc 00024e80  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::threadLoop()+5)
D/CallStack(  276): #09  pc 00011264  /system/lib/libutils.so (android::Thread::_threadLoop(void*)+111)
D/CallStack(  276): #10  pc 00010dca  /system/lib/libutils.so
D/CallStack(  276): #11  pc 0000e4f8  /system/lib/libc.so (__thread_entry+72)
D/CallStack(  276): #12  pc 0000dbe4  /system/lib/libc.so (pthread_create+160)
E/SurfaceFlinger(  276): test 718 doComposeSurfaces case HWC_FRAMEBUFFER
E/SurfaceFlinger(  276): test 718 doComposeSurfaces case HWC_FRAMEBUFFER
E/SurfaceFlinger(  276): test 718 doComposeSurfaces case HWC_FRAMEBUFFER


















     
               

      














选中

D/CallStack(  275): #00  pc 00006f74  /system/lib/hw/hwcomposer.msm8960.so
D/CallStack(  275): #01  pc 00007248  /system/lib/hw/hwcomposer.msm8960.so
D/CallStack(  275): #02  pc 000233be  /system/lib/libsurfaceflinger.so (android::HWComposer::prepare()+145)
D/CallStack(  275): #03  pc 00026710  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::setUpHWComposer()+363)
D/CallStack(  275): #04  pc 00029324  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::handleMessageRefresh()+39)
D/CallStack(  275): #05  pc 00029f7a  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::onMessageReceived(int)+57)
D/CallStack(  275): #06  pc 00014c70  /system/lib/libutils.so (android::Looper::pollInner(int)+423)
D/CallStack(  275): #07  pc 00014d90  /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+103)
D/CallStack(  275): #08  pc 00024894  /system/lib/libsurfaceflinger.so (android::MessageQueue::waitMessage()+39)
D/CallStack(  275): #09  pc 00024e80  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::threadLoop()+5)
D/CallStack(  275): #10  pc 00011264  /system/lib/libutils.so (android::Thread::_threadLoop(void*)+111)
D/CallStack(  275): #11  pc 00010dca  /system/lib/libutils.so
D/CallStack(  275): #12  pc 0000e4f8  /system/lib/libc.so (__thread_entry+72)
D/CallStack(  275): #13  pc 0000dbe4  /system/lib/libc.so (pthread_create+160)
E/qdhwcomposer(  275): test 718 hwc_prepare_primary MDPcomp fails
E/qdhwcomposer(  275): test 718 updateLayerCache HWC_SKIP_LAYER
E/qdhwcomposer(  275): test 718 hwc_prepare_primary mCopyBit
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_SKIP_LAYER
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_FRAMEBUFFER
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_SKIP_LAYER
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_FRAMEBUFFER
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_SKIP_LAYER
E/SurfaceFlinger(  275): test 718 HWComposer::prepare() HWC_FRAMEBUFFER

// prepare结束,就是清cache的时候,用到了HWC_SKIP_LAYER。

     // here we're just making sure that "skip" layers are set
        // to HWC_FRAMEBUFFER and we're also counting how many layers
        // we have of each type.
        for (size_t i=0 ; i<mNumDisplays ; i++) {
            DisplayData& disp(mDisplayData[i]);
            disp.hasFbComp = false;
            disp.hasOvComp = false;
            if (disp.list) {
                for (size_t i=0 ; i<disp.list->numHwLayers ; i++) {
                    hwc_layer_1_t& l = disp.list->hwLayers[i];

                    //ALOGD("prepare: %d, type=%d, handle=%p",
                    //        i, l.compositionType, l.handle);

                    if (l.flags & HWC_SKIP_LAYER) {
                        ALOGE("test 718 HWComposer::prepare() HWC_SKIP_LAYER");
                        l.compositionType = HWC_FRAMEBUFFER;
                    }
                    if (l.compositionType == HWC_FRAMEBUFFER) {
                        ALOGE("test 718 HWComposer::prepare() HWC_FRAMEBUFFER");
                        disp.hasFbComp = true;
                    }
                    if (l.compositionType == HWC_OVERLAY) {
                        disp.hasOvComp = true;
                    }
                }
            }
        }

目的把HWC_SKIP_LAYER,变为HWC_FRAMEBUFFER属性。disp.hasFbComp表示有FB合成。











D/CallStack(  276): #00  pc 00025ccc  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::doComposeSurfaces(android::sp<android::DisplayDevice const> const&, android::Region const&)+23)
D/CallStack(  276): #01  pc 00026014  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::doDisplayComposition(android::sp<android::DisplayDevice const> const&, android::Region const&)+123)
D/CallStack(  276): #02  pc 000290ac  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::doComposition()+95)
D/CallStack(  276): #03  pc 00029318  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::handleMessageRefresh()+51)
D/CallStack(  276): #04  pc 00029f62  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::onMessageReceived(int)+57)
D/CallStack(  276): #05  pc 00014c70  /system/lib/libutils.so (android::Looper::pollInner(int)+423)
D/CallStack(  276): #06  pc 00014d90  /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+103)
D/CallStack(  276): #07  pc 00024894  /system/lib/libsurfaceflinger.so (android::MessageQueue::waitMessage()+39)
D/CallStack(  276): #08  pc 00024e80  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::threadLoop()+5)
D/CallStack(  276): #09  pc 00011264  /system/lib/libutils.so (android::Thread::_threadLoop(void*)+111)
D/CallStack(  276): #10  pc 00010dca  /system/lib/libutils.so
D/CallStack(  276): #11  pc 0000e4f8  /system/lib/libc.so (__thread_entry+72)
D/CallStack(  276): #12  pc 0000dbe4  /system/lib/libc.so (pthread_create+160)
E/SurfaceFlinger(  276): test 718 doComposeSurfaces case HWC_FRAMEBUFFER
E/SurfaceFlinger(  276): test 718 doComposeSurfaces case HWC_FRAMEBUFFER
E/SurfaceFlinger(  276): test 718 doComposeSurfaces case HWC_FRAMEBUFFER




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值