OpenGL: Add support for the Compute shader stage
Change-Id: Ibb1b79358758c2adf818af8c6fcd5c379efad8c3 Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
This commit is contained in:
parent
7e5d1c1c2f
commit
8c4d02ef87
@ -108,6 +108,7 @@ typedef GLfloat GLdouble;
|
|||||||
# endif
|
# endif
|
||||||
#if !defined(Q_OS_MAC)
|
#if !defined(Q_OS_MAC)
|
||||||
# define QT_OPENGL_4
|
# define QT_OPENGL_4
|
||||||
|
# define QT_OPENGL_4_3
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -156,6 +156,8 @@ QT_BEGIN_NAMESPACE
|
|||||||
shading language (GLSL), based on the core feature (requires OpenGL >= 4.0).
|
shading language (GLSL), based on the core feature (requires OpenGL >= 4.0).
|
||||||
\value TessellationEvaluation Tessellation evaluation shaders written in the OpenGL
|
\value TessellationEvaluation Tessellation evaluation shaders written in the OpenGL
|
||||||
shading language (GLSL), based on the core feature (requires OpenGL >= 4.0).
|
shading language (GLSL), based on the core feature (requires OpenGL >= 4.0).
|
||||||
|
\value Compute Compute shaders written in the OpenGL shading language (GLSL),
|
||||||
|
based on the core feature (requires OpenGL >= 4.3).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class QOpenGLShaderPrivate : public QObjectPrivate
|
class QOpenGLShaderPrivate : public QObjectPrivate
|
||||||
@ -235,6 +237,10 @@ bool QOpenGLShaderPrivate::create()
|
|||||||
shader = glfuncs->glCreateShader(GL_TESS_CONTROL_SHADER);
|
shader = glfuncs->glCreateShader(GL_TESS_CONTROL_SHADER);
|
||||||
} else if (shaderType == QOpenGLShader::TessellationEvaluation && supportsTessellationShaders) {
|
} else if (shaderType == QOpenGLShader::TessellationEvaluation && supportsTessellationShaders) {
|
||||||
shader = glfuncs->glCreateShader(GL_TESS_EVALUATION_SHADER);
|
shader = glfuncs->glCreateShader(GL_TESS_EVALUATION_SHADER);
|
||||||
|
#endif
|
||||||
|
#if defined(QT_OPENGL_4_3)
|
||||||
|
} else if (shaderType == QOpenGLShader::Compute) {
|
||||||
|
shader = glfuncs->glCreateShader(GL_COMPUTE_SHADER);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
shader = glfuncs->glCreateShader(GL_FRAGMENT_SHADER);
|
shader = glfuncs->glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
@ -3230,7 +3236,7 @@ bool QOpenGLShader::hasOpenGLShaders(ShaderType type, QOpenGLContext *context)
|
|||||||
if (!context)
|
if (!context)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if ((type & ~(Geometry | Vertex | Fragment | TessellationControl | TessellationEvaluation)) || type == 0)
|
if ((type & ~(Geometry | Vertex | Fragment | TessellationControl | TessellationEvaluation | Compute)) || type == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
QSurfaceFormat format = context->format();
|
QSurfaceFormat format = context->format();
|
||||||
@ -3249,6 +3255,13 @@ bool QOpenGLShader::hasOpenGLShaders(ShaderType type, QOpenGLContext *context)
|
|||||||
#else
|
#else
|
||||||
// No tessellation shader support in OpenGL ES2
|
// No tessellation shader support in OpenGL ES2
|
||||||
return false;
|
return false;
|
||||||
|
#endif
|
||||||
|
} else if (type == Compute) {
|
||||||
|
#if defined(QT_OPENGL_4_3)
|
||||||
|
return (format.version() >= qMakePair<int, int>(4, 3));
|
||||||
|
#else
|
||||||
|
// No compute shader support without OpenGL 4.3 or newer
|
||||||
|
return false;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +67,8 @@ public:
|
|||||||
Fragment = 0x0002,
|
Fragment = 0x0002,
|
||||||
Geometry = 0x0004,
|
Geometry = 0x0004,
|
||||||
TessellationControl = 0x0008,
|
TessellationControl = 0x0008,
|
||||||
TessellationEvaluation = 0x0010
|
TessellationEvaluation = 0x0010,
|
||||||
|
Compute = 0x0020
|
||||||
};
|
};
|
||||||
Q_DECLARE_FLAGS(ShaderType, ShaderTypeBit)
|
Q_DECLARE_FLAGS(ShaderType, ShaderTypeBit)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user