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:
parent
32e6778bda
commit
9eeb1bd4d4
@ -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)
|
||||
{
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -58,6 +58,7 @@ public:
|
||||
EGLenum eglApi = EGL_OPENGL_ES_API);
|
||||
|
||||
void swapBuffers(QPlatformSurface *surface);
|
||||
bool makeCurrent(QPlatformSurface *surface);
|
||||
|
||||
private:
|
||||
const QAndroidPlatformIntegration *m_platformIntegration;
|
||||
|
Loading…
Reference in New Issue
Block a user