Loading services/surfaceflinger/DisplayDevice.cpp +8 −0 Original line number Original line Diff line number Diff line Loading @@ -401,6 +401,14 @@ const Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { return mVisibleLayersSortedByZ; return mVisibleLayersSortedByZ; } } void DisplayDevice::setLayersNeedingFences(const Vector< sp<Layer> >& layers) { mLayersNeedingFences = layers; } const Vector< sp<Layer> >& DisplayDevice::getLayersNeedingFences() const { return mLayersNeedingFences; } Region DisplayDevice::getDirtyRegion(bool repaintEverything) const { Region DisplayDevice::getDirtyRegion(bool repaintEverything) const { Region dirty; Region dirty; if (repaintEverything) { if (repaintEverything) { Loading services/surfaceflinger/DisplayDevice.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -124,6 +124,8 @@ public: void setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers); void setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers); const Vector< sp<Layer> >& getVisibleLayersSortedByZ() const; const Vector< sp<Layer> >& getVisibleLayersSortedByZ() const; void setLayersNeedingFences(const Vector< sp<Layer> >& layers); const Vector< sp<Layer> >& getLayersNeedingFences() const; Region getDirtyRegion(bool repaintEverything) const; Region getDirtyRegion(bool repaintEverything) const; void setLayerStack(uint32_t stack); void setLayerStack(uint32_t stack); Loading Loading @@ -241,6 +243,8 @@ private: // list of visible layers on that display // list of visible layers on that display Vector< sp<Layer> > mVisibleLayersSortedByZ; Vector< sp<Layer> > mVisibleLayersSortedByZ; // list of layers needing fences Vector< sp<Layer> > mLayersNeedingFences; /* /* * Transaction state * Transaction state Loading services/surfaceflinger/Layer.cpp +4 −5 Original line number Original line Diff line number Diff line Loading @@ -217,9 +217,6 @@ Layer::~Layer() { #ifdef USE_HWC2 #ifdef USE_HWC2 void Layer::onLayerDisplayed(const sp<Fence>& releaseFence) { void Layer::onLayerDisplayed(const sp<Fence>& releaseFence) { if (mHwcLayers.empty()) { return; } mSurfaceFlingerConsumer->setReleaseFence(releaseFence); mSurfaceFlingerConsumer->setReleaseFence(releaseFence); } } #else #else Loading Loading @@ -395,9 +392,9 @@ bool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) { return true; return true; } } void Layer::destroyHwcLayer(int32_t hwcId) { bool Layer::destroyHwcLayer(int32_t hwcId) { if (mHwcLayers.count(hwcId) == 0) { if (mHwcLayers.count(hwcId) == 0) { return; return false; } } auto& hwcInfo = mHwcLayers[hwcId]; auto& hwcInfo = mHwcLayers[hwcId]; LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, Loading @@ -408,6 +405,8 @@ void Layer::destroyHwcLayer(int32_t hwcId) { // mHwcLayers. Verify that. // mHwcLayers. Verify that. LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Stale layer entry in mHwcLayers"); "Stale layer entry in mHwcLayers"); return true; } } void Layer::destroyAllHwcLayers() { void Layer::destroyAllHwcLayers() { Loading services/surfaceflinger/Layer.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -454,7 +454,7 @@ public: // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- bool createHwcLayer(HWComposer* hwc, int32_t hwcId); bool createHwcLayer(HWComposer* hwc, int32_t hwcId); void destroyHwcLayer(int32_t hwcId); bool destroyHwcLayer(int32_t hwcId); void destroyAllHwcLayers(); void destroyAllHwcLayers(); bool hasHwcLayer(int32_t hwcId) { bool hasHwcLayer(int32_t hwcId) { Loading services/surfaceflinger/SurfaceFlinger.cpp +29 −2 Original line number Original line Diff line number Diff line Loading @@ -1782,6 +1782,7 @@ void SurfaceFlinger::rebuildLayerStacks() { Region opaqueRegion; Region opaqueRegion; Region dirtyRegion; Region dirtyRegion; Vector<sp<Layer>> layersSortedByZ; Vector<sp<Layer>> layersSortedByZ; Vector<sp<Layer>> layersNeedingFences; const sp<DisplayDevice>& displayDevice(mDisplays[dpy]); const sp<DisplayDevice>& displayDevice(mDisplays[dpy]); const Transform& tr(displayDevice->getTransform()); const Transform& tr(displayDevice->getTransform()); const Rect bounds(displayDevice->getBounds()); const Rect bounds(displayDevice->getBounds()); Loading @@ -1789,6 +1790,7 @@ void SurfaceFlinger::rebuildLayerStacks() { computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion); computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { mDrawingState.traverseInZOrder([&](Layer* layer) { bool hwcLayerDestroyed = false; if (layer->belongsToDisplay(displayDevice->getLayerStack(), if (layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary())) { displayDevice->isPrimary())) { Region drawRegion(tr.transform( Region drawRegion(tr.transform( Loading @@ -1799,18 +1801,32 @@ void SurfaceFlinger::rebuildLayerStacks() { } else { } else { // Clear out the HWC layer if this layer was // Clear out the HWC layer if this layer was // previously visible, but no longer is // previously visible, but no longer is layer->destroyHwcLayer( hwcLayerDestroyed = layer->destroyHwcLayer( displayDevice->getHwcDisplayId()); displayDevice->getHwcDisplayId()); } } } else { } else { // WM changes displayDevice->layerStack upon sleep/awake. // WM changes displayDevice->layerStack upon sleep/awake. // Here we make sure we delete the HWC layers even if // Here we make sure we delete the HWC layers even if // WM changed their layer stack. // WM changed their layer stack. layer->destroyHwcLayer(displayDevice->getHwcDisplayId()); hwcLayerDestroyed = layer->destroyHwcLayer( displayDevice->getHwcDisplayId()); } // If a layer is not going to get a release fence because // it is invisible, but it is also going to release its // old buffer, add it to the list of layers needing // fences. if (hwcLayerDestroyed) { auto found = std::find(mLayersWithQueuedFrames.cbegin(), mLayersWithQueuedFrames.cend(), layer); if (found != mLayersWithQueuedFrames.cend()) { layersNeedingFences.add(layer); } } } }); }); } } displayDevice->setVisibleLayersSortedByZ(layersSortedByZ); displayDevice->setVisibleLayersSortedByZ(layersSortedByZ); displayDevice->setLayersNeedingFences(layersNeedingFences); displayDevice->undefinedRegion.set(bounds); displayDevice->undefinedRegion.set(bounds); displayDevice->undefinedRegion.subtractSelf( displayDevice->undefinedRegion.subtractSelf( tr.transform(opaqueRegion)); tr.transform(opaqueRegion)); Loading Loading @@ -2050,6 +2066,17 @@ void SurfaceFlinger::postFramebuffer() layer->onLayerDisplayed(releaseFence); layer->onLayerDisplayed(releaseFence); } } // We've got a list of layers needing fences, that are disjoint with // displayDevice->getVisibleLayersSortedByZ. The best we can do is to // supply them with the present fence. if (!displayDevice->getLayersNeedingFences().isEmpty()) { sp<Fence> presentFence = mHwc->getPresentFence(hwcId); for (auto& layer : displayDevice->getLayersNeedingFences()) { layer->onLayerDisplayed(presentFence); } } if (hwcId >= 0) { if (hwcId >= 0) { mHwc->clearReleaseFences(hwcId); mHwc->clearReleaseFences(hwcId); } } Loading Loading
services/surfaceflinger/DisplayDevice.cpp +8 −0 Original line number Original line Diff line number Diff line Loading @@ -401,6 +401,14 @@ const Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { return mVisibleLayersSortedByZ; return mVisibleLayersSortedByZ; } } void DisplayDevice::setLayersNeedingFences(const Vector< sp<Layer> >& layers) { mLayersNeedingFences = layers; } const Vector< sp<Layer> >& DisplayDevice::getLayersNeedingFences() const { return mLayersNeedingFences; } Region DisplayDevice::getDirtyRegion(bool repaintEverything) const { Region DisplayDevice::getDirtyRegion(bool repaintEverything) const { Region dirty; Region dirty; if (repaintEverything) { if (repaintEverything) { Loading
services/surfaceflinger/DisplayDevice.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -124,6 +124,8 @@ public: void setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers); void setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers); const Vector< sp<Layer> >& getVisibleLayersSortedByZ() const; const Vector< sp<Layer> >& getVisibleLayersSortedByZ() const; void setLayersNeedingFences(const Vector< sp<Layer> >& layers); const Vector< sp<Layer> >& getLayersNeedingFences() const; Region getDirtyRegion(bool repaintEverything) const; Region getDirtyRegion(bool repaintEverything) const; void setLayerStack(uint32_t stack); void setLayerStack(uint32_t stack); Loading Loading @@ -241,6 +243,8 @@ private: // list of visible layers on that display // list of visible layers on that display Vector< sp<Layer> > mVisibleLayersSortedByZ; Vector< sp<Layer> > mVisibleLayersSortedByZ; // list of layers needing fences Vector< sp<Layer> > mLayersNeedingFences; /* /* * Transaction state * Transaction state Loading
services/surfaceflinger/Layer.cpp +4 −5 Original line number Original line Diff line number Diff line Loading @@ -217,9 +217,6 @@ Layer::~Layer() { #ifdef USE_HWC2 #ifdef USE_HWC2 void Layer::onLayerDisplayed(const sp<Fence>& releaseFence) { void Layer::onLayerDisplayed(const sp<Fence>& releaseFence) { if (mHwcLayers.empty()) { return; } mSurfaceFlingerConsumer->setReleaseFence(releaseFence); mSurfaceFlingerConsumer->setReleaseFence(releaseFence); } } #else #else Loading Loading @@ -395,9 +392,9 @@ bool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) { return true; return true; } } void Layer::destroyHwcLayer(int32_t hwcId) { bool Layer::destroyHwcLayer(int32_t hwcId) { if (mHwcLayers.count(hwcId) == 0) { if (mHwcLayers.count(hwcId) == 0) { return; return false; } } auto& hwcInfo = mHwcLayers[hwcId]; auto& hwcInfo = mHwcLayers[hwcId]; LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr, Loading @@ -408,6 +405,8 @@ void Layer::destroyHwcLayer(int32_t hwcId) { // mHwcLayers. Verify that. // mHwcLayers. Verify that. LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Stale layer entry in mHwcLayers"); "Stale layer entry in mHwcLayers"); return true; } } void Layer::destroyAllHwcLayers() { void Layer::destroyAllHwcLayers() { Loading
services/surfaceflinger/Layer.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -454,7 +454,7 @@ public: // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- bool createHwcLayer(HWComposer* hwc, int32_t hwcId); bool createHwcLayer(HWComposer* hwc, int32_t hwcId); void destroyHwcLayer(int32_t hwcId); bool destroyHwcLayer(int32_t hwcId); void destroyAllHwcLayers(); void destroyAllHwcLayers(); bool hasHwcLayer(int32_t hwcId) { bool hasHwcLayer(int32_t hwcId) { Loading
services/surfaceflinger/SurfaceFlinger.cpp +29 −2 Original line number Original line Diff line number Diff line Loading @@ -1782,6 +1782,7 @@ void SurfaceFlinger::rebuildLayerStacks() { Region opaqueRegion; Region opaqueRegion; Region dirtyRegion; Region dirtyRegion; Vector<sp<Layer>> layersSortedByZ; Vector<sp<Layer>> layersSortedByZ; Vector<sp<Layer>> layersNeedingFences; const sp<DisplayDevice>& displayDevice(mDisplays[dpy]); const sp<DisplayDevice>& displayDevice(mDisplays[dpy]); const Transform& tr(displayDevice->getTransform()); const Transform& tr(displayDevice->getTransform()); const Rect bounds(displayDevice->getBounds()); const Rect bounds(displayDevice->getBounds()); Loading @@ -1789,6 +1790,7 @@ void SurfaceFlinger::rebuildLayerStacks() { computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion); computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { mDrawingState.traverseInZOrder([&](Layer* layer) { bool hwcLayerDestroyed = false; if (layer->belongsToDisplay(displayDevice->getLayerStack(), if (layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary())) { displayDevice->isPrimary())) { Region drawRegion(tr.transform( Region drawRegion(tr.transform( Loading @@ -1799,18 +1801,32 @@ void SurfaceFlinger::rebuildLayerStacks() { } else { } else { // Clear out the HWC layer if this layer was // Clear out the HWC layer if this layer was // previously visible, but no longer is // previously visible, but no longer is layer->destroyHwcLayer( hwcLayerDestroyed = layer->destroyHwcLayer( displayDevice->getHwcDisplayId()); displayDevice->getHwcDisplayId()); } } } else { } else { // WM changes displayDevice->layerStack upon sleep/awake. // WM changes displayDevice->layerStack upon sleep/awake. // Here we make sure we delete the HWC layers even if // Here we make sure we delete the HWC layers even if // WM changed their layer stack. // WM changed their layer stack. layer->destroyHwcLayer(displayDevice->getHwcDisplayId()); hwcLayerDestroyed = layer->destroyHwcLayer( displayDevice->getHwcDisplayId()); } // If a layer is not going to get a release fence because // it is invisible, but it is also going to release its // old buffer, add it to the list of layers needing // fences. if (hwcLayerDestroyed) { auto found = std::find(mLayersWithQueuedFrames.cbegin(), mLayersWithQueuedFrames.cend(), layer); if (found != mLayersWithQueuedFrames.cend()) { layersNeedingFences.add(layer); } } } }); }); } } displayDevice->setVisibleLayersSortedByZ(layersSortedByZ); displayDevice->setVisibleLayersSortedByZ(layersSortedByZ); displayDevice->setLayersNeedingFences(layersNeedingFences); displayDevice->undefinedRegion.set(bounds); displayDevice->undefinedRegion.set(bounds); displayDevice->undefinedRegion.subtractSelf( displayDevice->undefinedRegion.subtractSelf( tr.transform(opaqueRegion)); tr.transform(opaqueRegion)); Loading Loading @@ -2050,6 +2066,17 @@ void SurfaceFlinger::postFramebuffer() layer->onLayerDisplayed(releaseFence); layer->onLayerDisplayed(releaseFence); } } // We've got a list of layers needing fences, that are disjoint with // displayDevice->getVisibleLayersSortedByZ. The best we can do is to // supply them with the present fence. if (!displayDevice->getLayersNeedingFences().isEmpty()) { sp<Fence> presentFence = mHwc->getPresentFence(hwcId); for (auto& layer : displayDevice->getLayersNeedingFences()) { layer->onLayerDisplayed(presentFence); } } if (hwcId >= 0) { if (hwcId >= 0) { mHwc->clearReleaseFences(hwcId); mHwc->clearReleaseFences(hwcId); } } Loading