Add workaround for GL on Android emulator

On the Android Emulator, the shaders will be compiled by a desktop
GL driver, since the GL driver in the emulator is just a thin
wrapper. The GL driver does not necessarily support the precision
qualifiers, which can cause applications to break. We detect this
at runtime in the platform plugin and set a workaround flag to

Task-number: QTBUG-32557
Change-Id: Ied00cfe8e804d1f7862697dd379a14f3bed3d980
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2013-07-29 13:49:42 +02:00 committed by The Qt Project
parent 32e6778bda
commit 9eeb1bd4d4
4 changed files with 26 additions and 1 deletions

View File

@ -203,6 +203,7 @@ public:
, max_texture_size(-1)
, workaround_brokenFBOReadBack(false)
, workaround_brokenTexSubImage(false)
, workaround_missingPrecisionQualifiers(false)
, active_engine(0)
{
}
@ -233,6 +234,7 @@ public:
bool workaround_brokenFBOReadBack;
bool workaround_brokenTexSubImage;
bool workaround_missingPrecisionQualifiers;
QPaintEngineEx *active_engine;
@ -240,6 +242,11 @@ public:
int maxTextureSize();
static QOpenGLContextPrivate *get(QOpenGLContext *context)
{
return context->d_func();
}
#if !defined(QT_NO_DEBUG)
static bool toggleMakeCurrentTracker(QOpenGLContext *context, bool value)
{

View File

@ -429,7 +429,9 @@ bool QOpenGLShader::compileSourceCode(const char *source)
// The precision qualifiers are useful on OpenGL/ES systems,
// but usually not present on desktop systems.
const QSurfaceFormat currentSurfaceFormat = QOpenGLContext::currentContext()->format();
QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(QOpenGLContext::currentContext());
if (currentSurfaceFormat.renderableType() == QSurfaceFormat::OpenGL
|| ctx_d->workaround_missingPrecisionQualifiers
#ifdef QT_OPENGL_FORCE_SHADER_DEFINES
|| true
#endif
@ -439,7 +441,7 @@ bool QOpenGLShader::compileSourceCode(const char *source)
}
#ifdef QOpenGL_REDEFINE_HIGHP
if (d->shaderType == Fragment) {
if (d->shaderType == Fragment && !ctx_d->workaround_missingPrecisionQualifiers) {
src.append(redefineHighp);
srclen.append(GLint(sizeof(redefineHighp) - 1));
}

View File

@ -46,6 +46,8 @@
#include <QtCore/qdebug.h>
#include <qpa/qwindowsysteminterface.h>
#include <QtGui/private/qopenglcontext_p.h>
QT_BEGIN_NAMESPACE
QAndroidOpenGLContext::QAndroidOpenGLContext(const QAndroidPlatformIntegration *integration,
@ -75,4 +77,17 @@ void QAndroidOpenGLContext::swapBuffers(QPlatformSurface *surface)
}
}
bool QAndroidOpenGLContext::makeCurrent(QPlatformSurface *surface)
{
bool ret = QEglFSContext::makeCurrent(surface);
const char *rendererString = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
if (rendererString != 0 && qstrncmp(rendererString, "Android Emulator", 16) == 0) {
QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context());
ctx_d->workaround_missingPrecisionQualifiers = true;
}
return ret;
}
QT_END_NAMESPACE

View File

@ -58,6 +58,7 @@ public:
EGLenum eglApi = EGL_OPENGL_ES_API);
void swapBuffers(QPlatformSurface *surface);
bool makeCurrent(QPlatformSurface *surface);
private:
const QAndroidPlatformIntegration *m_platformIntegration;