Android: use fbo read back workaround with specific GPUs.
Namely, the Mali 400 and the Adreno 200. We used to enable this workaround only for the Samsung Galaxy Tab 3, which has a Mali 400. The same problem was confirmed with the Samsung Galaxy Note N7000 (Mali 400) and the ZTE Blade (Adreno 200). Task-number: QTBUG-33951 Task-number: QTBUG-34984 Change-Id: Ic624962986f718285b98ab4ca48e22f9aa110753 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
This commit is contained in:
parent
e7270b68fe
commit
b3f201b8af
@ -132,7 +132,7 @@ QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList ¶
|
||||
m_androidSystemLocale = new QAndroidSystemLocale;
|
||||
}
|
||||
|
||||
bool QAndroidPlatformIntegration::needsWorkaround()
|
||||
bool QAndroidPlatformIntegration::needsBasicRenderloopWorkaround()
|
||||
{
|
||||
static bool needsWorkaround =
|
||||
QtAndroid::deviceName().compare(QStringLiteral("samsung SM-T211"), Qt::CaseInsensitive) == 0
|
||||
@ -150,7 +150,7 @@ bool QAndroidPlatformIntegration::hasCapability(Capability cap) const
|
||||
case OpenGL: return true;
|
||||
case ForeignWindows: return true;
|
||||
case ThreadedOpenGL:
|
||||
if (needsWorkaround())
|
||||
if (needsBasicRenderloopWorkaround())
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
|
@ -120,9 +120,9 @@ public:
|
||||
QTouchDevice *touchDevice() const { return m_touchDevice; }
|
||||
void setTouchDevice(QTouchDevice *touchDevice) { m_touchDevice = touchDevice; }
|
||||
|
||||
static bool needsWorkaround();
|
||||
EGLDisplay m_eglDisplay;
|
||||
private:
|
||||
static bool needsBasicRenderloopWorkaround();
|
||||
|
||||
QTouchDevice *m_touchDevice;
|
||||
|
||||
|
@ -62,6 +62,22 @@ void QAndroidPlatformOpenGLContext::swapBuffers(QPlatformSurface *surface)
|
||||
static_cast<QAndroidPlatformOpenGLWindow *>(surface)->checkNativeSurface(eglConfig());
|
||||
}
|
||||
|
||||
bool QAndroidPlatformOpenGLContext::needsFBOReadBackWorkaroud()
|
||||
{
|
||||
static bool set = false;
|
||||
static bool needsWorkaround = false;
|
||||
|
||||
if (!set) {
|
||||
const char *rendererString = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
|
||||
needsWorkaround =
|
||||
qstrcmp(rendererString, "Mali-400 MP") == 0
|
||||
|| qstrcmp(rendererString, "Adreno (TM) 200") == 0;
|
||||
set = true;
|
||||
}
|
||||
|
||||
return needsWorkaround;
|
||||
}
|
||||
|
||||
bool QAndroidPlatformOpenGLContext::makeCurrent(QPlatformSurface *surface)
|
||||
{
|
||||
bool ret = QEGLPlatformContext::makeCurrent(surface);
|
||||
@ -71,7 +87,7 @@ bool QAndroidPlatformOpenGLContext::makeCurrent(QPlatformSurface *surface)
|
||||
if (rendererString != 0 && qstrncmp(rendererString, "Android Emulator", 16) == 0)
|
||||
ctx_d->workaround_missingPrecisionQualifiers = true;
|
||||
|
||||
if (!ctx_d->workaround_brokenFBOReadBack && QAndroidPlatformIntegration::needsWorkaround())
|
||||
if (!ctx_d->workaround_brokenFBOReadBack && needsFBOReadBackWorkaroud())
|
||||
ctx_d->workaround_brokenFBOReadBack = true;
|
||||
|
||||
return ret;
|
||||
|
@ -56,6 +56,8 @@ public:
|
||||
|
||||
private:
|
||||
virtual EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface);
|
||||
|
||||
static bool needsFBOReadBackWorkaroud();
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
Loading…
Reference in New Issue
Block a user