diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2023-05-12 14:52:28 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2023-06-01 12:02:26 +0200 |
commit | 8c0b657c9a119cf60d96d36351ccf553e21ff3fc (patch) | |
tree | 30958de99b825511cbc90405b5e2640b2ce067de /tests | |
parent | da4de6b6e361879993f834ed4c157d5bdba2c050 (diff) |
Refine the rhi-based flush logic
Amends 244daf4cfc44587c8c7c87e481688e840cc21c77
Fixes: QTBUG-113557
Fixes: QTBUG-113652
Task-number: QTBUG-108277
Pick-to: 6.5
Change-Id: I9e369b0e1261ea37eb2dedd80083f82f5df97b30
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp | 60 |
1 files changed, 55 insertions, 5 deletions
diff --git a/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp b/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp index d4d5d9d583..bd0b62f3dd 100644 --- a/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp +++ b/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp @@ -573,6 +573,21 @@ void tst_QOpenGLWidget::showHide() QVERIFY(image.pixel(30, 40) == qRgb(0, 0, 255)); } +QtMessageHandler oldHandler = nullptr; + +void nativeWindowMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) +{ + if (oldHandler) + oldHandler(type, context, msg); + + if (type == QtWarningMsg + && (msg.contains("QOpenGLContext::makeCurrent() called with non-opengl surface") + || msg.contains("Failed to make context current"))) + { + QFAIL("Unexpected warning got printed"); + } +} + void tst_QOpenGLWidget::nativeWindow() { #ifdef Q_OS_ANDROID @@ -584,6 +599,10 @@ void tst_QOpenGLWidget::nativeWindow() // presented correctly as we can only do verification with // grabFramebuffer() here which only exercises a part of the pipeline. + // Install a message handler that looks for some typical warnings from + // QRhi/QOpenGLConext that occur when the RHI-related logic in widgets goes wrong. + oldHandler = qInstallMessageHandler(nativeWindowMessageHandler); + { QScopedPointer<ClearWidget> w(new ClearWidget(nullptr, 800, 600)); w->resize(800, 600); @@ -599,7 +618,33 @@ void tst_QOpenGLWidget::nativeWindow() QVERIFY(w->internalWinId()); } - // Now as a native child + // QTBUG-113557: a plain _raster_ QWidget that is a _native_ child in a toplevel + // combined with a RHI-based (non-native) widget (QOpenGLWidget in this case) + // in the same toplevel. + { + QWidget topLevel; + topLevel.resize(800, 600); + + ClearWidget *child = new ClearWidget(&topLevel, 800, 600); + child->setClearColor(1, 0, 0); + child->resize(400, 400); + child->move(23, 34); + + QWidget *raster = new QWidget(&topLevel); + raster->setGeometry(23, 240, 120, 120); + raster->setStyleSheet("QWidget { background-color: yellow; }"); + + raster->winId(); + + topLevel.show(); + QVERIFY(QTest::qWaitForWindowExposed(&topLevel)); + + // Do not bother checking the output, i.e. if the yellow raster native child + // shows up as it should, but rather rely on the message handler catching the + // qWarnings if they occur. + } + + // Now with the QOpenGLWidget being a native child { QWidget topLevel; topLevel.resize(800, 600); @@ -665,7 +710,7 @@ void tst_QOpenGLWidget::nativeWindow() ClearWidget *child = new ClearWidget(nullptr, 800, 600); // set the parent separately, this is important, see next test case child->setParent(container); - child->setClearColor(0, 1, 0); + child->setClearColor(0, 0, 1); child->resize(400, 400); child->move(23, 34); @@ -679,7 +724,7 @@ void tst_QOpenGLWidget::nativeWindow() QImage image = child->grabFramebuffer(); QCOMPARE(image.width(), child->width()); QCOMPARE(image.height(), child->height()); - QVERIFY(image.pixel(30, 40) == qRgb(0, 255, 0)); + QVERIFY(image.pixel(30, 40) == qRgb(0, 0, 255)); } // Again as a child of a native child, but this time specifying the parent @@ -691,7 +736,7 @@ void tst_QOpenGLWidget::nativeWindow() container->winId(); // parent it right away ClearWidget *child = new ClearWidget(container, 800, 600); - child->setClearColor(0, 1, 0); + child->setClearColor(0, 0, 1); child->resize(400, 400); child->move(23, 34); topLevel.show(); @@ -702,7 +747,12 @@ void tst_QOpenGLWidget::nativeWindow() QImage image = child->grabFramebuffer(); QCOMPARE(image.width(), child->width()); QCOMPARE(image.height(), child->height()); - QVERIFY(image.pixel(30, 40) == qRgb(0, 255, 0)); + QVERIFY(image.pixel(30, 40) == qRgb(0, 0, 255)); + } + + if (oldHandler) { + qInstallMessageHandler(oldHandler); + oldHandler = nullptr; } } |