aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util/qquickopenglutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/util/qquickopenglutils.cpp')
-rw-r--r--src/quick/util/qquickopenglutils.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/quick/util/qquickopenglutils.cpp b/src/quick/util/qquickopenglutils.cpp
new file mode 100644
index 0000000000..f179debfe5
--- /dev/null
+++ b/src/quick/util/qquickopenglutils.cpp
@@ -0,0 +1,91 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qquickopenglutils.h"
+
+#include <QOpenGLContext>
+#include <QOpenGLFunctions>
+#include <QOpenGLFramebufferObject>
+#include <private/qopenglvertexarrayobject_p.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \namespace QQuickOpenGLUtils
+ \inmodule QtQuick
+ \since 6.0
+
+ \brief The QQuickOpenGLUtils namespace contains utilities for Qt
+ Quick when used with an OpenGL backend.
+*/
+
+/*!
+ Call this function to reset the current 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 QQuickOpenGLUtils::resetOpenGLState()
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (!ctx)
+ return;
+
+ QOpenGLFunctions *gl = ctx->functions();
+
+ gl->glBindBuffer(GL_ARRAY_BUFFER, 0);
+ gl->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ QOpenGLVertexArrayObjectHelper *vaoHelper = QOpenGLVertexArrayObjectHelper::vertexArrayObjectHelperForContext(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();
+}
+
+QT_END_NAMESPACE