Environment variable enabling the workaround FBO readback bug
On some ARM devices the font glyph generation is broken Add an environment variable to enable workaround_brokenFBOReadBack in QOpenGLContext, to fix font rendering on such devices as Mali and Adreno Change-Id: I9cc99ecb8b71a35bc369ec9dd11b877016b1179e Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
This commit is contained in:
parent
6b52039866
commit
9ae028f507
src
gui/kernel
plugins/platforms/android
@ -982,6 +982,40 @@ bool QOpenGLContext::makeCurrent(QSurface *surface)
|
||||
QOpenGLContext *previous = QOpenGLContextPrivate::setCurrentContext(this);
|
||||
|
||||
if (d->platformGLContext->makeCurrent(surface->surfaceHandle())) {
|
||||
static bool needsWorkaroundSet = false;
|
||||
static bool needsWorkaround = false;
|
||||
|
||||
if (!needsWorkaroundSet) {
|
||||
QByteArray env;
|
||||
#ifdef Q_OS_ANDROID
|
||||
env = qgetenv(QByteArrayLiteral("QT_ANDROID_DISABLE_GLYPH_CACHE_WORKAROUND"));
|
||||
needsWorkaround = env.isEmpty() || env == QByteArrayLiteral("0") || env == QByteArrayLiteral("false");
|
||||
#endif
|
||||
env = qgetenv(QByteArrayLiteral("QT_ENABLE_GLYPH_CACHE_WORKAROUND"));
|
||||
if (env == QByteArrayLiteral("1") || env == QByteArrayLiteral("true"))
|
||||
needsWorkaround = true;
|
||||
|
||||
if (!needsWorkaround) {
|
||||
const char *rendererString = reinterpret_cast<const char *>(functions()->glGetString(GL_RENDERER));
|
||||
if (rendererString)
|
||||
needsWorkaround =
|
||||
qstrncmp(rendererString, "Mali-4xx", 6) == 0 // Mali-400, Mali-450
|
||||
|| qstrncmp(rendererString, "Adreno (TM) 2xx", 13) == 0 // Adreno 200, 203, 205
|
||||
|| qstrncmp(rendererString, "Adreno 2xx", 8) == 0 // Same as above but without the '(TM)'
|
||||
|| qstrncmp(rendererString, "Adreno (TM) 30x", 14) == 0 // Adreno 302, 305
|
||||
|| qstrncmp(rendererString, "Adreno 30x", 9) == 0 // Same as above but without the '(TM)'
|
||||
|| qstrncmp(rendererString, "Adreno (TM) 4xx", 13) == 0 // Adreno 405, 418, 420, 430
|
||||
|| qstrncmp(rendererString, "Adreno 4xx", 8) == 0 // Same as above but without the '(TM)'
|
||||
|| qstrcmp(rendererString, "GC800 core") == 0
|
||||
|| qstrcmp(rendererString, "GC1000 core") == 0
|
||||
|| qstrcmp(rendererString, "Immersion.16") == 0;
|
||||
}
|
||||
needsWorkaroundSet = true;
|
||||
}
|
||||
|
||||
if (needsWorkaround)
|
||||
d->workaround_brokenFBOReadBack = true;
|
||||
|
||||
d->surface = surface;
|
||||
|
||||
d->shareGroup->d_func()->deletePendingResources(this);
|
||||
|
@ -65,42 +65,11 @@ void QAndroidPlatformOpenGLContext::swapBuffers(QPlatformSurface *surface)
|
||||
QEGLPlatformContext::swapBuffers(surface);
|
||||
}
|
||||
|
||||
bool QAndroidPlatformOpenGLContext::needsFBOReadBackWorkaround()
|
||||
{
|
||||
static bool set = false;
|
||||
static bool needsWorkaround = false;
|
||||
|
||||
if (!set) {
|
||||
QByteArray env = qgetenv("QT_ANDROID_DISABLE_GLYPH_CACHE_WORKAROUND");
|
||||
needsWorkaround = env.isEmpty() || env == "0" || env == "false";
|
||||
|
||||
if (!needsWorkaround) {
|
||||
const char *rendererString = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
|
||||
needsWorkaround =
|
||||
qstrncmp(rendererString, "Mali-4xx", 6) == 0 // Mali-400, Mali-450
|
||||
|| qstrncmp(rendererString, "Adreno (TM) 2xx", 13) == 0 // Adreno 200, 203, 205
|
||||
|| qstrncmp(rendererString, "Adreno 2xx", 8) == 0 // Same as above but without the '(TM)'
|
||||
|| qstrncmp(rendererString, "Adreno (TM) 30x", 14) == 0 // Adreno 302, 305
|
||||
|| qstrncmp(rendererString, "Adreno 30x", 9) == 0 // Same as above but without the '(TM)'
|
||||
|| qstrcmp(rendererString, "GC800 core") == 0
|
||||
|| qstrcmp(rendererString, "GC1000 core") == 0
|
||||
|| qstrcmp(rendererString, "Immersion.16") == 0;
|
||||
}
|
||||
|
||||
set = true;
|
||||
}
|
||||
|
||||
return needsWorkaround;
|
||||
}
|
||||
|
||||
bool QAndroidPlatformOpenGLContext::makeCurrent(QPlatformSurface *surface)
|
||||
{
|
||||
bool ret = QEGLPlatformContext::makeCurrent(surface);
|
||||
QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context());
|
||||
|
||||
if (!ctx_d->workaround_brokenFBOReadBack && needsFBOReadBackWorkaround())
|
||||
ctx_d->workaround_brokenFBOReadBack = true;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,6 @@ public:
|
||||
private:
|
||||
EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface) override;
|
||||
|
||||
static bool needsFBOReadBackWorkaround();
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
Loading…
Reference in New Issue
Block a user