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
@ -982,6 +982,40 @@ bool QOpenGLContext::makeCurrent(QSurface *surface)
|
|||||||
QOpenGLContext *previous = QOpenGLContextPrivate::setCurrentContext(this);
|
QOpenGLContext *previous = QOpenGLContextPrivate::setCurrentContext(this);
|
||||||
|
|
||||||
if (d->platformGLContext->makeCurrent(surface->surfaceHandle())) {
|
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->surface = surface;
|
||||||
|
|
||||||
d->shareGroup->d_func()->deletePendingResources(this);
|
d->shareGroup->d_func()->deletePendingResources(this);
|
||||||
|
@ -65,42 +65,11 @@ void QAndroidPlatformOpenGLContext::swapBuffers(QPlatformSurface *surface)
|
|||||||
QEGLPlatformContext::swapBuffers(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 QAndroidPlatformOpenGLContext::makeCurrent(QPlatformSurface *surface)
|
||||||
{
|
{
|
||||||
bool ret = QEGLPlatformContext::makeCurrent(surface);
|
bool ret = QEGLPlatformContext::makeCurrent(surface);
|
||||||
QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context());
|
QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context());
|
||||||
|
|
||||||
if (!ctx_d->workaround_brokenFBOReadBack && needsFBOReadBackWorkaround())
|
|
||||||
ctx_d->workaround_brokenFBOReadBack = true;
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +55,6 @@ public:
|
|||||||
private:
|
private:
|
||||||
EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface) override;
|
EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface) override;
|
||||||
|
|
||||||
static bool needsFBOReadBackWorkaround();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
Loading…
Reference in New Issue
Block a user