Loading services/surfaceflinger/DisplayDevice.h +1 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,7 @@ public: uint32_t getLayerStack() const { return mLayerStack; } int32_t getDisplayType() const { return mType; } bool isPrimary() const { return mType == DISPLAY_PRIMARY; } int32_t getHwcDisplayId() const { return mHwcDisplayId; } const wp<IBinder>& getDisplayToken() const { return mDisplayToken; } Loading services/surfaceflinger/Layer.h +8 −0 Original line number Diff line number Diff line Loading @@ -166,6 +166,8 @@ public: virtual ~Layer(); void setPrimaryDisplayOnly() { mPrimaryDisplayOnly = true; } // the this layer's size and format 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 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, bool useIdentityTransform) const; Rect computeBounds(const Region& activeTransparentRegion) const; Loading Loading @@ -701,6 +707,8 @@ private: String8 mTransactionName; // A cached version of "TX - " + mName for systraces PixelFormat mFormat; bool mPrimaryDisplayOnly = false; // these are protected by an external lock State mCurrentState; State mDrawingState; Loading services/surfaceflinger/SurfaceFlinger.cpp +20 −15 Original line number Diff line number Diff line Loading @@ -1684,12 +1684,11 @@ void SurfaceFlinger::rebuildLayerStacks() { const Transform& tr(displayDevice->getTransform()); const Rect bounds(displayDevice->getBounds()); if (displayDevice->isDisplayOn()) { computeVisibleRegions( displayDevice->getLayerStack(), dirtyRegion, opaqueRegion); computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { if (layer->getLayerStack() == displayDevice->getLayerStack()) { if (layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary())) { Region drawRegion(tr.transform( layer->visibleNonTransparentRegion)); drawRegion.andSelf(bounds); Loading Loading @@ -2211,7 +2210,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) disp.clear(); for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { sp<const DisplayDevice> hw(mDisplays[dpy]); if (hw->getLayerStack() == currentlayerStack) { if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) { if (disp == NULL) { disp = hw; } else { Loading Loading @@ -2260,7 +2259,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // TODO: we could cache the transformed region Region visibleReg; visibleReg.set(layer->computeScreenBounds()); invalidateLayerStack(layer->getLayerStack(), visibleReg); invalidateLayerStack(layer, visibleReg); } }); } Loading Loading @@ -2309,7 +2308,7 @@ void SurfaceFlinger::commitTransaction() mTransactionCV.broadcast(); } void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& outDirtyRegion, Region& outOpaqueRegion) { ATRACE_CALL(); Loading @@ -2326,7 +2325,7 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, const Layer::State& s(layer->getDrawingState()); // only consider the layers on the given layer stack if (layer->getLayerStack() != layerStack) if (!layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary())) return; /* Loading Loading @@ -2441,11 +2440,10 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, outOpaqueRegion = aboveOpaqueLayers; } void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, const Region& dirty) { void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { const sp<DisplayDevice>& hw(mDisplays[dpy]); if (hw->getLayerStack() == layerStack) { if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) { hw->dirtyRegion.orSelf(dirty); } } Loading Loading @@ -2486,7 +2484,7 @@ bool SurfaceFlinger::handlePageFlip() for (auto& layer : mLayersWithQueuedFrames) { const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); layer->useSurfaceDamage(); invalidateLayerStack(layer->getLayerStack(), dirty); invalidateLayerStack(layer, dirty); if (layer->isBufferLatched()) { newDataLatched = true; } Loading Loading @@ -3108,6 +3106,13 @@ status_t SurfaceFlinger::createLayer( 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); result = addClientLayer(client, *handle, *gbp, layer, *parent); Loading Loading @@ -4335,7 +4340,7 @@ void SurfaceFlinger::renderScreenImplLocked( // 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. for (const auto& layer : mDrawingState.layersSortedByZ) { if (layer->getLayerStack() != hw->getLayerStack()) { if (!layer->belongsToDisplay(hw->getLayerStack(), false)) { continue; } const Layer::State& state(layer->getDrawingState()); Loading Loading @@ -4387,7 +4392,7 @@ status_t SurfaceFlinger::captureScreenImplLocked(const sp<const DisplayDevice>& bool secureLayerIsVisible = false; for (const auto& layer : mDrawingState.layersSortedByZ) { const Layer::State& state(layer->getDrawingState()); if ((layer->getLayerStack() != hw->getLayerStack()) || if (layer->belongsToDisplay(hw->getLayerStack(), false) || (state.z < minLayerZ || state.z > maxLayerZ)) { continue; } Loading Loading @@ -4498,7 +4503,7 @@ void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* v size_t i = 0; for (const auto& layer : mDrawingState.layersSortedByZ) { 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) { layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) { 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 Diff line number Diff line Loading @@ -494,7 +494,7 @@ private: // mark a region of a layer stack dirty. this updates the dirty // 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 int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type); Loading @@ -510,7 +510,7 @@ private: * Compositing */ void invalidateHwcGeometry(); void computeVisibleRegions(uint32_t layerStack, void computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& dirtyRegion, Region& opaqueRegion); void preComposition(nsecs_t refreshStartTime); Loading services/surfaceflinger/SurfaceFlinger_hwc1.cpp +7 −8 Original line number Diff line number Diff line Loading @@ -1361,8 +1361,7 @@ void SurfaceFlinger::rebuildLayerStacks() { const Transform& tr(hw->getTransform()); const Rect bounds(hw->getBounds()); if (hw->isDisplayOn()) { computeVisibleRegions(hw->getLayerStack(), dirtyRegion, opaqueRegion); computeVisibleRegions(hw, dirtyRegion, opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { if (layer->getLayerStack() == hw->getLayerStack()) { Loading Loading @@ -1863,7 +1862,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // TODO: we could cache the transformed region Region visibleReg; visibleReg.set(layer->computeScreenBounds()); invalidateLayerStack(layer->getLayerStack(), visibleReg); invalidateLayerStack(layer, visibleReg); } }); } Loading Loading @@ -1924,7 +1923,7 @@ void SurfaceFlinger::commitTransaction() mTransactionCV.broadcast(); } void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& outDirtyRegion, Region& outOpaqueRegion) { ATRACE_CALL(); Loading @@ -1940,7 +1939,7 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, const Layer::State& s(layer->getDrawingState()); // only consider the layers on the given layer stack if (layer->getLayerStack() != layerStack) if (layer->getLayerStack() != displayDevice->getLayerStack()) return; /* Loading Loading @@ -2055,8 +2054,8 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, outOpaqueRegion = aboveOpaqueLayers; } void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, const Region& dirty) { void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) { uint32_t layerStack = layer->getLayerStack(); for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { const sp<DisplayDevice>& hw(mDisplays[dpy]); if (hw->getLayerStack() == layerStack) { Loading Loading @@ -2099,7 +2098,7 @@ bool SurfaceFlinger::handlePageFlip() Layer* layer = layersWithQueuedFrames[i]; const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); layer->useSurfaceDamage(); invalidateLayerStack(layer->getLayerStack(), dirty); invalidateLayerStack(layer, dirty); } mVisibleRegionsDirty |= visibleRegions; Loading Loading
services/surfaceflinger/DisplayDevice.h +1 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,7 @@ public: uint32_t getLayerStack() const { return mLayerStack; } int32_t getDisplayType() const { return mType; } bool isPrimary() const { return mType == DISPLAY_PRIMARY; } int32_t getHwcDisplayId() const { return mHwcDisplayId; } const wp<IBinder>& getDisplayToken() const { return mDisplayToken; } Loading
services/surfaceflinger/Layer.h +8 −0 Original line number Diff line number Diff line Loading @@ -166,6 +166,8 @@ public: virtual ~Layer(); void setPrimaryDisplayOnly() { mPrimaryDisplayOnly = true; } // the this layer's size and format 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 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, bool useIdentityTransform) const; Rect computeBounds(const Region& activeTransparentRegion) const; Loading Loading @@ -701,6 +707,8 @@ private: String8 mTransactionName; // A cached version of "TX - " + mName for systraces PixelFormat mFormat; bool mPrimaryDisplayOnly = false; // these are protected by an external lock State mCurrentState; State mDrawingState; Loading
services/surfaceflinger/SurfaceFlinger.cpp +20 −15 Original line number Diff line number Diff line Loading @@ -1684,12 +1684,11 @@ void SurfaceFlinger::rebuildLayerStacks() { const Transform& tr(displayDevice->getTransform()); const Rect bounds(displayDevice->getBounds()); if (displayDevice->isDisplayOn()) { computeVisibleRegions( displayDevice->getLayerStack(), dirtyRegion, opaqueRegion); computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { if (layer->getLayerStack() == displayDevice->getLayerStack()) { if (layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary())) { Region drawRegion(tr.transform( layer->visibleNonTransparentRegion)); drawRegion.andSelf(bounds); Loading Loading @@ -2211,7 +2210,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) disp.clear(); for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { sp<const DisplayDevice> hw(mDisplays[dpy]); if (hw->getLayerStack() == currentlayerStack) { if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) { if (disp == NULL) { disp = hw; } else { Loading Loading @@ -2260,7 +2259,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // TODO: we could cache the transformed region Region visibleReg; visibleReg.set(layer->computeScreenBounds()); invalidateLayerStack(layer->getLayerStack(), visibleReg); invalidateLayerStack(layer, visibleReg); } }); } Loading Loading @@ -2309,7 +2308,7 @@ void SurfaceFlinger::commitTransaction() mTransactionCV.broadcast(); } void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& outDirtyRegion, Region& outOpaqueRegion) { ATRACE_CALL(); Loading @@ -2326,7 +2325,7 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, const Layer::State& s(layer->getDrawingState()); // only consider the layers on the given layer stack if (layer->getLayerStack() != layerStack) if (!layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary())) return; /* Loading Loading @@ -2441,11 +2440,10 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, outOpaqueRegion = aboveOpaqueLayers; } void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, const Region& dirty) { void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { const sp<DisplayDevice>& hw(mDisplays[dpy]); if (hw->getLayerStack() == layerStack) { if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) { hw->dirtyRegion.orSelf(dirty); } } Loading Loading @@ -2486,7 +2484,7 @@ bool SurfaceFlinger::handlePageFlip() for (auto& layer : mLayersWithQueuedFrames) { const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); layer->useSurfaceDamage(); invalidateLayerStack(layer->getLayerStack(), dirty); invalidateLayerStack(layer, dirty); if (layer->isBufferLatched()) { newDataLatched = true; } Loading Loading @@ -3108,6 +3106,13 @@ status_t SurfaceFlinger::createLayer( 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); result = addClientLayer(client, *handle, *gbp, layer, *parent); Loading Loading @@ -4335,7 +4340,7 @@ void SurfaceFlinger::renderScreenImplLocked( // 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. for (const auto& layer : mDrawingState.layersSortedByZ) { if (layer->getLayerStack() != hw->getLayerStack()) { if (!layer->belongsToDisplay(hw->getLayerStack(), false)) { continue; } const Layer::State& state(layer->getDrawingState()); Loading Loading @@ -4387,7 +4392,7 @@ status_t SurfaceFlinger::captureScreenImplLocked(const sp<const DisplayDevice>& bool secureLayerIsVisible = false; for (const auto& layer : mDrawingState.layersSortedByZ) { const Layer::State& state(layer->getDrawingState()); if ((layer->getLayerStack() != hw->getLayerStack()) || if (layer->belongsToDisplay(hw->getLayerStack(), false) || (state.z < minLayerZ || state.z > maxLayerZ)) { continue; } Loading Loading @@ -4498,7 +4503,7 @@ void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* v size_t i = 0; for (const auto& layer : mDrawingState.layersSortedByZ) { 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) { layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) { 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 Diff line number Diff line Loading @@ -494,7 +494,7 @@ private: // mark a region of a layer stack dirty. this updates the dirty // 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 int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type); Loading @@ -510,7 +510,7 @@ private: * Compositing */ void invalidateHwcGeometry(); void computeVisibleRegions(uint32_t layerStack, void computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& dirtyRegion, Region& opaqueRegion); void preComposition(nsecs_t refreshStartTime); Loading
services/surfaceflinger/SurfaceFlinger_hwc1.cpp +7 −8 Original line number Diff line number Diff line Loading @@ -1361,8 +1361,7 @@ void SurfaceFlinger::rebuildLayerStacks() { const Transform& tr(hw->getTransform()); const Rect bounds(hw->getBounds()); if (hw->isDisplayOn()) { computeVisibleRegions(hw->getLayerStack(), dirtyRegion, opaqueRegion); computeVisibleRegions(hw, dirtyRegion, opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { if (layer->getLayerStack() == hw->getLayerStack()) { Loading Loading @@ -1863,7 +1862,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // TODO: we could cache the transformed region Region visibleReg; visibleReg.set(layer->computeScreenBounds()); invalidateLayerStack(layer->getLayerStack(), visibleReg); invalidateLayerStack(layer, visibleReg); } }); } Loading Loading @@ -1924,7 +1923,7 @@ void SurfaceFlinger::commitTransaction() mTransactionCV.broadcast(); } void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& outDirtyRegion, Region& outOpaqueRegion) { ATRACE_CALL(); Loading @@ -1940,7 +1939,7 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, const Layer::State& s(layer->getDrawingState()); // only consider the layers on the given layer stack if (layer->getLayerStack() != layerStack) if (layer->getLayerStack() != displayDevice->getLayerStack()) return; /* Loading Loading @@ -2055,8 +2054,8 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, outOpaqueRegion = aboveOpaqueLayers; } void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, const Region& dirty) { void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) { uint32_t layerStack = layer->getLayerStack(); for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { const sp<DisplayDevice>& hw(mDisplays[dpy]); if (hw->getLayerStack() == layerStack) { Loading Loading @@ -2099,7 +2098,7 @@ bool SurfaceFlinger::handlePageFlip() Layer* layer = layersWithQueuedFrames[i]; const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); layer->useSurfaceDamage(); invalidateLayerStack(layer->getLayerStack(), dirty); invalidateLayerStack(layer, dirty); } mVisibleRegionsDirty |= visibleRegions; Loading