diff options
author | Rhys Weatherley <rhys.weatherley@nokia.com> | 2009-09-01 03:57:30 (GMT) |
---|---|---|
committer | Rhys Weatherley <rhys.weatherley@nokia.com> | 2009-09-01 03:57:30 (GMT) |
commit | b2d9dc8c487a8b87347a7d45a6c4f9dc827ddbfe (patch) | |
tree | 1d226f4fac22c5ba7e44d5460d6a078d2431680a | |
parent | 8ff041dab354609b730849320f4f31659089b37e (diff) | |
download | Qt-b2d9dc8c487a8b87347a7d45a6c4f9dc827ddbfe.zip Qt-b2d9dc8c487a8b87347a7d45a6c4f9dc827ddbfe.tar.gz Qt-b2d9dc8c487a8b87347a7d45a6c4f9dc827ddbfe.tar.bz2 |
Add #define's for highp/mediump after #version/#extension headers
GLSL shaders require that #version and #extension must appear
before any other code. The #define's we insert for highp/mediump/etc
must therefore be moved down to just after them.
Reviewed-by: Gunnar Sletta
-rw-r--r-- | src/opengl/qglshaderprogram.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/opengl/qglshaderprogram.cpp b/src/opengl/qglshaderprogram.cpp index c4d9322..56b55d0 100644 --- a/src/opengl/qglshaderprogram.cpp +++ b/src/opengl/qglshaderprogram.cpp @@ -501,6 +501,25 @@ bool QGLShader::compile(const char *source) return d->compile(this); } else if (d->shader) { QVarLengthArray<const char *> src; + int headerLen = 0; + while (source && source[headerLen] == '#') { + // Skip #version and #extension directives at the start of + // the shader code. We need to insert the qualifierDefines + // and redefineHighp just after them. + if (qstrncmp(source + headerLen, "#version", 8) != 0 && + qstrncmp(source + headerLen, "#extension", 10) != 0) { + break; + } + while (source[headerLen] != '\0' && source[headerLen] != '\n') + ++headerLen; + if (source[headerLen] == '\n') + ++headerLen; + } + QByteArray header; + if (headerLen > 0) { + header = QByteArray(source, headerLen); + src.append(header.constData()); + } #ifdef QGL_DEFINE_QUALIFIERS src.append(qualifierDefines); #endif @@ -509,7 +528,7 @@ bool QGLShader::compile(const char *source) d->shaderType == PartialFragmentShader) src.append(redefineHighp); #endif - src.append(source); + src.append(source + headerLen); QGLContextGroup *ctx = d->ctx; glShaderSource(d->shader, src.size(), src.data(), 0); return d->compile(this); |