aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2020-05-06 18:25:23 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2020-06-02 15:44:33 +0200
commitbfa9e94600d4decdf0dfe8e522a5bf468a4a512e (patch)
tree6c9b925a053f1d4c74034e5078fc4810238ea894 /src/quick/scenegraph
parent2efc801a13c775cd2377001fe3362e94edc0e97b (diff)
Remove OpenGL FBO references in QQuickWindow and the renderer API
setRenderTarget(GLuint), setRenderTarget(QQuickFramebufferObject*), renderScene(uint fboId), QSGBindable, etc. are now removed. This leads to a simpler and cleaner interface in QSGAbstractRenderer and QSGRenderer because the somewhat weird renderScene() overloading (where one version is virtual, while the other isn't) is now avoided, with just a single renderScene() virtual now. Task-number: QTBUG-84040 Change-Id: I0ce5a159a557688bdfcb7cacf8a9d12d6fd970d1 Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Diffstat (limited to 'src/quick/scenegraph')
-rw-r--r--src/quick/scenegraph/adaptations/software/qsgsoftwarecontext.cpp4
-rw-r--r--src/quick/scenegraph/adaptations/software/qsgsoftwarecontext_p.h2
-rw-r--r--src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer.cpp9
-rw-r--r--src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer_p.h2
-rw-r--r--src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer.cpp9
-rw-r--r--src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer_p.h2
-rw-r--r--src/quick/scenegraph/coreapi/qsgabstractrenderer.cpp12
-rw-r--r--src/quick/scenegraph/coreapi/qsgabstractrenderer_p.h2
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp3
-rw-r--r--src/quick/scenegraph/coreapi/qsgrenderer.cpp100
-rw-r--r--src/quick/scenegraph/coreapi/qsgrenderer_p.h28
-rw-r--r--src/quick/scenegraph/qsgcontext_p.h2
-rw-r--r--src/quick/scenegraph/qsgdefaultcontext.cpp1
-rw-r--r--src/quick/scenegraph/qsgdefaultrendercontext.cpp4
-rw-r--r--src/quick/scenegraph/qsgdefaultrendercontext_p.h2
15 files changed, 23 insertions, 159 deletions
diff --git a/src/quick/scenegraph/adaptations/software/qsgsoftwarecontext.cpp b/src/quick/scenegraph/adaptations/software/qsgsoftwarecontext.cpp
index 91c26780b1..4cb016562f 100644
--- a/src/quick/scenegraph/adaptations/software/qsgsoftwarecontext.cpp
+++ b/src/quick/scenegraph/adaptations/software/qsgsoftwarecontext.cpp
@@ -157,9 +157,9 @@ QSGRenderer *QSGSoftwareRenderContext::createRenderer()
}
-void QSGSoftwareRenderContext::renderNextFrame(QSGRenderer *renderer, uint fbo)
+void QSGSoftwareRenderContext::renderNextFrame(QSGRenderer *renderer)
{
- renderer->renderScene(fbo);
+ renderer->renderScene();
}
int QSGSoftwareRenderContext::maxTextureSize() const
diff --git a/src/quick/scenegraph/adaptations/software/qsgsoftwarecontext_p.h b/src/quick/scenegraph/adaptations/software/qsgsoftwarecontext_p.h
index 84f468ce33..22f64bc70c 100644
--- a/src/quick/scenegraph/adaptations/software/qsgsoftwarecontext_p.h
+++ b/src/quick/scenegraph/adaptations/software/qsgsoftwarecontext_p.h
@@ -72,7 +72,7 @@ public:
QSGSoftwareRenderContext(QSGContext *ctx);
void initializeIfNeeded();
void invalidate() override;
- void renderNextFrame(QSGRenderer *renderer, uint fbo) override;
+ void renderNextFrame(QSGRenderer *renderer) override;
QSGTexture *createTexture(const QImage &image, uint flags = CreateTexture_Alpha) const override;
QSGRenderer *createRenderer() override;
int maxTextureSize() const override;
diff --git a/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer.cpp b/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer.cpp
index 4a6d73ec59..bdb23656fd 100644
--- a/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer.cpp
+++ b/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer.cpp
@@ -59,14 +59,9 @@ QSGSoftwarePixmapRenderer::~QSGSoftwarePixmapRenderer()
}
-void QSGSoftwarePixmapRenderer::renderScene(uint)
+void QSGSoftwarePixmapRenderer::renderScene()
{
- class B : public QSGBindable
- {
- public:
- void bind() const override { }
- } bindable;
- QSGRenderer::renderScene(bindable);
+ QSGRenderer::renderScene();
}
void QSGSoftwarePixmapRenderer::render()
diff --git a/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer_p.h b/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer_p.h
index 3b4fb304e7..2d042dae41 100644
--- a/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer_p.h
+++ b/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer_p.h
@@ -61,7 +61,7 @@ public:
QSGSoftwarePixmapRenderer(QSGRenderContext *context);
virtual ~QSGSoftwarePixmapRenderer();
- void renderScene(uint fboId = 0) final;
+ void renderScene() final;
void render() final;
void render(QPaintDevice *target);
diff --git a/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer.cpp b/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer.cpp
index df129cbfee..af12df26ab 100644
--- a/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer.cpp
+++ b/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer.cpp
@@ -85,14 +85,9 @@ QRegion QSGSoftwareRenderer::flushRegion() const
return m_flushRegion;
}
-void QSGSoftwareRenderer::renderScene(uint)
+void QSGSoftwareRenderer::renderScene()
{
- class B : public QSGBindable
- {
- public:
- void bind() const override { }
- } bindable;
- QSGRenderer::renderScene(bindable);
+ QSGRenderer::renderScene();
}
void QSGSoftwareRenderer::render()
diff --git a/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer_p.h b/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer_p.h
index bb28da4ca5..3730625a54 100644
--- a/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer_p.h
+++ b/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer_p.h
@@ -70,7 +70,7 @@ public:
QRegion flushRegion() const;
protected:
- void renderScene(uint fboId = 0) final;
+ void renderScene() final;
void render() final;
private:
diff --git a/src/quick/scenegraph/coreapi/qsgabstractrenderer.cpp b/src/quick/scenegraph/coreapi/qsgabstractrenderer.cpp
index 502ee27e27..dba1d8406a 100644
--- a/src/quick/scenegraph/coreapi/qsgabstractrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgabstractrenderer.cpp
@@ -79,17 +79,9 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn void QSGAbstractRenderer::renderScene(GLuint fboId = 0)
+ \fn void QSGAbstractRenderer::renderScene()
- Render the scene to the specified \a fboId
-
- If \a fboId isn't specified, the scene graph will be rendered
- to the default framebuffer. You will have to call
- QOpenGLContext::swapBuffers() yourself afterward.
-
- The framebuffer specified by \a fboId will be bound automatically.
-
- \sa QOpenGLContext::swapBuffers(), QOpenGLFramebufferObject::handle()
+ Renders the scene.
*/
/*!
diff --git a/src/quick/scenegraph/coreapi/qsgabstractrenderer_p.h b/src/quick/scenegraph/coreapi/qsgabstractrenderer_p.h
index 5d48f18310..83084cbd0f 100644
--- a/src/quick/scenegraph/coreapi/qsgabstractrenderer_p.h
+++ b/src/quick/scenegraph/coreapi/qsgabstractrenderer_p.h
@@ -107,7 +107,7 @@ public:
void setClearMode(ClearMode mode);
ClearMode clearMode() const;
- virtual void renderScene(GLuint fboId = 0) = 0;
+ virtual void renderScene() = 0;
Q_SIGNALS:
void sceneGraphChanged();
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
index 5863af85d3..bec693ed99 100644
--- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
@@ -3488,6 +3488,9 @@ void Renderer::deleteRemovedElements()
void Renderer::render()
{
+ if (!renderTarget())
+ return;
+
if (Q_UNLIKELY(debug_dump())) {
qDebug("\n");
QSGNodeDumper::dump(rootNode());
diff --git a/src/quick/scenegraph/coreapi/qsgrenderer.cpp b/src/quick/scenegraph/coreapi/qsgrenderer.cpp
index cd16014d41..4a7d2ce31d 100644
--- a/src/quick/scenegraph/coreapi/qsgrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgrenderer.cpp
@@ -39,11 +39,6 @@
#include "qsgrenderer_p.h"
#include "qsgnodeupdater_p.h"
-#if QT_CONFIG(opengl)
-# include <QOpenGLFramebufferObject>
-# include <QOpenGLContext>
-# include <QOpenGLFunctions>
-#endif
#include <private/qquickprofiler_p.h>
#include <qtquick_tracepoints_p.h>
@@ -68,38 +63,6 @@ int qt_sg_envInt(const char *name, int defaultValue)
return ok ? value : defaultValue;
}
-void QSGBindable::clear(QSGAbstractRenderer::ClearMode mode) const
-{
-#if QT_CONFIG(opengl)
- GLuint bits = 0;
- if (mode & QSGAbstractRenderer::ClearColorBuffer) bits |= GL_COLOR_BUFFER_BIT;
- if (mode & QSGAbstractRenderer::ClearDepthBuffer) bits |= GL_DEPTH_BUFFER_BIT;
- if (mode & QSGAbstractRenderer::ClearStencilBuffer) bits |= GL_STENCIL_BUFFER_BIT;
- QOpenGLContext::currentContext()->functions()->glClear(bits);
-#else
- Q_UNUSED(mode)
-#endif
-}
-
-// Reactivate the color buffer after switching to the stencil.
-void QSGBindable::reactivate() const
-{
-#if QT_CONFIG(opengl)
- QOpenGLContext::currentContext()->functions()->glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-#endif
-}
-#if QT_CONFIG(opengl)
-QSGBindableFboId::QSGBindableFboId(GLuint id)
- : m_id(id)
-{
-}
-
-
-void QSGBindableFboId::bind() const
-{
- QOpenGLContext::currentContext()->functions()->glBindFramebuffer(GL_FRAMEBUFFER, m_id);
-}
-#endif
/*!
\class QSGRenderer
\brief The renderer class is the abstract baseclass used for rendering the
@@ -140,7 +103,6 @@ QSGRenderer::QSGRenderer(QSGRenderContext *context)
, m_cb(nullptr)
, m_rp_desc(nullptr)
, m_node_updater(nullptr)
- , m_bindable(nullptr)
, m_changed_emitted(false)
, m_is_rendering(false)
, m_is_preprocessing(false)
@@ -189,35 +151,7 @@ bool QSGRenderer::isMirrored() const
return matrix(0, 0) * matrix(1, 1) - matrix(0, 1) * matrix(1, 0) > 0;
}
-void QSGRenderer::renderScene(uint fboId)
-{
- if (m_rt) {
- class B : public QSGBindable
- {
- public:
- void bind() const override { }
- } bindable;
- renderScene(bindable);
- } else {
-#if QT_CONFIG(opengl)
- if (fboId) {
- QSGBindableFboId bindable(fboId);
- renderScene(bindable);
- } else {
- class B : public QSGBindable
- {
- public:
- void bind() const override { QOpenGLFramebufferObject::bindDefault(); }
- } bindable;
- renderScene(bindable);
- }
-#else
- Q_UNUSED(fboId)
-#endif
- }
-}
-
-void QSGRenderer::renderScene(const QSGBindable &bindable)
+void QSGRenderer::renderScene()
{
if (!rootNode())
return;
@@ -225,42 +159,16 @@ void QSGRenderer::renderScene(const QSGBindable &bindable)
Q_TRACE_SCOPE(QSG_renderScene);
m_is_rendering = true;
-
bool profileFrames = QSG_LOG_TIME_RENDERER().isDebugEnabled();
if (profileFrames)
frameTimer.start();
Q_QUICK_SG_PROFILE_START(QQuickProfiler::SceneGraphRendererFrame);
- qint64 bindTime = 0;
qint64 renderTime = 0;
- m_bindable = &bindable;
preprocess();
- Q_TRACE(QSG_binding_entry);
- bindable.bind();
- if (profileFrames)
- bindTime = frameTimer.nsecsElapsed();
- Q_TRACE(QSG_binding_exit);
- Q_QUICK_SG_PROFILE_RECORD(QQuickProfiler::SceneGraphRendererFrame,
- QQuickProfiler::SceneGraphRendererBinding);
Q_TRACE(QSG_render_entry);
-
-#if QT_CONFIG(opengl)
- // Sanity check that attribute registers are disabled
- if (qsg_sanity_check) {
- GLint count = 0;
- QOpenGLContext::currentContext()->functions()->glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &count);
- GLint enabled;
- for (int i=0; i<count; ++i) {
- QOpenGLContext::currentContext()->functions()->glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &enabled);
- if (enabled) {
- qWarning("QSGRenderer: attribute %d is enabled, this can lead to memory corruption and crashes.", i);
- }
- }
- }
-#endif
-
render();
if (profileFrames)
renderTime = frameTimer.nsecsElapsed();
@@ -270,15 +178,13 @@ void QSGRenderer::renderScene(const QSGBindable &bindable)
m_is_rendering = false;
m_changed_emitted = false;
- m_bindable = nullptr;
qCDebug(QSG_LOG_TIME_RENDERER,
- "time in renderer: total=%dms, preprocess=%d, updates=%d, binding=%d, rendering=%d",
+ "time in renderer: total=%dms, preprocess=%d, updates=%d, rendering=%d",
int(renderTime / 1000000),
int(preprocessTime / 1000000),
int((updatePassTime - preprocessTime) / 1000000),
- int((bindTime - updatePassTime) / 1000000),
- int((renderTime - bindTime) / 1000000));
+ int((renderTime - updatePassTime) / 1000000));
}
/*!
diff --git a/src/quick/scenegraph/coreapi/qsgrenderer_p.h b/src/quick/scenegraph/coreapi/qsgrenderer_p.h
index f9d7d3a65a..08a8325dbb 100644
--- a/src/quick/scenegraph/coreapi/qsgrenderer_p.h
+++ b/src/quick/scenegraph/coreapi/qsgrenderer_p.h
@@ -59,7 +59,6 @@
QT_BEGIN_NAMESPACE
-class QSGBindable;
class QSGNodeUpdater;
class QRhiRenderTarget;
class QRhiCommandBuffer;
@@ -87,8 +86,7 @@ public:
QSGRenderContext *context() const { return m_context; }
bool isMirrored() const;
- void renderScene(const QSGBindable &bindable);
- void renderScene(uint fboId = 0) override;
+ void renderScene() override;
void nodeChanged(QSGNode *node, QSGNode::DirtyState state) override;
QSGNodeUpdater *nodeUpdater() const;
@@ -127,8 +125,6 @@ public:
protected:
virtual void render() = 0;
- const QSGBindable *bindable() const { return m_bindable; }
-
virtual void preprocess();
void addNodesToPreprocess(QSGNode *node);
@@ -161,33 +157,11 @@ private:
QSet<QSGNode *> m_nodes_to_preprocess;
QSet<QSGNode *> m_nodes_dont_preprocess;
- const QSGBindable *m_bindable;
-
uint m_changed_emitted : 1;
uint m_is_rendering : 1;
uint m_is_preprocessing : 1;
};
-class Q_QUICK_PRIVATE_EXPORT QSGBindable
-{
-public:
- virtual ~QSGBindable() { }
- virtual void bind() const = 0;
- virtual void clear(QSGAbstractRenderer::ClearMode mode) const;
- virtual void reactivate() const;
-};
-#if QT_CONFIG(opengl)
-class QSGBindableFboId : public QSGBindable
-{
-public:
- QSGBindableFboId(GLuint);
- void bind() const override;
-private:
- GLuint m_id;
-};
-#endif
-
-
QSGMaterialShader::RenderState QSGRenderer::state(QSGMaterialShader::RenderState::DirtyStates dirty) const
{
QSGMaterialShader::RenderState s;
diff --git a/src/quick/scenegraph/qsgcontext_p.h b/src/quick/scenegraph/qsgcontext_p.h
index a2cb21a60c..1696ee9cba 100644
--- a/src/quick/scenegraph/qsgcontext_p.h
+++ b/src/quick/scenegraph/qsgcontext_p.h
@@ -178,7 +178,7 @@ public:
RenderPassCallback mainPassRecordingStart,
RenderPassCallback mainPassRecordingEnd,
void *callbackUserData);
- virtual void renderNextFrame(QSGRenderer *renderer, uint fboId) = 0;
+ virtual void renderNextFrame(QSGRenderer *renderer) = 0;
virtual void endNextFrame(QSGRenderer *renderer);
virtual void beginNextRhiFrame(QSGRenderer *renderer,
diff --git a/src/quick/scenegraph/qsgdefaultcontext.cpp b/src/quick/scenegraph/qsgdefaultcontext.cpp
index 5204c3ecfc..fee1a8449e 100644
--- a/src/quick/scenegraph/qsgdefaultcontext.cpp
+++ b/src/quick/scenegraph/qsgdefaultcontext.cpp
@@ -57,7 +57,6 @@
#include <QtQuick/private/qsgrhishadereffectnode_p.h>
#include <QOpenGLContext>
-#include <QOpenGLFramebufferObject>
#include <QtQuick/private/qquickwindow_p.h>
#include <QtQuick/private/qquickitem_p.h>
diff --git a/src/quick/scenegraph/qsgdefaultrendercontext.cpp b/src/quick/scenegraph/qsgdefaultrendercontext.cpp
index be110b5de5..0214b1b94c 100644
--- a/src/quick/scenegraph/qsgdefaultrendercontext.cpp
+++ b/src/quick/scenegraph/qsgdefaultrendercontext.cpp
@@ -231,12 +231,12 @@ void QSGDefaultRenderContext::beginNextFrame(QSGRenderer *renderer,
renderer->setRenderPassRecordingCallbacks(mainPassRecordingStart, mainPassRecordingEnd, callbackUserData);
}
-void QSGDefaultRenderContext::renderNextFrame(QSGRenderer *renderer, uint fboId)
+void QSGDefaultRenderContext::renderNextFrame(QSGRenderer *renderer)
{
if (m_serializedRender)
qsg_framerender_mutex.lock();
- renderer->renderScene(fboId);
+ renderer->renderScene();
if (m_serializedRender)
qsg_framerender_mutex.unlock();
diff --git a/src/quick/scenegraph/qsgdefaultrendercontext_p.h b/src/quick/scenegraph/qsgdefaultrendercontext_p.h
index b6ed57ba6a..a2d3a1b20c 100644
--- a/src/quick/scenegraph/qsgdefaultrendercontext_p.h
+++ b/src/quick/scenegraph/qsgdefaultrendercontext_p.h
@@ -109,7 +109,7 @@ public:
RenderPassCallback mainPassRecordingStart,
RenderPassCallback mainPassRecordingEnd,
void *callbackUserData) override;
- void renderNextFrame(QSGRenderer *renderer, uint fboId) override;
+ void renderNextFrame(QSGRenderer *renderer) override;
void endNextFrame(QSGRenderer *renderer) override;
void beginNextRhiFrame(QSGRenderer *renderer,