From 986f8b361ce9d6163f6ef691cad7b2955dcfe5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 8 Feb 2024 18:31:33 +0100 Subject: [PATCH] QRhiWidget: Register cleanup callback also on first RHI init The first time ensureRhi() is called we don't have an RHI yet, and will adopt the top level's repaint manager's RHI. We need to register a cleanup callback for this RHI, so that if it goes away, we will reset our RHI pointer to null, just like when we switch from one top level to another (and get a new potential RHI). Without the reset, we would be working with a stale QRhi pointer, which we in most cases updated via a call to ensureRhi(), that picked up the new QRhi, but for good measure we should reset it if we can. Pick-to: 6.7 Change-Id: Iac6d8787b636675bbcb4358e8f0baad26187b0e2 Reviewed-by: Laszlo Agocs --- src/widgets/kernel/qrhiwidget.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/widgets/kernel/qrhiwidget.cpp b/src/widgets/kernel/qrhiwidget.cpp index 56a230fcb72..6c1a8194757 100644 --- a/src/widgets/kernel/qrhiwidget.cpp +++ b/src/widgets/kernel/qrhiwidget.cpp @@ -491,19 +491,21 @@ void QRhiWidgetPrivate::ensureRhi() } // NB the rhi member may be an invalid object, the pointer can be used, but no deref - if (currentRhi && rhi && rhi != currentRhi) { - // if previously we created our own but now get a QRhi from the - // top-level, then drop what we have and start using the top-level's - if (rhi == offscreenRenderer.rhi()) { - q->releaseResources(); // notify the user code about the early-release - releaseResources(); - offscreenRenderer.reset(); - } else { - // rhi resources created by us all belong to the old rhi, drop them; - // due to nulling out colorTexture this is also what ensures that - // initialize() is going to be called again eventually - resetRenderTargetObjects(); - resetColorBufferObjects(); + if (currentRhi && rhi != currentRhi) { + if (rhi) { + // if previously we created our own but now get a QRhi from the + // top-level, then drop what we have and start using the top-level's + if (rhi == offscreenRenderer.rhi()) { + q->releaseResources(); // notify the user code about the early-release + releaseResources(); + offscreenRenderer.reset(); + } else { + // rhi resources created by us all belong to the old rhi, drop them; + // due to nulling out colorTexture this is also what ensures that + // initialize() is going to be called again eventually + resetRenderTargetObjects(); + resetColorBufferObjects(); + } } // Normally the widget gets destroyed before the QRhi (which is managed by