diff options
-rw-r--r-- | src/gui/opengl/qopenglbuffer.cpp | 13 | ||||
-rw-r--r-- | src/gui/opengl/qopengldebug.cpp | 4 | ||||
-rw-r--r-- | src/gui/opengl/qopenglprogrambinarycache.cpp | 16 |
3 files changed, 30 insertions, 3 deletions
diff --git a/src/gui/opengl/qopenglbuffer.cpp b/src/gui/opengl/qopenglbuffer.cpp index 69c2baa8d97..000494244d9 100644 --- a/src/gui/opengl/qopenglbuffer.cpp +++ b/src/gui/opengl/qopenglbuffer.cpp @@ -43,6 +43,10 @@ #include "qopenglbuffer.h" #include <private/qopenglextensions_p.h> +#ifndef GL_CONTEXT_LOST +#define GL_CONTEXT_LOST 0x0507 +#endif + QT_BEGIN_NAMESPACE /*! @@ -346,7 +350,14 @@ bool QOpenGLBuffer::read(int offset, void *data, int count) Q_D(QOpenGLBuffer); if (!d->funcs->hasOpenGLFeature(QOpenGLFunctions::Buffers) || !d->guard->id()) return false; - while (d->funcs->glGetError() != GL_NO_ERROR) ; // Clear error state. + + while (true) { // Clear error state. + GLenum error = d->funcs->glGetError(); + if (error == GL_NO_ERROR) + break; + if (error == GL_CONTEXT_LOST) + return false; + }; d->funcs->glGetBufferSubData(d->type, offset, count, data); return d->funcs->glGetError() == GL_NO_ERROR; #else diff --git a/src/gui/opengl/qopengldebug.cpp b/src/gui/opengl/qopengldebug.cpp index f6c3af37dd3..7072db5af4b 100644 --- a/src/gui/opengl/qopengldebug.cpp +++ b/src/gui/opengl/qopengldebug.cpp @@ -100,6 +100,10 @@ QT_BEGIN_NAMESPACE \endcode + If you try to clear the error stack, make sure not just keep going until + GL_NO_ERROR is returned but also break on GL_CONTEXT_LOST as that error + value will keep repeating. + There are also many other information we are interested in (as application developers), for instance performance issues, or warnings about using deprecated APIs. Those kind of messages are not reported through the diff --git a/src/gui/opengl/qopenglprogrambinarycache.cpp b/src/gui/opengl/qopenglprogrambinarycache.cpp index f2d093ebed8..0f031013298 100644 --- a/src/gui/opengl/qopenglprogrambinarycache.cpp +++ b/src/gui/opengl/qopenglprogrambinarycache.cpp @@ -54,6 +54,10 @@ QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(DBG_SHADER_CACHE) +#ifndef GL_CONTEXT_LOST +#define GL_CONTEXT_LOST 0x0507 +#endif + #ifndef GL_PROGRAM_BINARY_LENGTH #define GL_PROGRAM_BINARY_LENGTH 0x8741 #endif @@ -161,7 +165,11 @@ bool QOpenGLProgramBinaryCache::verifyHeader(const QByteArray &buf) const bool QOpenGLProgramBinaryCache::setProgramBinary(uint programId, uint blobFormat, const void *p, uint blobSize) { QOpenGLExtraFunctions *funcs = QOpenGLContext::currentContext()->extraFunctions(); - while (funcs->glGetError() != GL_NO_ERROR) { } + while (true) { + GLenum error = funcs->glGetError(); + if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST) + break; + } funcs->glProgramBinary(programId, blobFormat, p, blobSize); GLenum err = funcs->glGetError(); @@ -337,7 +345,11 @@ void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId) QOpenGLExtraFunctions *funcs = QOpenGLContext::currentContext()->extraFunctions(); GLint blobSize = 0; - while (funcs->glGetError() != GL_NO_ERROR) { } + while (true) { + GLenum error = funcs->glGetError(); + if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST) + break; + } funcs->glGetProgramiv(programId, GL_PROGRAM_BINARY_LENGTH, &blobSize); const int headerSize = FULL_HEADER_SIZE(info.glvendor.size() + info.glrenderer.size() + info.glversion.size()); |