summaryrefslogtreecommitdiff
path: root/src/protocols/core/Compositor.cpp
diff options
context:
space:
mode:
authorUjinT34 <41110182+UjinT34@users.noreply.github.com>2026-02-10 17:55:21 +0300
committerGitHub <noreply@github.com>2026-02-10 14:55:21 +0000
commitff061d177e86435a0d9f5605153a4567e2fcd88b (patch)
tree5c5fad1a485b2af162e3d3e11aecacaa8e03834f /src/protocols/core/Compositor.cpp
parent407a623801b8cb5b863e5056b2d5a195452776fa (diff)
protocols: commit and presentation timing fixes (#13174)
* move commit timing fields to surface state * fix toTimespec init * update sendQueued api * update onPresented api * set zero copy flag * send clock id * move presented calcs inside condition * use only CLOCK_MONOTONIC for commit/presentation timings * fix setSetTimestamp * do not wait for commit timing while tearing * proto config * fix config defaults
Diffstat (limited to 'src/protocols/core/Compositor.cpp')
-rw-r--r--src/protocols/core/Compositor.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/protocols/core/Compositor.cpp b/src/protocols/core/Compositor.cpp
index 2fd586a8..2aa72d97 100644
--- a/src/protocols/core/Compositor.cpp
+++ b/src/protocols/core/Compositor.cpp
@@ -626,6 +626,30 @@ bool CWLSurfaceResource::hasVisibleSubsurface() {
return false;
}
+bool CWLSurfaceResource::isTearing() {
+ if (m_enteredOutputs.empty() && m_hlSurface) {
+ for (auto& m : g_pCompositor->m_monitors) {
+ if (!m || !m->m_enabled)
+ continue;
+
+ auto box = m_hlSurface->getSurfaceBoxGlobal();
+ if (box && !box->intersection({m->m_position, m->m_size}).empty()) {
+ if (m->m_tearingState.activelyTearing)
+ return true;
+ }
+ }
+ } else {
+ for (auto& m : m_enteredOutputs) {
+ if (!m)
+ continue;
+
+ if (m->m_tearingState.activelyTearing)
+ return true;
+ }
+ }
+ return false;
+}
+
void CWLSurfaceResource::updateCursorShm(CRegion damage) {
if (damage.empty())
return;
@@ -670,8 +694,14 @@ void CWLSurfaceResource::presentFeedback(const Time::steady_tp& when, PHLMONITOR
FEEDBACK->attachMonitor(pMonitor);
if (discarded)
FEEDBACK->discarded();
- else
+ else {
FEEDBACK->presented();
+ if (!pMonitor->m_lastScanout.expired()) {
+ const auto WINDOW = m_hlSurface ? Desktop::View::CWindow::fromView(m_hlSurface->view()) : nullptr;
+ if (WINDOW == pMonitor->m_lastScanout)
+ FEEDBACK->setPresentationType(true);
+ }
+ }
PROTO::presentation->queueData(std::move(FEEDBACK));
}