1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtGui module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QOPENGLSHADERPROGRAM_H
41#define QOPENGLSHADERPROGRAM_H
42
43#include <QtGui/qtguiglobal.h>
44
45#ifndef QT_NO_OPENGL
46
47#include <QtGui/qopengl.h>
48#include <QtGui/qvector2d.h>
49#include <QtGui/qvector3d.h>
50#include <QtGui/qvector4d.h>
51#include <QtGui/qmatrix4x4.h>
52
53QT_BEGIN_NAMESPACE
54
55
56class QOpenGLContext;
57class QOpenGLShaderProgram;
58class QOpenGLShaderPrivate;
59
60class Q_GUI_EXPORT QOpenGLShader : public QObject
61{
62 Q_OBJECT
63public:
64 enum ShaderTypeBit
65 {
66 Vertex = 0x0001,
67 Fragment = 0x0002,
68 Geometry = 0x0004,
69 TessellationControl = 0x0008,
70 TessellationEvaluation = 0x0010,
71 Compute = 0x0020
72 };
73 Q_DECLARE_FLAGS(ShaderType, ShaderTypeBit)
74
75 explicit QOpenGLShader(QOpenGLShader::ShaderType type, QObject *parent = nullptr);
76 ~QOpenGLShader();
77
78 QOpenGLShader::ShaderType shaderType() const;
79
80 bool compileSourceCode(const char *source);
81 bool compileSourceCode(const QByteArray& source);
82 bool compileSourceCode(const QString& source);
83 bool compileSourceFile(const QString& fileName);
84
85 QByteArray sourceCode() const;
86
87 bool isCompiled() const;
88 QString log() const;
89
90 GLuint shaderId() const;
91
92 static bool hasOpenGLShaders(ShaderType type, QOpenGLContext *context = nullptr);
93
94private:
95 friend class QOpenGLShaderProgram;
96
97 Q_DISABLE_COPY(QOpenGLShader)
98 Q_DECLARE_PRIVATE(QOpenGLShader)
99};
100
101Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLShader::ShaderType)
102
103
104class QOpenGLShaderProgramPrivate;
105
106class Q_GUI_EXPORT QOpenGLShaderProgram : public QObject
107{
108 Q_OBJECT
109public:
110 explicit QOpenGLShaderProgram(QObject *parent = nullptr);
111 ~QOpenGLShaderProgram();
112
113 bool addShader(QOpenGLShader *shader);
114 void removeShader(QOpenGLShader *shader);
115 QList<QOpenGLShader *> shaders() const;
116
117 bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source);
118 bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray& source);
119 bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString& source);
120 bool addShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString& fileName);
121
122 bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source);
123 bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray &source);
124 bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString &source);
125 bool addCacheableShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString &fileName);
126
127 void removeAllShaders();
128
129 virtual bool link();
130 bool isLinked() const;
131 QString log() const;
132
133 bool bind();
134 void release();
135
136 bool create();
137
138 GLuint programId() const;
139
140 int maxGeometryOutputVertices() const;
141
142 void setPatchVertexCount(int count);
143 int patchVertexCount() const;
144
145 void setDefaultOuterTessellationLevels(const QVector<float> &levels);
146 QVector<float> defaultOuterTessellationLevels() const;
147
148 void setDefaultInnerTessellationLevels(const QVector<float> &levels);
149 QVector<float> defaultInnerTessellationLevels() const;
150
151 void bindAttributeLocation(const char *name, int location);
152 void bindAttributeLocation(const QByteArray& name, int location);
153 void bindAttributeLocation(const QString& name, int location);
154
155 int attributeLocation(const char *name) const;
156 int attributeLocation(const QByteArray& name) const;
157 int attributeLocation(const QString& name) const;
158
159 void setAttributeValue(int location, GLfloat value);
160 void setAttributeValue(int location, GLfloat x, GLfloat y);
161 void setAttributeValue(int location, GLfloat x, GLfloat y, GLfloat z);
162 void setAttributeValue(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
163 void setAttributeValue(int location, const QVector2D& value);
164 void setAttributeValue(int location, const QVector3D& value);
165 void setAttributeValue(int location, const QVector4D& value);
166 void setAttributeValue(int location, const QColor& value);
167 void setAttributeValue(int location, const GLfloat *values, int columns, int rows);
168
169 void setAttributeValue(const char *name, GLfloat value);
170 void setAttributeValue(const char *name, GLfloat x, GLfloat y);
171 void setAttributeValue(const char *name, GLfloat x, GLfloat y, GLfloat z);
172 void setAttributeValue(const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
173 void setAttributeValue(const char *name, const QVector2D& value);
174 void setAttributeValue(const char *name, const QVector3D& value);
175 void setAttributeValue(const char *name, const QVector4D& value);
176 void setAttributeValue(const char *name, const QColor& value);
177 void setAttributeValue(const char *name, const GLfloat *values, int columns, int rows);
178
179 void setAttributeArray
180 (int location, const GLfloat *values, int tupleSize, int stride = 0);
181 void setAttributeArray
182 (int location, const QVector2D *values, int stride = 0);
183 void setAttributeArray
184 (int location, const QVector3D *values, int stride = 0);
185 void setAttributeArray
186 (int location, const QVector4D *values, int stride = 0);
187 void setAttributeArray
188 (int location, GLenum type, const void *values, int tupleSize, int stride = 0);
189 void setAttributeArray
190 (const char *name, const GLfloat *values, int tupleSize, int stride = 0);
191 void setAttributeArray
192 (const char *name, const QVector2D *values, int stride = 0);
193 void setAttributeArray
194 (const char *name, const QVector3D *values, int stride = 0);
195 void setAttributeArray
196 (const char *name, const QVector4D *values, int stride = 0);
197 void setAttributeArray
198 (const char *name, GLenum type, const void *values, int tupleSize, int stride = 0);
199
200 void setAttributeBuffer
201 (int location, GLenum type, int offset, int tupleSize, int stride = 0);
202 void setAttributeBuffer
203 (const char *name, GLenum type, int offset, int tupleSize, int stride = 0);
204
205 void enableAttributeArray(int location);
206 void enableAttributeArray(const char *name);
207 void disableAttributeArray(int location);
208 void disableAttributeArray(const char *name);
209
210 int uniformLocation(const char *name) const;
211 int uniformLocation(const QByteArray& name) const;
212 int uniformLocation(const QString& name) const;
213
214 void setUniformValue(int location, GLfloat value);
215 void setUniformValue(int location, GLint value);
216 void setUniformValue(int location, GLuint value);
217 void setUniformValue(int location, GLfloat x, GLfloat y);
218 void setUniformValue(int location, GLfloat x, GLfloat y, GLfloat z);
219 void setUniformValue(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
220 void setUniformValue(int location, const QVector2D& value);
221 void setUniformValue(int location, const QVector3D& value);
222 void setUniformValue(int location, const QVector4D& value);
223 void setUniformValue(int location, const QColor& color);
224 void setUniformValue(int location, const QPoint& point);
225 void setUniformValue(int location, const QPointF& point);
226 void setUniformValue(int location, const QSize& size);
227 void setUniformValue(int location, const QSizeF& size);
228 void setUniformValue(int location, const QMatrix2x2& value);
229 void setUniformValue(int location, const QMatrix2x3& value);
230 void setUniformValue(int location, const QMatrix2x4& value);
231 void setUniformValue(int location, const QMatrix3x2& value);
232 void setUniformValue(int location, const QMatrix3x3& value);
233 void setUniformValue(int location, const QMatrix3x4& value);
234 void setUniformValue(int location, const QMatrix4x2& value);
235 void setUniformValue(int location, const QMatrix4x3& value);
236 void setUniformValue(int location, const QMatrix4x4& value);
237 void setUniformValue(int location, const GLfloat value[2][2]);
238 void setUniformValue(int location, const GLfloat value[3][3]);
239 void setUniformValue(int location, const GLfloat value[4][4]);
240 void setUniformValue(int location, const QTransform& value);
241
242 void setUniformValue(const char *name, GLfloat value);
243 void setUniformValue(const char *name, GLint value);
244 void setUniformValue(const char *name, GLuint value);
245 void setUniformValue(const char *name, GLfloat x, GLfloat y);
246 void setUniformValue(const char *name, GLfloat x, GLfloat y, GLfloat z);
247 void setUniformValue(const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
248 void setUniformValue(const char *name, const QVector2D& value);
249 void setUniformValue(const char *name, const QVector3D& value);
250 void setUniformValue(const char *name, const QVector4D& value);
251 void setUniformValue(const char *name, const QColor& color);
252 void setUniformValue(const char *name, const QPoint& point);
253 void setUniformValue(const char *name, const QPointF& point);
254 void setUniformValue(const char *name, const QSize& size);
255 void setUniformValue(const char *name, const QSizeF& size);
256 void setUniformValue(const char *name, const QMatrix2x2& value);
257 void setUniformValue(const char *name, const QMatrix2x3& value);
258 void setUniformValue(const char *name, const QMatrix2x4& value);
259 void setUniformValue(const char *name, const QMatrix3x2& value);
260 void setUniformValue(const char *name, const QMatrix3x3& value);
261 void setUniformValue(const char *name, const QMatrix3x4& value);
262 void setUniformValue(const char *name, const QMatrix4x2& value);
263 void setUniformValue(const char *name, const QMatrix4x3& value);
264 void setUniformValue(const char *name, const QMatrix4x4& value);
265 void setUniformValue(const char *name, const GLfloat value[2][2]);
266 void setUniformValue(const char *name, const GLfloat value[3][3]);
267 void setUniformValue(const char *name, const GLfloat value[4][4]);
268 void setUniformValue(const char *name, const QTransform& value);
269
270 void setUniformValueArray(int location, const GLfloat *values, int count, int tupleSize);
271 void setUniformValueArray(int location, const GLint *values, int count);
272 void setUniformValueArray(int location, const GLuint *values, int count);
273 void setUniformValueArray(int location, const QVector2D *values, int count);
274 void setUniformValueArray(int location, const QVector3D *values, int count);
275 void setUniformValueArray(int location, const QVector4D *values, int count);
276 void setUniformValueArray(int location, const QMatrix2x2 *values, int count);
277 void setUniformValueArray(int location, const QMatrix2x3 *values, int count);
278 void setUniformValueArray(int location, const QMatrix2x4 *values, int count);
279 void setUniformValueArray(int location, const QMatrix3x2 *values, int count);
280 void setUniformValueArray(int location, const QMatrix3x3 *values, int count);
281 void setUniformValueArray(int location, const QMatrix3x4 *values, int count);
282 void setUniformValueArray(int location, const QMatrix4x2 *values, int count);
283 void setUniformValueArray(int location, const QMatrix4x3 *values, int count);
284 void setUniformValueArray(int location, const QMatrix4x4 *values, int count);
285
286 void setUniformValueArray(const char *name, const GLfloat *values, int count, int tupleSize);
287 void setUniformValueArray(const char *name, const GLint *values, int count);
288 void setUniformValueArray(const char *name, const GLuint *values, int count);
289 void setUniformValueArray(const char *name, const QVector2D *values, int count);
290 void setUniformValueArray(const char *name, const QVector3D *values, int count);
291 void setUniformValueArray(const char *name, const QVector4D *values, int count);
292 void setUniformValueArray(const char *name, const QMatrix2x2 *values, int count);
293 void setUniformValueArray(const char *name, const QMatrix2x3 *values, int count);
294 void setUniformValueArray(const char *name, const QMatrix2x4 *values, int count);
295 void setUniformValueArray(const char *name, const QMatrix3x2 *values, int count);
296 void setUniformValueArray(const char *name, const QMatrix3x3 *values, int count);
297 void setUniformValueArray(const char *name, const QMatrix3x4 *values, int count);
298 void setUniformValueArray(const char *name, const QMatrix4x2 *values, int count);
299 void setUniformValueArray(const char *name, const QMatrix4x3 *values, int count);
300 void setUniformValueArray(const char *name, const QMatrix4x4 *values, int count);
301
302 static bool hasOpenGLShaderPrograms(QOpenGLContext *context = nullptr);
303
304private Q_SLOTS:
305 void shaderDestroyed();
306
307private:
308 Q_DISABLE_COPY(QOpenGLShaderProgram)
309 Q_DECLARE_PRIVATE(QOpenGLShaderProgram)
310
311 bool init();
312};
313
314QT_END_NAMESPACE
315
316#endif // QT_NO_OPENGL
317
318#endif
319