From ad85513d4b38bdedac27a095bd3a988f1eda23a2 Mon Sep 17 00:00:00 2001 From: Sami Varanka Date: Wed, 2 Jun 2021 13:43:06 +0300 Subject: Fix direct rendering doesn't show anything MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rendering a graph directly to background didn't work in Qt 6 since it uses RHI and there is no way to not clear the color buffer before rendering. The graph uses direct OpenGL calls to render directly to background. Enabled direct rendering to qml3doscilloscope example. In addition, RenderDirectToBackground_NoClear got deprecated. When rendering directly to background, using non-transparent qml item as a background will hide the graph. This was already mentioned in the documentation but not clearly enough. Updated documentation for AbstractGraph3D. Pick-to: 6.1 Fixes: QTBUG-90665 Change-Id: I53081bac382ab89573359886e4f5c4b41be8e86d Reviewed-by: Tomi Korpipää --- src/datavisualizationqml2/abstractdeclarative.cpp | 37 +++++------------------ 1 file changed, 8 insertions(+), 29 deletions(-) (limited to 'src/datavisualizationqml2') diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index ccc03d19..dbbd803d 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -46,9 +46,7 @@ QT_BEGIN_NAMESPACE -static QList clearList; static QHash graphWindowList; -static QHash windowClearList; AbstractDeclarative::AbstractDeclarative(QQuickItem *parent) : QQuickItem(parent), @@ -106,7 +104,7 @@ void AbstractDeclarative::setRenderingMode(AbstractDeclarative::RenderingMode mo update(); setFlag(ItemHasContents, false); if (win) { - QObject::connect(win, &QQuickWindow::beforeRendering, this, + QObject::connect(win, &QQuickWindow::beforeRenderPassRecording, this, &AbstractDeclarative::render, Qt::DirectConnection); checkWindowList(win); setAntialiasing(m_windowSamples > 0); @@ -120,7 +118,7 @@ void AbstractDeclarative::setRenderingMode(AbstractDeclarative::RenderingMode mo setFlag(ItemHasContents, !m_runningInDesigner); update(); if (win) { - QObject::disconnect(win, &QQuickWindow::beforeRendering, this, + QObject::disconnect(win, &QQuickWindow::beforeRenderPassRecording, this, &AbstractDeclarative::render); checkWindowList(win); } @@ -407,9 +405,6 @@ void AbstractDeclarative::doneOpenGLContext(QQuickWindow *window) void AbstractDeclarative::synchDataToRenderer() { - if (m_renderMode == RenderDirectToBackground && clearList.size()) - clearList.clear(); - QQuickWindow *win = window(); activateOpenGLContext(win); m_controller->synchDataToRenderer(); @@ -444,7 +439,6 @@ void AbstractDeclarative::setMsaaSamples(int samples) void AbstractDeclarative::handleWindowChanged(QQuickWindow *window) { checkWindowList(window); - if (!window) return; @@ -473,7 +467,7 @@ void AbstractDeclarative::handleWindowChanged(QQuickWindow *window) if (m_renderMode == RenderDirectToBackground_NoClear || m_renderMode == RenderDirectToBackground) { - connect(window, &QQuickWindow::beforeRendering, this, &AbstractDeclarative::render, + connect(window, &QQuickWindow::beforeRenderPassRecording, this, &AbstractDeclarative::render, Qt::DirectConnection); setAntialiasing(m_windowSamples > 0); if (m_windowSamples != oldWindowSamples) @@ -580,14 +574,10 @@ void AbstractDeclarative::render() // Clear the background once per window as that is not done by default QQuickWindow *win = window(); + win->beginExternalCommands(); activateOpenGLContext(win); + QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions(); - if (m_renderMode == RenderDirectToBackground && !clearList.contains(win)) { - clearList.append(win); - QColor clearColor = win->color(); - funcs->glClearColor(clearColor.redF(), clearColor.greenF(), clearColor.blueF(), 1.0f); - funcs->glClear(GL_COLOR_BUFFER_BIT); - } if (isVisible()) { funcs->glDepthMask(GL_TRUE); @@ -601,7 +591,9 @@ void AbstractDeclarative::render() funcs->glEnable(GL_BLEND); } + doneOpenGLContext(win); + win->endExternalCommands(); } QAbstract3DInputHandler* AbstractDeclarative::inputHandler() const @@ -653,7 +645,6 @@ void AbstractDeclarative::wheelEvent(QWheelEvent *event) void AbstractDeclarative::checkWindowList(QQuickWindow *window) { QQuickWindow *oldWindow = graphWindowList.value(this); - graphWindowList[this] = window; if (oldWindow != window && oldWindow) { @@ -661,7 +652,7 @@ void AbstractDeclarative::checkWindowList(QQuickWindow *window) &AbstractDeclarative::windowDestroyed); QObject::disconnect(oldWindow, &QQuickWindow::beforeSynchronizing, this, &AbstractDeclarative::synchDataToRenderer); - QObject::disconnect(oldWindow, &QQuickWindow::beforeRendering, this, + QObject::disconnect(oldWindow, &QQuickWindow::beforeRenderPassRecording, this, &AbstractDeclarative::render); if (!m_controller.isNull()) { QObject::disconnect(m_controller.data(), &Abstract3DController::needRender, @@ -678,20 +669,10 @@ void AbstractDeclarative::checkWindowList(QQuickWindow *window) } } - if (oldWindow && !windowList.contains(oldWindow) - && windowClearList.contains(oldWindow)) { - windowClearList.remove(oldWindow); - } - if (!window) { graphWindowList.remove(this); return; } - - if ((m_renderMode == RenderDirectToBackground - || m_renderMode == RenderDirectToBackground_NoClear) - && !windowClearList.contains(window)) { - } } void AbstractDeclarative::setMeasureFps(bool enable) @@ -829,8 +810,6 @@ void AbstractDeclarative::windowDestroyed(QObject *obj) if (win == oldWindow) graphWindowList.remove(this); - - windowClearList.remove(win); } void AbstractDeclarative::destroyContext() -- cgit v1.2.3