From 82c1cf3de20308110ae90a5315086de5c7a312d9 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Fri, 22 Jul 2022 13:25:41 +0300 Subject: [PATCH] backends/drm: Pass DrmGpu to page flip handler through user data The page flip handler can be simpler if it gets the gpu through user data. It also removes a usage of the Application singleton. --- src/backends/drm/drm_backend.cpp | 8 -------- src/backends/drm/drm_backend.h | 1 - src/backends/drm/drm_gpu.cpp | 13 +++---------- src/backends/drm/drm_pipeline.cpp | 5 +++-- src/backends/drm/drm_pipeline_legacy.cpp | 2 +- 5 files changed, 7 insertions(+), 22 deletions(-) diff --git a/src/backends/drm/drm_backend.cpp b/src/backends/drm/drm_backend.cpp index 03fc72cc02..e3944ec9b8 100644 --- a/src/backends/drm/drm_backend.cpp +++ b/src/backends/drm/drm_backend.cpp @@ -670,14 +670,6 @@ DrmGpu *DrmBackend::findGpu(dev_t deviceId) const return it == m_gpus.end() ? nullptr : it->get(); } -DrmGpu *DrmBackend::findGpuByFd(int fd) const -{ - auto it = std::find_if(m_gpus.begin(), m_gpus.end(), [fd](const auto &gpu) { - return gpu->fd() == fd; - }); - return it == m_gpus.end() ? nullptr : it->get(); -} - bool DrmBackend::applyOutputChanges(const OutputConfiguration &config) { QVector toBeEnabled; diff --git a/src/backends/drm/drm_backend.h b/src/backends/drm/drm_backend.h index f7c0ef7437..bb70010685 100644 --- a/src/backends/drm/drm_backend.h +++ b/src/backends/drm/drm_backend.h @@ -68,7 +68,6 @@ public: DrmGpu *primaryGpu() const; DrmGpu *findGpu(dev_t deviceId) const; - DrmGpu *findGpuByFd(int fd) const; bool isActive() const; diff --git a/src/backends/drm/drm_gpu.cpp b/src/backends/drm/drm_gpu.cpp index 1d946efcd1..ff28a99fc0 100644 --- a/src/backends/drm/drm_gpu.cpp +++ b/src/backends/drm/drm_gpu.cpp @@ -22,7 +22,6 @@ #include "egl_gbm_backend.h" #include "gbm_dmabuf.h" #include "logging.h" -#include "main.h" #include "renderloop_p.h" #include "session.h" #include "wayland/drmleasedevice_v1_interface.h" @@ -527,16 +526,10 @@ static std::chrono::nanoseconds convertTimestamp(clockid_t sourceClock, clockid_ void DrmGpu::pageFlipHandler(int fd, unsigned int sequence, unsigned int sec, unsigned int usec, unsigned int crtc_id, void *user_data) { + Q_UNUSED(fd) Q_UNUSED(sequence) - Q_UNUSED(user_data) - auto backend = dynamic_cast(kwinApp()->platform()); - if (!backend) { - return; - } - auto gpu = backend->findGpuByFd(fd); - if (!gpu) { - return; - } + + DrmGpu *gpu = static_cast(user_data); // The static_cast<> here are for a 32-bit environment where // sizeof(time_t) == sizeof(unsigned int) == 4 . Putting @p sec diff --git a/src/backends/drm/drm_pipeline.cpp b/src/backends/drm/drm_pipeline.cpp index 118dd19b38..8b08034d93 100644 --- a/src/backends/drm/drm_pipeline.cpp +++ b/src/backends/drm/drm_pipeline.cpp @@ -145,12 +145,13 @@ DrmPipeline::Error DrmPipeline::commitPipelinesAtomic(const QVectorgpu()->fd(), req, (flags & (~DRM_MODE_PAGE_FLIP_EVENT)) | DRM_MODE_ATOMIC_TEST_ONLY, nullptr) != 0) { + DrmGpu *gpu = pipelines[0]->gpu(); + if (drmModeAtomicCommit(gpu->fd(), req, (flags & (~DRM_MODE_PAGE_FLIP_EVENT)) | DRM_MODE_ATOMIC_TEST_ONLY, nullptr) != 0) { qCDebug(KWIN_DRM) << "Atomic test for" << mode << "failed!" << strerror(errno); failed(); return errnoToError(); } - if (mode != CommitMode::Test && drmModeAtomicCommit(pipelines[0]->gpu()->fd(), req, flags, nullptr) != 0) { + if (mode != CommitMode::Test && drmModeAtomicCommit(gpu->fd(), req, flags, gpu) != 0) { qCCritical(KWIN_DRM) << "Atomic commit failed! This should never happen!" << strerror(errno); failed(); return errnoToError(); diff --git a/src/backends/drm/drm_pipeline_legacy.cpp b/src/backends/drm/drm_pipeline_legacy.cpp index 3e4f54e9cf..9a8a03d2e5 100644 --- a/src/backends/drm/drm_pipeline_legacy.cpp +++ b/src/backends/drm/drm_pipeline_legacy.cpp @@ -30,7 +30,7 @@ DrmPipeline::Error DrmPipeline::presentLegacy() } } const auto buffer = m_pending.layer->currentBuffer(); - if (drmModePageFlip(gpu()->fd(), m_pending.crtc->id(), buffer->framebufferId(), DRM_MODE_PAGE_FLIP_EVENT, nullptr) != 0) { + if (drmModePageFlip(gpu()->fd(), m_pending.crtc->id(), buffer->framebufferId(), DRM_MODE_PAGE_FLIP_EVENT, gpu()) != 0) { qCWarning(KWIN_DRM) << "Page flip failed:" << strerror(errno); return errnoToError(); }