From b82840d7e04eabe26734bf7ee522949acf508b98 Mon Sep 17 00:00:00 2001 From: Aleix Pol Date: Mon, 19 Apr 2021 16:23:46 +0200 Subject: [PATCH] drm: Don't call virtual methods from a parent class destructor We'd be relying on AbstractEglDrmBackend on calling cleanup but we'd be doing it when cleanupSurfaces cannot be reached out anymore, turning it into a half-baked cleanup. Instead call cleanup from the leaf class destructors. --- src/plugins/platforms/drm/abstract_egl_drm_backend.cpp | 5 ----- src/plugins/platforms/drm/abstract_egl_drm_backend.h | 2 -- src/plugins/platforms/drm/egl_gbm_backend.cpp | 5 +++++ src/plugins/platforms/drm/egl_gbm_backend.h | 1 + src/plugins/platforms/drm/egl_stream_backend.cpp | 5 +++++ src/plugins/platforms/drm/egl_stream_backend.h | 1 + 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/plugins/platforms/drm/abstract_egl_drm_backend.cpp b/src/plugins/platforms/drm/abstract_egl_drm_backend.cpp index 3420ee912c..c9edfa4015 100644 --- a/src/plugins/platforms/drm/abstract_egl_drm_backend.cpp +++ b/src/plugins/platforms/drm/abstract_egl_drm_backend.cpp @@ -24,11 +24,6 @@ AbstractEglDrmBackend::AbstractEglDrmBackend(DrmBackend *drmBackend, DrmGpu *gpu connect(m_gpu, &DrmGpu::outputDisabled, this, &AbstractEglDrmBackend::removeOutput); } -AbstractEglDrmBackend::~AbstractEglDrmBackend() -{ - cleanup(); -} - void AbstractEglDrmBackend::screenGeometryChanged(const QSize &size) { Q_UNUSED(size) diff --git a/src/plugins/platforms/drm/abstract_egl_drm_backend.h b/src/plugins/platforms/drm/abstract_egl_drm_backend.h index 301dd0ef8c..0068e97a71 100644 --- a/src/plugins/platforms/drm/abstract_egl_drm_backend.h +++ b/src/plugins/platforms/drm/abstract_egl_drm_backend.h @@ -22,8 +22,6 @@ class DrmOutput; class AbstractEglDrmBackend : public AbstractEglBackend { public: - ~AbstractEglDrmBackend(); - void screenGeometryChanged(const QSize &size) override; virtual int screenCount() const = 0; diff --git a/src/plugins/platforms/drm/egl_gbm_backend.cpp b/src/plugins/platforms/drm/egl_gbm_backend.cpp index aaa775b673..534cbe2141 100644 --- a/src/plugins/platforms/drm/egl_gbm_backend.cpp +++ b/src/plugins/platforms/drm/egl_gbm_backend.cpp @@ -41,6 +41,11 @@ EglGbmBackend::EglGbmBackend(DrmBackend *drmBackend, DrmGpu *gpu) { } +EglGbmBackend::~EglGbmBackend() +{ + cleanup(); +} + void EglGbmBackend::cleanupSurfaces() { for (auto it = m_outputs.begin(); it != m_outputs.end(); ++it) { diff --git a/src/plugins/platforms/drm/egl_gbm_backend.h b/src/plugins/platforms/drm/egl_gbm_backend.h index cc5add77ca..0b815f8683 100644 --- a/src/plugins/platforms/drm/egl_gbm_backend.h +++ b/src/plugins/platforms/drm/egl_gbm_backend.h @@ -38,6 +38,7 @@ class EglGbmBackend : public AbstractEglDrmBackend Q_OBJECT public: EglGbmBackend(DrmBackend *drmBackend, DrmGpu *gpu); + ~EglGbmBackend() override; SceneOpenGLTexturePrivate *createBackendTexture(SceneOpenGLTexture *texture) override; QRegion beginFrame(int screenId) override; diff --git a/src/plugins/platforms/drm/egl_stream_backend.cpp b/src/plugins/platforms/drm/egl_stream_backend.cpp index a421cf9078..bca18e53eb 100644 --- a/src/plugins/platforms/drm/egl_stream_backend.cpp +++ b/src/plugins/platforms/drm/egl_stream_backend.cpp @@ -75,6 +75,11 @@ EglStreamBackend::EglStreamBackend(DrmBackend *drmBackend, DrmGpu *gpu) { } +EglStreamBackend::~EglStreamBackend() +{ + cleanup(); +} + void EglStreamBackend::cleanupSurfaces() { for (auto it = m_outputs.constBegin(); it != m_outputs.constEnd(); ++it) { diff --git a/src/plugins/platforms/drm/egl_stream_backend.h b/src/plugins/platforms/drm/egl_stream_backend.h index 6ceb1baf4e..714b1239ab 100644 --- a/src/plugins/platforms/drm/egl_stream_backend.h +++ b/src/plugins/platforms/drm/egl_stream_backend.h @@ -27,6 +27,7 @@ class EglStreamBackend : public AbstractEglDrmBackend Q_OBJECT public: EglStreamBackend(DrmBackend *b, DrmGpu *gpu); + ~EglStreamBackend() override; SceneOpenGLTexturePrivate *createBackendTexture(SceneOpenGLTexture *texture) override; QRegion beginFrame(int screenId) override; void endFrame(int screenId, const QRegion &damage, const QRegion &damagedRegion) override;