} }
mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); if (oldOpacity != isOpaque(s)) {
recomputeVisibleRegions = true; }
// FIXME: postedRegion should be dirty & bounds Region dirtyRegion(Rect(s.active.w, s.active.h));
// transform the dirty region to window-manager space outDirtyRegion = (s.transform.transform(dirtyRegion)); }
return outDirtyRegion; }
LatchBufferº¯Êýµ÷ÓÃupdateTextImageÀ´µÃµ½ÐèÒªµÄͼÏñ¡£ÕâÀï²ÎÊýrÊÇReject¶ÔÏ󣬯ä×÷ÓÃÊÇÅжÏÔÚ»º³åÇøµÄ³ß´çÊÇ·ñ·ûºÏÒªÇó¡£µ÷ÓÃupdateTextImageº¯ÊýÈç¹ûµÃµ½µÄ½á¹ûÊÇPRESENT_LATER,±íÊ¾ÍÆ³Ù´¦Àí£¬È»ºóµ÷ÓÃsignalLayerUpdateº¯ÊýÀ´·¢ËÍinvalidateÏûÏ¢£¬Õâ´Î»æÖƹý³Ì¾Í²»´¦ÀíÕâ¸öSurfaceµÄͼÏñÁË¡£ Èç¹û²»ÐèÒªÍÆ³Ù´¦Àí£¬°ÑmQueuedFramesµÄÖµ¼õ1.
×îºóLatchBufferº¯Êýµ÷ÓÃmSurfaceFlingerConsumerµÄgetCurrentBufferÀ´È¡»Øµ±Ç°µÄͼÏñ»º³åÇøÖ¸Õ룬±£´æÔÚmActiveBufferÖС£
2.5 С½á
ÕâÑù¾¹ýhandleTransaction handlePageFlipÁ½¸öº¯Êý´¦Àí£¬SurfaceFlingerÖÐÎÞÂÛÊÇLayerÊôÐԵı仯»¹ÊÇͼÏñµÄ±ä»¯¶¼´¦ÀíºÃÁË£¬Ö»µÈVSyncÐźŵ½À´¾Í¿ÉÒÔÊä³öÁË¡£
Èý¡¢rebuildLayerStacksº¯Êý
Ç°Ãæ½éÉÜ£¬VSyncÐźŵ½À´ºó£¬ÏÈÊǵ÷ÓÃÁËrebuildLayerStacksº¯Êý [cpp] view plain copy ÔÚCODEÉϲ鿴´úÂëÆ¬ÅÉÉúµ½ÎҵĴúÂëÆ¬ void SurfaceFlinger::rebuildLayerStacks() { // rebuild the visible layer list per screen
if (CC_UNLIKELY(mVisibleRegionsDirty)) { ATRACE_CALL();
mVisibleRegionsDirty = false; invalidateHwcGeometry();
//¼ÆËãÿ¸öÏÔʾÉ豸ÉϿɼûµÄLayer
const LayerVector& layers(mDrawingState.layersSortedByZ); for (size_t dpy=0 ; dpy Vector< sp const sp //¼ÆËãÿ¸ölayerµÄ¿É¼ûÇøÓò£¬È·¶¨É豸ÐèÒªÖØÐ»æÖƵÄÇøÓò SurfaceFlinger::computeVisibleRegions(layers, hw->getLayerStack(), dirtyRegion, opaqueRegion); const size_t count = layers.size(); for (size_t i=0 ; i const sp const Layer::State& s(layer->getDrawingState()); if (s.layerStack == hw->getLayerStack()) { //Ö»ÐèÒªºÍÏÔʾÉ豸µÄLayerStackÏàͬµÄlayer Region drawRegion(tr.transform( layer->visibleNonTransparentRegion)); drawRegion.andSelf(bounds); if (!drawRegion.isEmpty()) { //Èç¹ûLayerµÄÏÔÊ¾ÇøÓòºÍÏÔʾÉ豸µÄ´°¿ÚÓн»¼¯ //°ÑLayer¼ÓÈëÁбíÖÐ layersSortedByZ.add(layer); } } } } //ÉèÖÃÏÔʾÉ豸µÄ¿É¼ûLayerÁбí hw->setVisibleLayersSortedByZ(layersSortedByZ); hw->undefinedRegion.set(bounds); hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion)); hw->dirtyRegion.orSelf(dirtyRegion); } } } rebuildLayerStacksº¯ÊýµÄ×÷ÓÃÊÇÖØ½¨Ã¿¸öÏÔʾÉ豸µÄ¿É¼ûlayer¶ÔÏóÁÐ±í¡£¶ÔÓÚ°´ÏÔʾÖᣨZÖᣩÅÅÁеÄLayer¶ÔÏó£¬ÅÅÔÚ×îÇ°ÃæµÄµ±È»»áÓÅÏÈÏÔʾ£¬µ«ÊÇLayerͼÏñ¿ÉÄÜÓÐ͸Ã÷Óò£¬Ò²¿ÉÄÜÓгߴçûÓи²¸ÇÕû¸öÆÁÄ»£¬Òò´ËÏÂÃæµÄlayerÒ²ÓÐÏÔʾµÄ»ú»á¡£rebuildLayerStacksº¯Êý¶Ôÿ¸öÏÔʾÉ豸£¬ÏȼÆËãºÍÏÔʾÉ豸¾ßÓÐÏàͬlayerStackÖµµÄLayer¶ÔÏóÔÚ¸ÃÏÔʾÉ豸ÉϵĿɼûÇøÓò¡£È»ºó½«¿É¼ûÇøÓòºÍÏÔʾÉ豸µÄ´°¿ÚÇøÓòÓн»¼¯µÄlayer×é³ÉÒ»¸öеÄÁÐ±í£¬×îºó°ÑÕâ¸öÁбíÉèÖõ½ÏÔʾÉ豸¶ÔÏóÖС£ computeVisibleRegionsº¯ÊýÊ×ÏȼÆËãÿ¸öLayerÔÚÉ豸ÉϵĿɼûÇøÓòvisibleRegion¡£¼ÆËã·½·¨¾ÍÊÇÓÃÕû¸öLayerµÄÇøÓò¼õÈ¥ÉϲãËùÓв»Í¸Ã÷ÇøÓòaboveOpaqueLayers¡£¶øÉϲãËùÓв»Í¸Ã÷ÇøÓòÖµÊÇÒ»¸öÖð²ãÀۼƵĹý³Ì£¬Ã¿²ã¶¼ÐèÒª°Ñ×Ô¼ºµÄ²»Í¸Ã÷ÇøÓòÀÛ¼Óµ½aboveOpaqueLayersÖС£ ¶øÃ¿²ãµÄ²»Í¸Ã÷ÇøÓòµÄ¼ÆËã·½·¨£ºÈç¹ûLayerµÄalphaµÄֵΪ255£¬²¢ÇÒlayerµÄisOpaqueº¯ÊýΪtrue£¬Ôò±¾²ãµÄ²»Í¸Ã÷ÇøÓòµÈÓÚLayerËùÔÚÇøÓò£¬·ñÔòΪ0.ÕâÑùÒ»²ã²ãËãÏÂÀ´£¬¾ÍºÜÈÝÒ׵õ½Ã¿²ãµÄ¿É¼ûÇøÓò´óСÁË¡£ Æä´Î£¬¼ÆËãÕû¸öÏÔʾÉ豸ÐèÒª¸üеÄÇøÓòoutDirtyRegion¡£outDirtyRegionµÄÖµÒ²ÊÇÀÛ¼ÆËùÓвãµÄÐèÒªÖØ»ØµÄÇøÓòµÃµ½µÄ¡£Èç¹ûLayerÖеÄÏÔʾÄÚÈÝ·¢ÉúÁ˱仯£¬ÔòÕû¸ö¿É¼ûÇøÓòvisibleRegion¶¼ÐèÒª¸üУ¬Í¬Ê±»¹Òª°üÀ¨ÉÏÒ»´ÎµÄ¿É¼ûÇøÓò£¬È»ºóÔÚÈ¥µô±»Éϲ㸲¸ÇºóµÄÇøÓòµÃµ½µÄ¾ÍÊÇLayerÐèÒª¸üеÄÇøÓò¡£Èç¹ûLayerÏÔʾµÄÄÚÈÝûÓб仯£¬µ«ÊÇ¿¼Âǵ½´°¿Ú´óСµÄ±ä»¯»òÕßÉϲ㴰¿ÚµÄ±ä»¯£¬Òò´ËLayerÖл¹ÊÇÓÐÇøÓò¿ÉÒÔÐèÒªÖØ»æµÄµØ·½¡£ÕâÖÖÇé¿öÏÂ×î¼òµ¥µÄËã·¨ÊÇÓÃLayer¼ÆËã³ö¿É¼ûÇøÓò¼õÈ¥ÒÔǰµÄ¿É¼ûÇøÓò¾Í¿ÉÒÔÁË¡£µ«ÊÇÔÚcomputeVisibleRegionsº¯Êý»¹ÒýÈëÁ˱»¸²¸ÇÇøÓò£¬Í¨³£±»¸²¸ÇÇøÓòºÍ¿É¼ûÇøÓò²¢²»Öظ´£¬Òò´Ëº¯ÊýÖмÆËã±©Â¶ÇøÓòÊÇÓÿɼûÇøÓò¼õÈ¥±»¸²¸ÇÇøÓòµÄ¡£ ËÄ¡¢setUpHWComposerº¯Êý setUpHWComposerº¯ÊýµÄ×÷ÓÃÊǸüÐÂHWComposer¶ÔÏóÖÐͼ²ã¶ÔÏóÁбíÒÔ¼°Í¼²ãÊôÐÔ¡£ [cpp] view plain copy ÔÚCODEÉϲ鿴´úÂëÆ¬ÅÉÉúµ½ÎҵĴúÂëÆ¬ void SurfaceFlinger::setUpHWComposer() { for (size_t dpy=0 ; dpy bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty(); bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0; bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers; bool mustRecompose = dirty && !(empty && wasEmpty); mDisplays[dpy]->beginFrame(mustRecompose); if (mustRecompose) { mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty; } } HWComposer& hwc(getHwComposer());//µÃµ½ÏµÍ³HWComposer¶ÔÏó if (hwc.initCheck() == NO_ERROR) { // build the h/w work list if (CC_UNLIKELY(mHwWorkListDirty)) { mHwWorkListDirty = false; for (size_t dpy=0 ; dpy const Vector< sp const size_t cowww.tt951.comunt = currentLayers.size(); //¸ù¾ÝLayerÊýÁ¿ÔÚHWComposerÖд´½¨hwc_layer_list_tÁбí if (hwc.createWorkList(id, count) == NO_ERROR) { ...... } } } } // set the per-frame data for (size_t dpy=0 ; dpy for (size_t i=0 ; cur!=end && i //½«LayerµÄmActiveBufferÉèÖõ½HWComposerÖÐ layer->setPerFrameData(hw, *cur); } } } // If possible, attempt to use the cursor overlay on each display. for (size_t dpy=0 ; dpy const Vector< sp HWComposer::LayerListIterator cur = hwc.begin(id); const HWComposer::LayerListIterator end = hwc.end(id); for (size_t i=0 ; cur!=end && i status_t err = hwc.prepare(); ALOGE_IF(err, \ for (size_t dpy=0 ; dpy