Loading services/surfaceflinger/DisplayDevice.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -141,6 +141,7 @@ public: uint32_t getLayerStack() const { return mLayerStack; } uint32_t getLayerStack() const { return mLayerStack; } int32_t getDisplayType() const { return mType; } int32_t getDisplayType() const { return mType; } bool isPrimary() const { return mType == DISPLAY_PRIMARY; } int32_t getHwcDisplayId() const { return mHwcDisplayId; } int32_t getHwcDisplayId() const { return mHwcDisplayId; } const wp<IBinder>& getDisplayToken() const { return mDisplayToken; } const wp<IBinder>& getDisplayToken() const { return mDisplayToken; } Loading services/surfaceflinger/Layer.h +8 −0 Original line number Original line Diff line number Diff line Loading @@ -166,6 +166,8 @@ public: virtual ~Layer(); virtual ~Layer(); void setPrimaryDisplayOnly() { mPrimaryDisplayOnly = true; } // the this layer's size and format // the this layer's size and format status_t setBuffers(uint32_t w, uint32_t h, PixelFormat format, uint32_t flags); status_t setBuffers(uint32_t w, uint32_t h, PixelFormat format, uint32_t flags); Loading Loading @@ -249,6 +251,10 @@ public: uint32_t getTransactionFlags(uint32_t flags); uint32_t getTransactionFlags(uint32_t flags); uint32_t setTransactionFlags(uint32_t flags); uint32_t setTransactionFlags(uint32_t flags); bool belongsToDisplay(uint32_t layerStack, bool isPrimaryDisplay) const { return getLayerStack() == layerStack && (!mPrimaryDisplayOnly || isPrimaryDisplay); } void computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, void computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, bool useIdentityTransform) const; bool useIdentityTransform) const; Rect computeBounds(const Region& activeTransparentRegion) const; Rect computeBounds(const Region& activeTransparentRegion) const; Loading Loading @@ -701,6 +707,8 @@ private: String8 mTransactionName; // A cached version of "TX - " + mName for systraces String8 mTransactionName; // A cached version of "TX - " + mName for systraces PixelFormat mFormat; PixelFormat mFormat; bool mPrimaryDisplayOnly = false; // these are protected by an external lock // these are protected by an external lock State mCurrentState; State mCurrentState; State mDrawingState; State mDrawingState; Loading services/surfaceflinger/SurfaceFlinger.cpp +20 −15 Original line number Original line Diff line number Diff line Loading @@ -1683,12 +1683,11 @@ void SurfaceFlinger::rebuildLayerStacks() { const Transform& tr(displayDevice->getTransform()); const Transform& tr(displayDevice->getTransform()); const Rect bounds(displayDevice->getBounds()); const Rect bounds(displayDevice->getBounds()); if (displayDevice->isDisplayOn()) { if (displayDevice->isDisplayOn()) { computeVisibleRegions( computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion); displayDevice->getLayerStack(), dirtyRegion, opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { mDrawingState.traverseInZOrder([&](Layer* layer) { if (layer->getLayerStack() == displayDevice->getLayerStack()) { if (layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary())) { Region drawRegion(tr.transform( Region drawRegion(tr.transform( layer->visibleNonTransparentRegion)); layer->visibleNonTransparentRegion)); drawRegion.andSelf(bounds); drawRegion.andSelf(bounds); Loading Loading @@ -2210,7 +2209,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) disp.clear(); disp.clear(); for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { sp<const DisplayDevice> hw(mDisplays[dpy]); sp<const DisplayDevice> hw(mDisplays[dpy]); if (hw->getLayerStack() == currentlayerStack) { if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) { if (disp == NULL) { if (disp == NULL) { disp = hw; disp = hw; } else { } else { Loading Loading @@ -2259,7 +2258,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // TODO: we could cache the transformed region // TODO: we could cache the transformed region Region visibleReg; Region visibleReg; visibleReg.set(layer->computeScreenBounds()); visibleReg.set(layer->computeScreenBounds()); invalidateLayerStack(layer->getLayerStack(), visibleReg); invalidateLayerStack(layer, visibleReg); } } }); }); } } Loading Loading @@ -2308,7 +2307,7 @@ void SurfaceFlinger::commitTransaction() mTransactionCV.broadcast(); mTransactionCV.broadcast(); } } void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& outDirtyRegion, Region& outOpaqueRegion) Region& outDirtyRegion, Region& outOpaqueRegion) { { ATRACE_CALL(); ATRACE_CALL(); Loading @@ -2325,7 +2324,7 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, const Layer::State& s(layer->getDrawingState()); const Layer::State& s(layer->getDrawingState()); // only consider the layers on the given layer stack // only consider the layers on the given layer stack if (layer->getLayerStack() != layerStack) if (!layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary())) return; return; /* /* Loading Loading @@ -2440,11 +2439,10 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, outOpaqueRegion = aboveOpaqueLayers; outOpaqueRegion = aboveOpaqueLayers; } } void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) { const Region& dirty) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { const sp<DisplayDevice>& hw(mDisplays[dpy]); const sp<DisplayDevice>& hw(mDisplays[dpy]); if (hw->getLayerStack() == layerStack) { if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) { hw->dirtyRegion.orSelf(dirty); hw->dirtyRegion.orSelf(dirty); } } } } Loading Loading @@ -2485,7 +2483,7 @@ bool SurfaceFlinger::handlePageFlip() for (auto& layer : mLayersWithQueuedFrames) { for (auto& layer : mLayersWithQueuedFrames) { const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); layer->useSurfaceDamage(); layer->useSurfaceDamage(); invalidateLayerStack(layer->getLayerStack(), dirty); invalidateLayerStack(layer, dirty); if (layer->isBufferLatched()) { if (layer->isBufferLatched()) { newDataLatched = true; newDataLatched = true; } } Loading Loading @@ -3110,6 +3108,13 @@ status_t SurfaceFlinger::createLayer( return result; return result; } } // window type is WINDOW_TYPE_DONT_SCREENSHOT from SurfaceControl.java // TODO b/64227542 if (windowType == 441731) { windowType = 2024; // TYPE_NAVIGATION_BAR_PANEL layer->setPrimaryDisplayOnly(); } layer->setInfo(windowType, ownerUid); layer->setInfo(windowType, ownerUid); result = addClientLayer(client, *handle, *gbp, layer, *parent); result = addClientLayer(client, *handle, *gbp, layer, *parent); Loading Loading @@ -4337,7 +4342,7 @@ void SurfaceFlinger::renderScreenImplLocked( // We loop through the first level of layers without traversing, // We loop through the first level of layers without traversing, // as we need to interpret min/max layer Z in the top level Z space. // as we need to interpret min/max layer Z in the top level Z space. for (const auto& layer : mDrawingState.layersSortedByZ) { for (const auto& layer : mDrawingState.layersSortedByZ) { if (layer->getLayerStack() != hw->getLayerStack()) { if (!layer->belongsToDisplay(hw->getLayerStack(), false)) { continue; continue; } } const Layer::State& state(layer->getDrawingState()); const Layer::State& state(layer->getDrawingState()); Loading Loading @@ -4389,7 +4394,7 @@ status_t SurfaceFlinger::captureScreenImplLocked(const sp<const DisplayDevice>& bool secureLayerIsVisible = false; bool secureLayerIsVisible = false; for (const auto& layer : mDrawingState.layersSortedByZ) { for (const auto& layer : mDrawingState.layersSortedByZ) { const Layer::State& state(layer->getDrawingState()); const Layer::State& state(layer->getDrawingState()); if ((layer->getLayerStack() != hw->getLayerStack()) || if (layer->belongsToDisplay(hw->getLayerStack(), false) || (state.z < minLayerZ || state.z > maxLayerZ)) { (state.z < minLayerZ || state.z > maxLayerZ)) { continue; continue; } } Loading Loading @@ -4500,7 +4505,7 @@ void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* v size_t i = 0; size_t i = 0; for (const auto& layer : mDrawingState.layersSortedByZ) { for (const auto& layer : mDrawingState.layersSortedByZ) { const Layer::State& state(layer->getDrawingState()); const Layer::State& state(layer->getDrawingState()); if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ && if (layer->belongsToDisplay(hw->getLayerStack(), false) && state.z >= minLayerZ && state.z <= maxLayerZ) { state.z <= maxLayerZ) { layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](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", ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%.3f", Loading services/surfaceflinger/SurfaceFlinger.h +2 −2 Original line number Original line Diff line number Diff line Loading @@ -494,7 +494,7 @@ private: // mark a region of a layer stack dirty. this updates the dirty // mark a region of a layer stack dirty. this updates the dirty // region of all screens presenting this layer stack. // region of all screens presenting this layer stack. void invalidateLayerStack(uint32_t layerStack, const Region& dirty); void invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty); #ifndef USE_HWC2 #ifndef USE_HWC2 int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type); int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type); Loading @@ -510,7 +510,7 @@ private: * Compositing * Compositing */ */ void invalidateHwcGeometry(); void invalidateHwcGeometry(); void computeVisibleRegions(uint32_t layerStack, void computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& dirtyRegion, Region& opaqueRegion); Region& dirtyRegion, Region& opaqueRegion); void preComposition(nsecs_t refreshStartTime); void preComposition(nsecs_t refreshStartTime); Loading services/surfaceflinger/SurfaceFlinger_hwc1.cpp +7 −8 Original line number Original line Diff line number Diff line Loading @@ -1361,8 +1361,7 @@ void SurfaceFlinger::rebuildLayerStacks() { const Transform& tr(hw->getTransform()); const Transform& tr(hw->getTransform()); const Rect bounds(hw->getBounds()); const Rect bounds(hw->getBounds()); if (hw->isDisplayOn()) { if (hw->isDisplayOn()) { computeVisibleRegions(hw->getLayerStack(), dirtyRegion, computeVisibleRegions(hw, dirtyRegion, opaqueRegion); opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { mDrawingState.traverseInZOrder([&](Layer* layer) { if (layer->getLayerStack() == hw->getLayerStack()) { if (layer->getLayerStack() == hw->getLayerStack()) { Loading Loading @@ -1863,7 +1862,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // TODO: we could cache the transformed region // TODO: we could cache the transformed region Region visibleReg; Region visibleReg; visibleReg.set(layer->computeScreenBounds()); visibleReg.set(layer->computeScreenBounds()); invalidateLayerStack(layer->getLayerStack(), visibleReg); invalidateLayerStack(layer, visibleReg); } } }); }); } } Loading Loading @@ -1924,7 +1923,7 @@ void SurfaceFlinger::commitTransaction() mTransactionCV.broadcast(); mTransactionCV.broadcast(); } } void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& outDirtyRegion, Region& outOpaqueRegion) Region& outDirtyRegion, Region& outOpaqueRegion) { { ATRACE_CALL(); ATRACE_CALL(); Loading @@ -1940,7 +1939,7 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, const Layer::State& s(layer->getDrawingState()); const Layer::State& s(layer->getDrawingState()); // only consider the layers on the given layer stack // only consider the layers on the given layer stack if (layer->getLayerStack() != layerStack) if (layer->getLayerStack() != displayDevice->getLayerStack()) return; return; /* /* Loading Loading @@ -2055,8 +2054,8 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, outOpaqueRegion = aboveOpaqueLayers; outOpaqueRegion = aboveOpaqueLayers; } } void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) { const Region& dirty) { uint32_t layerStack = layer->getLayerStack(); for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { const sp<DisplayDevice>& hw(mDisplays[dpy]); const sp<DisplayDevice>& hw(mDisplays[dpy]); if (hw->getLayerStack() == layerStack) { if (hw->getLayerStack() == layerStack) { Loading Loading @@ -2099,7 +2098,7 @@ bool SurfaceFlinger::handlePageFlip() Layer* layer = layersWithQueuedFrames[i]; Layer* layer = layersWithQueuedFrames[i]; const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); layer->useSurfaceDamage(); layer->useSurfaceDamage(); invalidateLayerStack(layer->getLayerStack(), dirty); invalidateLayerStack(layer, dirty); } } mVisibleRegionsDirty |= visibleRegions; mVisibleRegionsDirty |= visibleRegions; Loading Loading
services/surfaceflinger/DisplayDevice.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -141,6 +141,7 @@ public: uint32_t getLayerStack() const { return mLayerStack; } uint32_t getLayerStack() const { return mLayerStack; } int32_t getDisplayType() const { return mType; } int32_t getDisplayType() const { return mType; } bool isPrimary() const { return mType == DISPLAY_PRIMARY; } int32_t getHwcDisplayId() const { return mHwcDisplayId; } int32_t getHwcDisplayId() const { return mHwcDisplayId; } const wp<IBinder>& getDisplayToken() const { return mDisplayToken; } const wp<IBinder>& getDisplayToken() const { return mDisplayToken; } Loading
services/surfaceflinger/Layer.h +8 −0 Original line number Original line Diff line number Diff line Loading @@ -166,6 +166,8 @@ public: virtual ~Layer(); virtual ~Layer(); void setPrimaryDisplayOnly() { mPrimaryDisplayOnly = true; } // the this layer's size and format // the this layer's size and format status_t setBuffers(uint32_t w, uint32_t h, PixelFormat format, uint32_t flags); status_t setBuffers(uint32_t w, uint32_t h, PixelFormat format, uint32_t flags); Loading Loading @@ -249,6 +251,10 @@ public: uint32_t getTransactionFlags(uint32_t flags); uint32_t getTransactionFlags(uint32_t flags); uint32_t setTransactionFlags(uint32_t flags); uint32_t setTransactionFlags(uint32_t flags); bool belongsToDisplay(uint32_t layerStack, bool isPrimaryDisplay) const { return getLayerStack() == layerStack && (!mPrimaryDisplayOnly || isPrimaryDisplay); } void computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, void computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, bool useIdentityTransform) const; bool useIdentityTransform) const; Rect computeBounds(const Region& activeTransparentRegion) const; Rect computeBounds(const Region& activeTransparentRegion) const; Loading Loading @@ -701,6 +707,8 @@ private: String8 mTransactionName; // A cached version of "TX - " + mName for systraces String8 mTransactionName; // A cached version of "TX - " + mName for systraces PixelFormat mFormat; PixelFormat mFormat; bool mPrimaryDisplayOnly = false; // these are protected by an external lock // these are protected by an external lock State mCurrentState; State mCurrentState; State mDrawingState; State mDrawingState; Loading
services/surfaceflinger/SurfaceFlinger.cpp +20 −15 Original line number Original line Diff line number Diff line Loading @@ -1683,12 +1683,11 @@ void SurfaceFlinger::rebuildLayerStacks() { const Transform& tr(displayDevice->getTransform()); const Transform& tr(displayDevice->getTransform()); const Rect bounds(displayDevice->getBounds()); const Rect bounds(displayDevice->getBounds()); if (displayDevice->isDisplayOn()) { if (displayDevice->isDisplayOn()) { computeVisibleRegions( computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion); displayDevice->getLayerStack(), dirtyRegion, opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { mDrawingState.traverseInZOrder([&](Layer* layer) { if (layer->getLayerStack() == displayDevice->getLayerStack()) { if (layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary())) { Region drawRegion(tr.transform( Region drawRegion(tr.transform( layer->visibleNonTransparentRegion)); layer->visibleNonTransparentRegion)); drawRegion.andSelf(bounds); drawRegion.andSelf(bounds); Loading Loading @@ -2210,7 +2209,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) disp.clear(); disp.clear(); for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { sp<const DisplayDevice> hw(mDisplays[dpy]); sp<const DisplayDevice> hw(mDisplays[dpy]); if (hw->getLayerStack() == currentlayerStack) { if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) { if (disp == NULL) { if (disp == NULL) { disp = hw; disp = hw; } else { } else { Loading Loading @@ -2259,7 +2258,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // TODO: we could cache the transformed region // TODO: we could cache the transformed region Region visibleReg; Region visibleReg; visibleReg.set(layer->computeScreenBounds()); visibleReg.set(layer->computeScreenBounds()); invalidateLayerStack(layer->getLayerStack(), visibleReg); invalidateLayerStack(layer, visibleReg); } } }); }); } } Loading Loading @@ -2308,7 +2307,7 @@ void SurfaceFlinger::commitTransaction() mTransactionCV.broadcast(); mTransactionCV.broadcast(); } } void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& outDirtyRegion, Region& outOpaqueRegion) Region& outDirtyRegion, Region& outOpaqueRegion) { { ATRACE_CALL(); ATRACE_CALL(); Loading @@ -2325,7 +2324,7 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, const Layer::State& s(layer->getDrawingState()); const Layer::State& s(layer->getDrawingState()); // only consider the layers on the given layer stack // only consider the layers on the given layer stack if (layer->getLayerStack() != layerStack) if (!layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary())) return; return; /* /* Loading Loading @@ -2440,11 +2439,10 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, outOpaqueRegion = aboveOpaqueLayers; outOpaqueRegion = aboveOpaqueLayers; } } void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) { const Region& dirty) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { const sp<DisplayDevice>& hw(mDisplays[dpy]); const sp<DisplayDevice>& hw(mDisplays[dpy]); if (hw->getLayerStack() == layerStack) { if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) { hw->dirtyRegion.orSelf(dirty); hw->dirtyRegion.orSelf(dirty); } } } } Loading Loading @@ -2485,7 +2483,7 @@ bool SurfaceFlinger::handlePageFlip() for (auto& layer : mLayersWithQueuedFrames) { for (auto& layer : mLayersWithQueuedFrames) { const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); layer->useSurfaceDamage(); layer->useSurfaceDamage(); invalidateLayerStack(layer->getLayerStack(), dirty); invalidateLayerStack(layer, dirty); if (layer->isBufferLatched()) { if (layer->isBufferLatched()) { newDataLatched = true; newDataLatched = true; } } Loading Loading @@ -3110,6 +3108,13 @@ status_t SurfaceFlinger::createLayer( return result; return result; } } // window type is WINDOW_TYPE_DONT_SCREENSHOT from SurfaceControl.java // TODO b/64227542 if (windowType == 441731) { windowType = 2024; // TYPE_NAVIGATION_BAR_PANEL layer->setPrimaryDisplayOnly(); } layer->setInfo(windowType, ownerUid); layer->setInfo(windowType, ownerUid); result = addClientLayer(client, *handle, *gbp, layer, *parent); result = addClientLayer(client, *handle, *gbp, layer, *parent); Loading Loading @@ -4337,7 +4342,7 @@ void SurfaceFlinger::renderScreenImplLocked( // We loop through the first level of layers without traversing, // We loop through the first level of layers without traversing, // as we need to interpret min/max layer Z in the top level Z space. // as we need to interpret min/max layer Z in the top level Z space. for (const auto& layer : mDrawingState.layersSortedByZ) { for (const auto& layer : mDrawingState.layersSortedByZ) { if (layer->getLayerStack() != hw->getLayerStack()) { if (!layer->belongsToDisplay(hw->getLayerStack(), false)) { continue; continue; } } const Layer::State& state(layer->getDrawingState()); const Layer::State& state(layer->getDrawingState()); Loading Loading @@ -4389,7 +4394,7 @@ status_t SurfaceFlinger::captureScreenImplLocked(const sp<const DisplayDevice>& bool secureLayerIsVisible = false; bool secureLayerIsVisible = false; for (const auto& layer : mDrawingState.layersSortedByZ) { for (const auto& layer : mDrawingState.layersSortedByZ) { const Layer::State& state(layer->getDrawingState()); const Layer::State& state(layer->getDrawingState()); if ((layer->getLayerStack() != hw->getLayerStack()) || if (layer->belongsToDisplay(hw->getLayerStack(), false) || (state.z < minLayerZ || state.z > maxLayerZ)) { (state.z < minLayerZ || state.z > maxLayerZ)) { continue; continue; } } Loading Loading @@ -4500,7 +4505,7 @@ void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* v size_t i = 0; size_t i = 0; for (const auto& layer : mDrawingState.layersSortedByZ) { for (const auto& layer : mDrawingState.layersSortedByZ) { const Layer::State& state(layer->getDrawingState()); const Layer::State& state(layer->getDrawingState()); if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ && if (layer->belongsToDisplay(hw->getLayerStack(), false) && state.z >= minLayerZ && state.z <= maxLayerZ) { state.z <= maxLayerZ) { layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](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", ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%.3f", Loading
services/surfaceflinger/SurfaceFlinger.h +2 −2 Original line number Original line Diff line number Diff line Loading @@ -494,7 +494,7 @@ private: // mark a region of a layer stack dirty. this updates the dirty // mark a region of a layer stack dirty. this updates the dirty // region of all screens presenting this layer stack. // region of all screens presenting this layer stack. void invalidateLayerStack(uint32_t layerStack, const Region& dirty); void invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty); #ifndef USE_HWC2 #ifndef USE_HWC2 int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type); int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type); Loading @@ -510,7 +510,7 @@ private: * Compositing * Compositing */ */ void invalidateHwcGeometry(); void invalidateHwcGeometry(); void computeVisibleRegions(uint32_t layerStack, void computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& dirtyRegion, Region& opaqueRegion); Region& dirtyRegion, Region& opaqueRegion); void preComposition(nsecs_t refreshStartTime); void preComposition(nsecs_t refreshStartTime); Loading
services/surfaceflinger/SurfaceFlinger_hwc1.cpp +7 −8 Original line number Original line Diff line number Diff line Loading @@ -1361,8 +1361,7 @@ void SurfaceFlinger::rebuildLayerStacks() { const Transform& tr(hw->getTransform()); const Transform& tr(hw->getTransform()); const Rect bounds(hw->getBounds()); const Rect bounds(hw->getBounds()); if (hw->isDisplayOn()) { if (hw->isDisplayOn()) { computeVisibleRegions(hw->getLayerStack(), dirtyRegion, computeVisibleRegions(hw, dirtyRegion, opaqueRegion); opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { mDrawingState.traverseInZOrder([&](Layer* layer) { if (layer->getLayerStack() == hw->getLayerStack()) { if (layer->getLayerStack() == hw->getLayerStack()) { Loading Loading @@ -1863,7 +1862,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // TODO: we could cache the transformed region // TODO: we could cache the transformed region Region visibleReg; Region visibleReg; visibleReg.set(layer->computeScreenBounds()); visibleReg.set(layer->computeScreenBounds()); invalidateLayerStack(layer->getLayerStack(), visibleReg); invalidateLayerStack(layer, visibleReg); } } }); }); } } Loading Loading @@ -1924,7 +1923,7 @@ void SurfaceFlinger::commitTransaction() mTransactionCV.broadcast(); mTransactionCV.broadcast(); } } void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& outDirtyRegion, Region& outOpaqueRegion) Region& outDirtyRegion, Region& outOpaqueRegion) { { ATRACE_CALL(); ATRACE_CALL(); Loading @@ -1940,7 +1939,7 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, const Layer::State& s(layer->getDrawingState()); const Layer::State& s(layer->getDrawingState()); // only consider the layers on the given layer stack // only consider the layers on the given layer stack if (layer->getLayerStack() != layerStack) if (layer->getLayerStack() != displayDevice->getLayerStack()) return; return; /* /* Loading Loading @@ -2055,8 +2054,8 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, outOpaqueRegion = aboveOpaqueLayers; outOpaqueRegion = aboveOpaqueLayers; } } void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) { const Region& dirty) { uint32_t layerStack = layer->getLayerStack(); for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { const sp<DisplayDevice>& hw(mDisplays[dpy]); const sp<DisplayDevice>& hw(mDisplays[dpy]); if (hw->getLayerStack() == layerStack) { if (hw->getLayerStack() == layerStack) { Loading Loading @@ -2099,7 +2098,7 @@ bool SurfaceFlinger::handlePageFlip() Layer* layer = layersWithQueuedFrames[i]; Layer* layer = layersWithQueuedFrames[i]; const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); layer->useSurfaceDamage(); layer->useSurfaceDamage(); invalidateLayerStack(layer->getLayerStack(), dirty); invalidateLayerStack(layer, dirty); } } mVisibleRegionsDirty |= visibleRegions; mVisibleRegionsDirty |= visibleRegions; Loading