diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2012-10-10 13:13:56 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-02-28 17:11:28 +0100 |
commit | 2c8c0cb33aa8137186e8dde8ecff856a5fbf0c55 (patch) | |
tree | 458d7bbc1fcdc76a6876055aee0cc6c24627bcdf /src/gui/opengl/qopenglshaderprogram.cpp | |
parent | 05a61de622917ba67986afff6288c05a34ff5a90 (diff) |
OpenGL: Reinstate support for OpenGL geometry shaders
Unlike QGLShader, this requires the OpenGL 3.2 core implementation
of geometry shaders to keep the API simple.
Change-Id: Icb07f430c4c5b5d950bcf6f7119becec4cfaad8a
Reviewed-by: James Turner <james.turner@kdab.com>
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
Diffstat (limited to 'src/gui/opengl/qopenglshaderprogram.cpp')
-rw-r--r-- | src/gui/opengl/qopenglshaderprogram.cpp | 56 |
1 files changed, 53 insertions, 3 deletions
diff --git a/src/gui/opengl/qopenglshaderprogram.cpp b/src/gui/opengl/qopenglshaderprogram.cpp index 88c9c8008c..a5c98605b4 100644 --- a/src/gui/opengl/qopenglshaderprogram.cpp +++ b/src/gui/opengl/qopenglshaderprogram.cpp @@ -145,6 +145,8 @@ QT_BEGIN_NAMESPACE \value Vertex Vertex shader written in the OpenGL Shading Language (GLSL). \value Fragment Fragment shader written in the OpenGL Shading Language (GLSL). + \value Geometry Geometry shaders written in the OpenGL Shading Language (GLSL) + based on the OpenGL core feature (requires OpenGL >= 3.2). */ class QOpenGLShaderPrivate : public QObjectPrivate @@ -156,7 +158,17 @@ public: , shaderType(type) , compiled(false) , glfuncs(new QOpenGLFunctions(ctx)) +#ifndef QT_OPENGL_ES_2 + , supportsGeometryShaders(false) +#endif { +#ifndef QT_OPENGL_ES_2 + // Geometry shaders require OpenGL >= 3.2 + if (shaderType & QOpenGLShader::Geometry) { + QSurfaceFormat f = ctx->format(); + supportsGeometryShaders = (f.version() >= qMakePair<int, int>(3, 2)); + } +#endif } ~QOpenGLShaderPrivate(); @@ -167,6 +179,11 @@ public: QOpenGLFunctions *glfuncs; +#ifndef QT_OPENGL_ES_2 + // Support for geometry shaders + bool supportsGeometryShaders; +#endif + bool create(); bool compile(QOpenGLShader *q); void deleteShader(); @@ -192,10 +209,15 @@ bool QOpenGLShaderPrivate::create() if (!context) return false; GLuint shader; - if (shaderType == QOpenGLShader::Vertex) + if (shaderType == QOpenGLShader::Vertex) { shader = glfuncs->glCreateShader(GL_VERTEX_SHADER); - else +#if defined(QT_OPENGL_3_2) + } else if (shaderType == QOpenGLShader::Geometry && supportsGeometryShaders) { + shader = glfuncs->glCreateShader(GL_GEOMETRY_SHADER); +#endif + } else { shader = glfuncs->glCreateShader(GL_FRAGMENT_SHADER); + } if (!shader) { qWarning() << "QOpenGLShader: could not create shader"; return false; @@ -234,6 +256,8 @@ bool QOpenGLShaderPrivate::compile(QOpenGLShader *q) type = types[0]; else if (shaderType == QOpenGLShader::Vertex) type = types[1]; + else if (shaderType == QOpenGLShader::Geometry) + type = types[2]; // Get info and source code lengths GLint infoLogLength = 0; @@ -2927,6 +2951,19 @@ void QOpenGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4 } /*! + Returns the hardware limit for how many vertices a geometry shader + can output. +*/ +int QOpenGLShaderProgram::maxGeometryOutputVertices() const +{ + GLint n = 0; +#if defined(QT_OPENGL_3_2) + glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &n); +#endif + return n; +} + +/*! Returns true if shader programs written in the OpenGL Shading Language (GLSL) are supported on this system; false otherwise. @@ -2972,9 +3009,22 @@ bool QOpenGLShader::hasOpenGLShaders(ShaderType type, QOpenGLContext *context) if (!context) return false; - if ((type & ~(Vertex | Fragment)) || type == 0) + if ((type & ~(Geometry | Vertex | Fragment)) || type == 0) return false; + if (type == Geometry) { +#ifndef QT_OPENGL_ES_2 + // Geometry shaders require OpenGL 3.2 or newer + QSurfaceFormat format = context->format(); + return (format.version() >= qMakePair<int, int>(3, 2)); +#else + // No geometry shader support in OpenGL ES2 + return false; +#endif + } + + // Unconditional support of vertex and fragment shaders implicitly assumes + // a minimum OpenGL version of 2.0 return true; } |