diff options
author | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2020-06-18 03:56:00 +0200 |
---|---|---|
committer | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2020-06-23 17:44:03 +0200 |
commit | d5d6a56809032796444fe63c220a2e940ce237c0 (patch) | |
tree | ec7bd06c514ba413f28c031b58db69b89b92b2bf /src/quick/items/qquickframebufferobject.cpp | |
parent | 1aea94e58f572fe6dbd1146a80ecf5be6602a7af (diff) |
Move resetOpenGLState out of QQFBO
QQFBO is not the only client of resetOpenGLState. Although in theory
third-party GL code that integrates with QtQuick should reset its
state, in practice it doesn't. By making resetOpenGLState
only available into QQFBO, now we're blocking a Qt5->6 upgrade path.
There's also no compelling reason for this function to be in QQFBO
at all, so move it out to as a free function in a ad-hoc new namespace.
Change-Id: Ic8e5c7e244db37a5b6257d516e6aea3a9db44898
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/quick/items/qquickframebufferobject.cpp')
-rw-r--r-- | src/quick/items/qquickframebufferobject.cpp | 80 |
1 files changed, 3 insertions, 77 deletions
diff --git a/src/quick/items/qquickframebufferobject.cpp b/src/quick/items/qquickframebufferobject.cpp index 66fa8818c0..03de94756d 100644 --- a/src/quick/items/qquickframebufferobject.cpp +++ b/src/quick/items/qquickframebufferobject.cpp @@ -41,7 +41,6 @@ #include <QOpenGLFramebufferObject> #include <QOpenGLFunctions> -#include <private/qopenglvertexarrayobject_p.h> #include <private/qquickitem_p.h> #include <private/qsgadaptationlayer_p.h> #include <qsgtextureprovider.h> @@ -49,6 +48,7 @@ #include <QSGSimpleTextureNode> #include <QSGRendererInterface> +#include <QQuickOpenGLUtils> QT_BEGIN_NAMESPACE @@ -209,7 +209,6 @@ public: , renderPending(true) , invalidatePending(false) , devicePixelRatio(1) - , vaoHelper(nullptr) { qsgnode_set_description(this, QStringLiteral("fbonode")); } @@ -220,7 +219,6 @@ public: delete texture(); delete fbo; delete msDisplayFbo; - delete vaoHelper; } void scheduleRender() @@ -241,7 +239,7 @@ public Q_SLOTS: renderPending = false; window->beginExternalCommands(); - renderer->resetOpenGLState(); + QQuickOpenGLUtils::resetOpenGLState(); fbo->bind(); QOpenGLContext::currentContext()->functions()->glViewport(0, 0, fbo->width(), fbo->height()); @@ -277,7 +275,6 @@ public: bool invalidatePending; qreal devicePixelRatio; - QOpenGLVertexArrayObjectHelper *vaoHelper; }; static inline bool isOpenGL(QSGRenderContext *rc) @@ -477,7 +474,7 @@ QOpenGLFramebufferObject *QQuickFramebufferObject::Renderer::framebufferObject() * context. This means that the state might have been modified by Quick before * invoking this function. * - * \note It is recommended to call resetOpenGLState() before + * \note It is recommended to call QQuickOpenGLUtils::resetOpenGLState() before * returning. This resets OpenGL state used by the Qt Quick renderer and thus * avoids interference from the state changes made by the rendering code in this * function. @@ -553,77 +550,6 @@ void QQuickFramebufferObject::Renderer::update() ((QSGFramebufferObjectNode *) data)->scheduleRender(); } -/*! - Call this function to reset the OpenGL context its default state. - - The scene graph uses the OpenGL context and will both rely on and - clobber its state. When mixing raw OpenGL commands with scene - graph rendering, this function provides a convenient way of - resetting the OpenGL context state back to its default values. - - This function does not touch state in the fixed-function pipeline. - - \warning This function will only reset the OpenGL context in - relation to what may be changed internally as part of the OpenGL - scene graph. It does not reset anything that has been changed - externally such as direct OpenGL calls done inside the application - code if those same calls are not used internally. (for example, - various OpenGL 3.x or 4.x specific state) - - \since 6.0 - */ -void QQuickFramebufferObject::Renderer::resetOpenGLState() -{ - QOpenGLContext *ctx = QOpenGLContext::currentContext(); - if (!ctx || !data) - return; - - QOpenGLFunctions *gl = ctx->functions(); - - gl->glBindBuffer(GL_ARRAY_BUFFER, 0); - gl->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - - QOpenGLVertexArrayObjectHelper *&vaoHelper(static_cast<QSGFramebufferObjectNode *>(data)->vaoHelper); - if (!vaoHelper) - vaoHelper = new QOpenGLVertexArrayObjectHelper(ctx); - if (vaoHelper->isValid()) - vaoHelper->glBindVertexArray(0); - - if (ctx->isOpenGLES() || (gl->openGLFeatures() & QOpenGLFunctions::FixedFunctionPipeline)) { - int maxAttribs; - gl->glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxAttribs); - for (int i=0; i<maxAttribs; ++i) { - gl->glVertexAttribPointer(i, 4, GL_FLOAT, GL_FALSE, 0, nullptr); - gl->glDisableVertexAttribArray(i); - } - } - - gl->glActiveTexture(GL_TEXTURE0); - gl->glBindTexture(GL_TEXTURE_2D, 0); - - gl->glDisable(GL_DEPTH_TEST); - gl->glDisable(GL_STENCIL_TEST); - gl->glDisable(GL_SCISSOR_TEST); - - gl->glColorMask(true, true, true, true); - gl->glClearColor(0, 0, 0, 0); - - gl->glDepthMask(true); - gl->glDepthFunc(GL_LESS); - gl->glClearDepthf(1); - - gl->glStencilMask(0xff); - gl->glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); - gl->glStencilFunc(GL_ALWAYS, 0, 0xff); - - gl->glDisable(GL_BLEND); - gl->glBlendFunc(GL_ONE, GL_ZERO); - - gl->glUseProgram(0); - - QOpenGLFramebufferObject::bindDefault(); -} - #include "qquickframebufferobject.moc" #include "moc_qquickframebufferobject.cpp" |