From 79b7545840ab404c1fe9726cddc351686dc6ddf7 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Thu, 29 Feb 2024 16:46:05 +0200 Subject: [PATCH] backends/x11: Make SwapEventFilter report presentation feedback to OutputFrame --- .../x11/standalone/x11_standalone_glx_backend.cpp | 9 ++++----- src/backends/x11/standalone/x11_standalone_glx_backend.h | 6 ++++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/backends/x11/standalone/x11_standalone_glx_backend.cpp b/src/backends/x11/standalone/x11_standalone_glx_backend.cpp index ce2c2935d8..c73398af2b 100644 --- a/src/backends/x11/standalone/x11_standalone_glx_backend.cpp +++ b/src/backends/x11/standalone/x11_standalone_glx_backend.cpp @@ -74,8 +74,9 @@ typedef struct xcb_glx_buffer_swap_complete_event_t namespace KWin { -SwapEventFilter::SwapEventFilter(xcb_drawable_t drawable, xcb_glx_drawable_t glxDrawable) +SwapEventFilter::SwapEventFilter(GlxBackend *backend, xcb_drawable_t drawable, xcb_glx_drawable_t glxDrawable) : X11EventFilter(Xcb::Extensions::self()->glxEventBase() + XCB_GLX_BUFFER_SWAP_COMPLETE) + , m_backend(backend) , m_drawable(drawable) , m_glxDrawable(glxDrawable) { @@ -92,9 +93,7 @@ bool SwapEventFilter::event(xcb_generic_event_t *event) // The clock for the UST timestamp is left unspecified in the spec, however, usually, // it's CLOCK_MONOTONIC, so no special conversions are needed. const std::chrono::microseconds timestamp((uint64_t(swapEvent->ust_hi) << 32) | swapEvent->ust_lo); - - const auto platform = static_cast(kwinApp()->outputBackend()); - RenderLoopPrivate::get(platform->renderLoop())->notifyFrameCompleted(timestamp, Compositor::self()->backend()->primaryLayer(nullptr)->queryRenderTime()); + m_backend->vblank(timestamp); return true; } @@ -303,7 +302,7 @@ void GlxBackend::init() if (supportsSwapEvent && !forceSoftwareVsync) { // Nice, the GLX_INTEL_swap_event extension is available. We are going to receive // the presentation timestamp (UST) after glXSwapBuffers() via the X command stream. - m_swapEventFilter = std::make_unique(window, glxWindow); + m_swapEventFilter = std::make_unique(this, window, glxWindow); glXSelectEvent(display(), glxWindow, GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK); } else { // If the GLX_INTEL_swap_event extension is unavailble, we are going to wait for diff --git a/src/backends/x11/standalone/x11_standalone_glx_backend.h b/src/backends/x11/standalone/x11_standalone_glx_backend.h index f27e7100df..d2d5be1967 100644 --- a/src/backends/x11/standalone/x11_standalone_glx_backend.h +++ b/src/backends/x11/standalone/x11_standalone_glx_backend.h @@ -53,10 +53,11 @@ public: class SwapEventFilter : public X11EventFilter { public: - SwapEventFilter(xcb_drawable_t drawable, xcb_glx_drawable_t glxDrawable); + SwapEventFilter(GlxBackend *backend, xcb_drawable_t drawable, xcb_glx_drawable_t glxDrawable); bool event(xcb_generic_event_t *event) override; private: + GlxBackend *m_backend; xcb_drawable_t m_drawable; xcb_glx_drawable_t m_glxDrawable; }; @@ -100,8 +101,9 @@ public: return m_x11Display; } -private: void vblank(std::chrono::nanoseconds timestamp); + +private: void present(const QRegion &damage); bool initBuffer(); bool checkVersion();