diff options
author | Sami Varanka <sami.varanka@qt.io> | 2021-06-02 13:43:06 +0300 |
---|---|---|
committer | Sami Varanka <sami.varanka@qt.io> | 2021-06-04 13:19:59 +0300 |
commit | ad85513d4b38bdedac27a095bd3a988f1eda23a2 (patch) | |
tree | b1592889c3ba57f43a64f63625704db53bb8df2f /src/datavisualizationqml2 | |
parent | 84e9b2018b93dcffcbabf5dbc93a670d9ddf688e (diff) |
Fix direct rendering doesn't show anything
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ää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src/datavisualizationqml2')
-rw-r--r-- | src/datavisualizationqml2/abstractdeclarative.cpp | 37 |
1 files changed, 8 insertions, 29 deletions
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<const QQuickWindow *> clearList; static QHash<AbstractDeclarative *, QQuickWindow *> graphWindowList; -static QHash<QQuickWindow *, bool> 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() |