summaryrefslogtreecommitdiffstats
path: root/src/datavisualizationqml2
diff options
context:
space:
mode:
authorSami Varanka <sami.varanka@qt.io>2021-06-02 13:43:06 +0300
committerSami Varanka <sami.varanka@qt.io>2021-06-04 13:19:59 +0300
commitad85513d4b38bdedac27a095bd3a988f1eda23a2 (patch)
treeb1592889c3ba57f43a64f63625704db53bb8df2f /src/datavisualizationqml2
parent84e9b2018b93dcffcbabf5dbc93a670d9ddf688e (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.cpp37
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()