QOpenGLShaderProgram: insert precision defines based on runtime detection
Given that we can create OpenGL/ES contexts even under a Desktop OpenGL implementation, we must check the type of the surface we're renderering on at runtime. Change-Id: I55004ce918889b3fc094702976500fcfc675bd1a Reviewed-by: Samuel Rødal <samuel.rodal@digia.com> Reviewed-by: Sean Harmer <sean.harmer@kdab.com> Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
This commit is contained in:
parent
d711f98bfb
commit
658616b44e
@ -49,6 +49,7 @@
|
|||||||
#include <QtCore/qvector.h>
|
#include <QtCore/qvector.h>
|
||||||
#include <QtGui/qtransform.h>
|
#include <QtGui/qtransform.h>
|
||||||
#include <QtGui/QColor>
|
#include <QtGui/QColor>
|
||||||
|
#include <QtGui/QSurfaceFormat>
|
||||||
|
|
||||||
#if !defined(QT_OPENGL_ES_2)
|
#if !defined(QT_OPENGL_ES_2)
|
||||||
#include <QtGui/qopenglfunctions_4_0_core.h>
|
#include <QtGui/qopenglfunctions_4_0_core.h>
|
||||||
@ -373,18 +374,12 @@ QOpenGLShader::ShaderType QOpenGLShader::shaderType() const
|
|||||||
return d->shaderType;
|
return d->shaderType;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The precision qualifiers are useful on OpenGL/ES systems,
|
|
||||||
// but usually not present on desktop systems. Define the
|
|
||||||
// keywords to empty strings on desktop systems.
|
|
||||||
#if !defined(QT_OPENGL_ES) || defined(QT_OPENGL_FORCE_SHADER_DEFINES)
|
|
||||||
#define QOpenGL_DEFINE_QUALIFIERS 1
|
|
||||||
static const char qualifierDefines[] =
|
static const char qualifierDefines[] =
|
||||||
"#define lowp\n"
|
"#define lowp\n"
|
||||||
"#define mediump\n"
|
"#define mediump\n"
|
||||||
"#define highp\n";
|
"#define highp\n";
|
||||||
|
|
||||||
#else
|
#if defined(QT_OPENGL_ES) && !defined(QT_OPENGL_FORCE_SHADER_DEFINES)
|
||||||
|
|
||||||
// The "highp" qualifier doesn't exist in fragment shaders
|
// The "highp" qualifier doesn't exist in fragment shaders
|
||||||
// on all ES platforms. When it doesn't exist, use "mediump".
|
// on all ES platforms. When it doesn't exist, use "mediump".
|
||||||
#define QOpenGL_REDEFINE_HIGHP 1
|
#define QOpenGL_REDEFINE_HIGHP 1
|
||||||
@ -424,10 +419,19 @@ bool QOpenGLShader::compileSourceCode(const char *source)
|
|||||||
src.append(source);
|
src.append(source);
|
||||||
srclen.append(GLint(headerLen));
|
srclen.append(GLint(headerLen));
|
||||||
}
|
}
|
||||||
#ifdef QOpenGL_DEFINE_QUALIFIERS
|
|
||||||
|
// The precision qualifiers are useful on OpenGL/ES systems,
|
||||||
|
// but usually not present on desktop systems.
|
||||||
|
const QSurfaceFormat currentSurfaceFormat = QOpenGLContext::currentContext()->format();
|
||||||
|
if (currentSurfaceFormat.renderableType() == QSurfaceFormat::OpenGL
|
||||||
|
#ifdef QT_OPENGL_FORCE_SHADER_DEFINES
|
||||||
|
|| true
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
src.append(qualifierDefines);
|
src.append(qualifierDefines);
|
||||||
srclen.append(GLint(sizeof(qualifierDefines) - 1));
|
srclen.append(GLint(sizeof(qualifierDefines) - 1));
|
||||||
#endif
|
}
|
||||||
|
|
||||||
#ifdef QOpenGL_REDEFINE_HIGHP
|
#ifdef QOpenGL_REDEFINE_HIGHP
|
||||||
if (d->shaderType == Fragment) {
|
if (d->shaderType == Fragment) {
|
||||||
src.append(redefineHighp);
|
src.append(redefineHighp);
|
||||||
|
Loading…
Reference in New Issue
Block a user