Don't block on lost context

When glGetError returns GL_CONTEXT_LOST, on XCB + Nvidia at least, the
error does not get cleared until the next successful
glGetGraphicsResetStatus.

We can't handle this properly until the start of the next frame where we
will hopefully have a valid context, but in the meantime we should avoid
locking up completely.

Change-Id: Id438d44d83b926e1f3e4281ca3704231bf1a23cf
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
bb10
David Edmundson 2018-04-05 12:54:01 +01:00 committed by Allan Sandfeld Jensen
parent b0479aab29
commit 29778037f8
1 changed files with 15 additions and 4 deletions

View File

@ -55,12 +55,16 @@ QT_BEGIN_NAMESPACE
#ifndef QT_NO_DEBUG
#define QT_RESET_GLERROR() \
{ \
while (QOpenGLContext::currentContext()->functions()->glGetError() != GL_NO_ERROR) {} \
while (true) {\
GLenum error = QOpenGLContext::currentContext()->functions()->glGetError(); \
if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST) \
break; \
} \
}
#define QT_CHECK_GLERROR() \
{ \
GLenum err = QOpenGLContext::currentContext()->functions()->glGetError(); \
if (err != GL_NO_ERROR) { \
if (err != GL_NO_ERROR && err != GL_CONTEXT_LOST) { \
qDebug("[%s line %d] OpenGL Error: %d", \
__FILE__, __LINE__, (int)err); \
} \
@ -126,6 +130,10 @@ QT_BEGIN_NAMESPACE
#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
#endif
#ifndef GL_CONTEXT_LOST
#define GL_CONTEXT_LOST 0x0507
#endif
/*!
\class QOpenGLFramebufferObjectFormat
@ -1303,8 +1311,11 @@ static QImage qt_gl_read_framebuffer(const QSize &size, GLenum internal_format,
{
QOpenGLContext *ctx = QOpenGLContext::currentContext();
QOpenGLFunctions *funcs = ctx->functions();
while (funcs->glGetError());
while (true) {
GLenum error = funcs->glGetError();
if (error == GL_NO_ERROR || error == GL_CONTEXT_LOST)
break;
}
switch (internal_format) {
case GL_RGB:
case GL_RGB8: