diff options
author | Tor Arne Vestbø <[email protected]> | 2024-02-29 13:21:25 +0100 |
---|---|---|
committer | Tor Arne Vestbø <[email protected]> | 2024-03-01 20:41:30 +0100 |
commit | f451b01791536fede40c8d4fb90799c2e23e9386 (patch) | |
tree | 7e9e1b147060cc10024b1601d2edea5698292802 | |
parent | b571634172428263fa83ac733cf89e664bded014 (diff) |
Add QWidgetPrivate::rhi() helper method
For accessing the RHI managed by the widget compositing machinery.
Pick-to: 6.7 6.6 6.5
Change-Id: Ia3c1227cc2d9cfebe95611cad3dbcd7aa6f6f8c7
Reviewed-by: Axel Spoerl <[email protected]>
-rw-r--r-- | src/openglwidgets/qopenglwidget.cpp | 13 | ||||
-rw-r--r-- | src/widgets/kernel/qrhiwidget.cpp | 9 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 8 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget_p.h | 2 | ||||
-rw-r--r-- | tests/manual/rhi/rhiwidgetproto/rhiwidget.cpp | 9 |
5 files changed, 16 insertions, 25 deletions
diff --git a/src/openglwidgets/qopenglwidget.cpp b/src/openglwidgets/qopenglwidget.cpp index e4438d226de..a1b33fb5607 100644 --- a/src/openglwidgets/qopenglwidget.cpp +++ b/src/openglwidgets/qopenglwidget.cpp @@ -784,9 +784,7 @@ void QOpenGLWidgetPrivate::ensureRhiDependentResources() { Q_Q(QOpenGLWidget); - QRhi *rhi = nullptr; - if (QWidgetRepaintManager *repaintManager = QWidgetPrivate::get(q->window())->maybeRepaintManager()) - rhi = repaintManager->rhi(); + QRhi *rhi = QWidgetPrivate::rhi(); // If there is no rhi, because we are completely offscreen, then there's no wrapperTexture either if (rhi && rhi->backend() == QRhi::OpenGLES2) { @@ -832,7 +830,6 @@ void QOpenGLWidgetPrivate::initialize() // If no global shared context get our toplevel's context with which we // will share in order to make the texture usable by the underlying window's backingstore. QWidget *tlw = q->window(); - QWidgetPrivate *tlwd = get(tlw); // Do not include the sample count. Requesting a multisampled context is not necessary // since we render into an FBO, never to an actual surface. What's more, attempting to @@ -841,9 +838,7 @@ void QOpenGLWidgetPrivate::initialize() requestedSamples = requestedFormat.samples(); requestedFormat.setSamples(0); - QRhi *rhi = nullptr; - if (QWidgetRepaintManager *repaintManager = tlwd->maybeRepaintManager()) - rhi = repaintManager->rhi(); + QRhi *rhi = QWidgetPrivate::rhi(); // Could be that something else already initialized the window with some // other graphics API for the QRhi, that's not good. @@ -1718,8 +1713,8 @@ bool QOpenGLWidget::event(QEvent *e) if (!QCoreApplication::testAttribute(Qt::AA_ShareOpenGLContexts)) d->reset(); } - if (QWidgetRepaintManager *repaintManager = QWidgetPrivate::get(window())->maybeRepaintManager()) { - if (!d->initialized && !size().isEmpty() && repaintManager->rhi()) { + if (d->rhi()) { + if (!d->initialized && !size().isEmpty()) { d->initialize(); if (d->initialized) { d->recreateFbos(); diff --git a/src/widgets/kernel/qrhiwidget.cpp b/src/widgets/kernel/qrhiwidget.cpp index ca2d6b51a9e..bf562631134 100644 --- a/src/widgets/kernel/qrhiwidget.cpp +++ b/src/widgets/kernel/qrhiwidget.cpp @@ -475,14 +475,7 @@ void QRhiWidgetPrivate::releaseResources() void QRhiWidgetPrivate::ensureRhi() { Q_Q(QRhiWidget); - // the QRhi and infrastructure belongs to the top-level widget, not to this widget - QWidget *tlw = q->window(); - QWidgetPrivate *wd = get(tlw); - - QRhi *currentRhi = nullptr; - if (QWidgetRepaintManager *repaintManager = wd->maybeRepaintManager()) - currentRhi = repaintManager->rhi(); - + QRhi *currentRhi = QWidgetPrivate::rhi(); if (currentRhi && currentRhi->backend() != QBackingStoreRhiSupport::apiToRhiBackend(config.api())) { qWarning("The top-level window is already using another graphics API for composition, " "'%s' is not compatible with this widget", diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 812c737633e..81c6a6f7d83 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -1029,6 +1029,14 @@ void QWidgetPrivate::createRecursively() } } +QRhi *QWidgetPrivate::rhi() const +{ + if (QWidgetRepaintManager *repaintManager = maybeRepaintManager()) + return repaintManager->rhi(); + else + return nullptr; +} + /*! \internal Returns the closest parent widget that has a QWindow window handle diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index 48461f8c745..b677a7eccb5 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -221,6 +221,8 @@ public: void setSharedPainter(QPainter *painter); QWidgetRepaintManager *maybeRepaintManager() const; + QRhi *rhi() const; + enum class WindowHandleMode { Direct, Closest, diff --git a/tests/manual/rhi/rhiwidgetproto/rhiwidget.cpp b/tests/manual/rhi/rhiwidgetproto/rhiwidget.cpp index e801940c860..d535c655d0b 100644 --- a/tests/manual/rhi/rhiwidgetproto/rhiwidget.cpp +++ b/tests/manual/rhi/rhiwidgetproto/rhiwidget.cpp @@ -155,14 +155,7 @@ QPlatformBackingStoreRhiConfig QRhiWidgetPrivate::rhiConfig() const void QRhiWidgetPrivate::ensureRhi() { Q_Q(QRhiWidget); - // the QRhi and infrastructure belongs to the top-level widget, not to this widget - QWidget *tlw = q->window(); - QWidgetPrivate *wd = get(tlw); - - QRhi *currentRhi = nullptr; - if (QWidgetRepaintManager *repaintManager = wd->maybeRepaintManager()) - currentRhi = repaintManager->rhi(); - + QRhi *currentRhi = QWidgetPrivate::rhi(); if (currentRhi && currentRhi->backend() != QBackingStoreRhiSupport::apiToRhiBackend(config.api())) { qWarning("The top-level window is already using another graphics API for composition, " "'%s' is not compatible with this widget", |