diff options
| author | Tom Englund <tomenglund26@gmail.com> | 2024-10-28 19:02:52 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-28 18:02:52 +0000 |
| commit | c7315617eb6186912d03232e1968f32b88f153f2 (patch) | |
| tree | 7e22a153c332378439c72ebf4bb06f6069411527 /src | |
| parent | d49a1334a8af7c704626cdf1746cb72415ad6d0d (diff) | |
internal: few more marginal optimisations from profiling (#8271)
* deco: reduce local temporars and function calls
profiling shows this is a high used function, reduce the amount of
function calls and local temporar copies and also check if we even need
to add extents at all in the loop.
* popup: optimize bfhelper in popups
pass nodes as const reference and reserve the size of the children node
vector help reduce the reallocations.
* procotol: make compositor bfhelper use const ref
use const ref for nodes and reserve second nodes vector size to reduce
amount of reallocation needed.
Diffstat (limited to 'src')
| -rw-r--r-- | src/desktop/Popup.cpp | 3 | ||||
| -rw-r--r-- | src/desktop/Popup.hpp | 2 | ||||
| -rw-r--r-- | src/protocols/core/Compositor.cpp | 3 | ||||
| -rw-r--r-- | src/protocols/core/Compositor.hpp | 2 | ||||
| -rw-r--r-- | src/render/decorations/DecorationPositioner.cpp | 39 |
5 files changed, 29 insertions, 20 deletions
diff --git a/src/desktop/Popup.cpp b/src/desktop/Popup.cpp index 9e254fa6..58995f00 100644 --- a/src/desktop/Popup.cpp +++ b/src/desktop/Popup.cpp @@ -288,12 +288,13 @@ bool CPopup::visible() { return false; } -void CPopup::bfHelper(std::vector<CPopup*> nodes, std::function<void(CPopup*, void*)> fn, void* data) { +void CPopup::bfHelper(std::vector<CPopup*> const& nodes, std::function<void(CPopup*, void*)> fn, void* data) { for (auto const& n : nodes) { fn(n, data); } std::vector<CPopup*> nodes2; + nodes2.reserve(nodes.size() * 2); for (auto const& n : nodes) { for (auto const& c : n->m_vChildren) { diff --git a/src/desktop/Popup.hpp b/src/desktop/Popup.hpp index 04996612..f34b8a2c 100644 --- a/src/desktop/Popup.hpp +++ b/src/desktop/Popup.hpp @@ -81,5 +81,5 @@ class CPopup { Vector2D localToGlobal(const Vector2D& rel); Vector2D t1ParentCoords(); - static void bfHelper(std::vector<CPopup*> nodes, std::function<void(CPopup*, void*)> fn, void* data); + static void bfHelper(std::vector<CPopup*> const& nodes, std::function<void(CPopup*, void*)> fn, void* data); }; diff --git a/src/protocols/core/Compositor.cpp b/src/protocols/core/Compositor.cpp index 9a2e00a9..d78d3d8b 100644 --- a/src/protocols/core/Compositor.cpp +++ b/src/protocols/core/Compositor.cpp @@ -252,9 +252,10 @@ void CWLSurfaceResource::resetRole() { role = makeShared<CDefaultSurfaceRole>(); } -void CWLSurfaceResource::bfHelper(std::vector<SP<CWLSurfaceResource>> nodes, std::function<void(SP<CWLSurfaceResource>, const Vector2D&, void*)> fn, void* data) { +void CWLSurfaceResource::bfHelper(std::vector<SP<CWLSurfaceResource>> const& nodes, std::function<void(SP<CWLSurfaceResource>, const Vector2D&, void*)> fn, void* data) { std::vector<SP<CWLSurfaceResource>> nodes2; + nodes2.reserve(nodes.size() * 2); // first, gather all nodes below for (auto const& n : nodes) { diff --git a/src/protocols/core/Compositor.hpp b/src/protocols/core/Compositor.hpp index fbffd966..e5bdf082 100644 --- a/src/protocols/core/Compositor.hpp +++ b/src/protocols/core/Compositor.hpp @@ -147,7 +147,7 @@ class CWLSurfaceResource { void dropPendingBuffer(); void dropCurrentBuffer(); void commitPendingState(); - void bfHelper(std::vector<SP<CWLSurfaceResource>> nodes, std::function<void(SP<CWLSurfaceResource>, const Vector2D&, void*)> fn, void* data); + void bfHelper(std::vector<SP<CWLSurfaceResource>> const& nodes, std::function<void(SP<CWLSurfaceResource>, const Vector2D&, void*)> fn, void* data); void updateCursorShm(); friend class CWLPointerResource; diff --git a/src/render/decorations/DecorationPositioner.cpp b/src/render/decorations/DecorationPositioner.cpp index 3eb45546..995283c6 100644 --- a/src/render/decorations/DecorationPositioner.cpp +++ b/src/render/decorations/DecorationPositioner.cpp @@ -294,13 +294,11 @@ SBoxExtents CDecorationPositioner::getWindowDecorationReserved(PHLWINDOW pWindow } SBoxExtents CDecorationPositioner::getWindowDecorationExtents(PHLWINDOW pWindow, bool inputOnly) { - CBox accum = pWindow->getWindowMainSurfaceBox(); + CBox const mainSurfaceBox = pWindow->getWindowMainSurfaceBox(); + CBox accum = mainSurfaceBox; for (auto const& data : m_vWindowPositioningDatas) { - if (!data->pDecoration) - continue; - - if (!(data->pDecoration->getDecorationFlags() & DECORATION_ALLOWS_MOUSE_INPUT) && inputOnly) + if (!data->pDecoration || (inputOnly && !(data->pDecoration->getDecorationFlags() & DECORATION_ALLOWS_MOUSE_INPUT))) continue; auto const window = data->pWindow.lock(); @@ -308,31 +306,40 @@ SBoxExtents CDecorationPositioner::getWindowDecorationExtents(PHLWINDOW pWindow, continue; CBox decoBox; - if (data->positioningInfo.policy == DECORATION_POSITION_ABSOLUTE) { - decoBox = data->pWindow->getWindowMainSurfaceBox(); + decoBox = mainSurfaceBox; decoBox.addExtents(data->positioningInfo.desiredExtents); } else { - decoBox = data->lastReply.assignedGeometry; - const auto EDGEPOINT = getEdgeDefinedPoint(data->positioningInfo.edges, pWindow); - decoBox.translate(EDGEPOINT); + decoBox = data->lastReply.assignedGeometry; + decoBox.translate(getEdgeDefinedPoint(data->positioningInfo.edges, pWindow)); } + // Check bounds only if decoBox extends beyond accum SBoxExtents extentsToAdd; + bool needUpdate = false; - if (decoBox.x < accum.x) + if (decoBox.x < accum.x) { extentsToAdd.topLeft.x = accum.x - decoBox.x; - if (decoBox.y < accum.y) + needUpdate = true; + } + if (decoBox.y < accum.y) { extentsToAdd.topLeft.y = accum.y - decoBox.y; - if (decoBox.x + decoBox.w > accum.x + accum.w) + needUpdate = true; + } + if (decoBox.x + decoBox.w > accum.x + accum.w) { extentsToAdd.bottomRight.x = (decoBox.x + decoBox.w) - (accum.x + accum.w); - if (decoBox.y + decoBox.h > accum.y + accum.h) + needUpdate = true; + } + if (decoBox.y + decoBox.h > accum.y + accum.h) { extentsToAdd.bottomRight.y = (decoBox.y + decoBox.h) - (accum.y + accum.h); + needUpdate = true; + } - accum.addExtents(extentsToAdd); + if (needUpdate) + accum.addExtents(extentsToAdd); } - return accum.extentsFrom(pWindow->getWindowMainSurfaceBox()); + return accum.extentsFrom(mainSurfaceBox); } CBox CDecorationPositioner::getBoxWithIncludedDecos(PHLWINDOW pWindow) { |
