More fixups for GL_CONTEXT_LOST
Fixes the rest of the places we use the pattern of emptying the OpenGL error stack to be able to handle GL_CONTEXT_LOST, and adds a note about it in the documentation. Change-Id: I7eb97dbca45f39295b832d44937023b538b19947 Reviewed-by: David Edmundson <davidedmundson@kde.org> Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
This commit is contained in:
parent
e61a40bff1
commit
c33faac32b
@ -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
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
|
Loading…
Reference in New Issue
Block a user