summaryrefslogtreecommitdiffstats
path: root/src/gui/opengl/qopenglprogrambinarycache.cpp
diff options
context:
space:
mode:
authorAntonio Larrosa <alarrosa@suse.com>2018-02-16 13:18:42 +0100
committerLaszlo Agocs <laszlo.agocs@qt.io>2018-02-22 14:18:39 +0000
commitef20989bf05c13b18eba4aac6f464c5be71136fa (patch)
tree933e67ba051f1bd6465265b6cc740a1c3c087e4e /src/gui/opengl/qopenglprogrambinarycache.cpp
parent9c3d5ff77f27717d21a2c50540851a9345abcad9 (diff)
opengl: Bail if cached shader fails to load
QOpenGLProgramBinaryCache::setProgramBinary() should check GL_LINK_STATUS after glProgramBinary(), but doesn't. In practice, this means that SDDM is a white screen, and KDE is just a gray task bar. So far, Qt tries to check this using its internal ::link() function. But in case the cached binary fails to load, Qt currently attempts to link the inexistent program, resulting in a zero-length, fixed pipeline shader. Checking this already in ::setProgramBinary() makes the call to ::link() superfluous, so we remove that as well. Done-with: Max Staudt <mstaudt@suse.com> Done-with: Michal Srb <msrb@suse.com> Done-with: Fabian Vogt <fvogt@suse.de> Task-number: QTBUG-66420 Change-Id: Iabb51d0eb2c0c16bde696efff623e57d15f28d82 Reviewed-by: Jesus Fernandez <Jesus.Fernandez@qt.io> Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io> (cherry picked from commit fa091640134b3ff99a9eb92df8286d15203122bf)
Diffstat (limited to 'src/gui/opengl/qopenglprogrambinarycache.cpp')
-rw-r--r--src/gui/opengl/qopenglprogrambinarycache.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/gui/opengl/qopenglprogrambinarycache.cpp b/src/gui/opengl/qopenglprogrambinarycache.cpp
index 06373e11138..d16173df83c 100644
--- a/src/gui/opengl/qopenglprogrambinarycache.cpp
+++ b/src/gui/opengl/qopenglprogrambinarycache.cpp
@@ -161,10 +161,26 @@ bool QOpenGLProgramBinaryCache::setProgramBinary(uint programId, uint blobFormat
QOpenGLExtraFunctions *funcs = QOpenGLContext::currentContext()->extraFunctions();
while (funcs->glGetError() != GL_NO_ERROR) { }
funcs->glProgramBinary(programId, blobFormat, p, blobSize);
- int err = funcs->glGetError();
+
+ GLenum err = funcs->glGetError();
+ if (err != GL_NO_ERROR) {
+ qCDebug(DBG_SHADER_CACHE, "Program binary failed to load for program %u, size %d, "
+ "format 0x%x, err = 0x%x",
+ programId, blobSize, blobFormat, err);
+ return false;
+ }
+ GLint linkStatus = 0;
+ funcs->glGetProgramiv(programId, GL_LINK_STATUS, &linkStatus);
+ if (linkStatus != GL_TRUE) {
+ qCDebug(DBG_SHADER_CACHE, "Program binary failed to load for program %u, size %d, "
+ "format 0x%x, linkStatus = 0x%x, err = 0x%x",
+ programId, blobSize, blobFormat, linkStatus, err);
+ return false;
+ }
+
qCDebug(DBG_SHADER_CACHE, "Program binary set for program %u, size %d, format 0x%x, err = 0x%x",
programId, blobSize, blobFormat, err);
- return err == 0;
+ return true;
}
#ifdef Q_OS_UNIX