diff options
| author | 2017-04-27 13:42:17 -0700 | |
|---|---|---|
| committer | 2017-05-02 13:34:34 -0700 | |
| commit | 412903fce3a93f411c85c54375a1851bfb370400 (patch) | |
| tree | e6f831161b9e544cc81c1f2c9cd7e771644f0e8c /services/surfaceflinger/SurfaceFlinger.cpp | |
| parent | 2041913a05b79b96c5c084f30bb8944049a976c8 (diff) | |
SurfaceFlinger: Select which layer state to visit
Modifies the traverseIn[Reverse]ZOrder methods to also take an enum
value specifying whether to traverse the current state or the drawing
state.
This has the effect of fixing a bug where we weren't performing
transactions on a child layer because its parent was only visiting its
drawing layers (rather than its current layers) and was thus skipping
the child, which had not yet been moved from current to drawing.
Bug: 36858924
Test: ChildLayerTest.Bug36858924 doesn't hang
Change-Id: I1959f40bc07e77864ba024511d429592a398a67a
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 9cd1214be6..bc4e6c5696 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -4195,7 +4195,7 @@ void SurfaceFlinger::renderScreenImplLocked( if (state.z < minLayerZ || state.z > maxLayerZ) { continue; } - layer->traverseInZOrder([&](Layer* layer) { + layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) { if (!layer->isVisible()) { return; } @@ -4243,7 +4243,7 @@ status_t SurfaceFlinger::captureScreenImplLocked( (state.z < minLayerZ || state.z > maxLayerZ)) { continue; } - layer->traverseInZOrder([&](Layer *layer) { + layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) { secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() && layer->isSecure()); }); @@ -4391,7 +4391,7 @@ void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* v const Layer::State& state(layer->getDrawingState()); if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ && state.z <= maxLayerZ) { - layer->traverseInZOrder([&](Layer* layer) { + layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) { ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%.3f", layer->isVisible() ? '+' : '-', i, layer->getName().string(), layer->getLayerStack(), state.z, @@ -4405,12 +4405,12 @@ void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* v // --------------------------------------------------------------------------- -void SurfaceFlinger::State::traverseInZOrder(const std::function<void(Layer*)>& consume) const { - layersSortedByZ.traverseInZOrder(consume); +void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const { + layersSortedByZ.traverseInZOrder(stateSet, visitor); } -void SurfaceFlinger::State::traverseInReverseZOrder(const std::function<void(Layer*)>& consume) const { - layersSortedByZ.traverseInReverseZOrder(consume); +void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const { + layersSortedByZ.traverseInReverseZOrder(stateSet, visitor); } }; // namespace android |