summaryrefslogtreecommitdiffstats
path: root/src/opengl/qglshaderprogram.cpp
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@digia.com>2013-02-06 22:36:27 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-02-17 20:31:30 +0100
commit159f42222d06acd9a7ea9b25167e52060d47ab4c (patch)
tree0c0e18cdf8ce605d147df8ac738ce0ffa07a4d75 /src/opengl/qglshaderprogram.cpp
parent3250ec0c8f9666cd3dbb724894cd529d5af51ffb (diff)
Remove duplicated code for handling OpenGL extensions in QtOpenGL
We now re-use QOpenGLExtensions/Functions from QtGui in the same way as QtGui uses these classes. There is still some duplicated logic in qglfunctions.cpp, but this code now at least uses the shared QOpenGLExtensionMatcher class. Change-Id: Ie04008c43d430ae805e6ec1c45e7e363deeb3b8f Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
Diffstat (limited to 'src/opengl/qglshaderprogram.cpp')
-rw-r--r--src/opengl/qglshaderprogram.cpp299
1 files changed, 145 insertions, 154 deletions
diff --git a/src/opengl/qglshaderprogram.cpp b/src/opengl/qglshaderprogram.cpp
index 537921bdc4..4859df21d6 100644
--- a/src/opengl/qglshaderprogram.cpp
+++ b/src/opengl/qglshaderprogram.cpp
@@ -40,7 +40,7 @@
****************************************************************************/
#include "qglshaderprogram.h"
-#include "qglextensions_p.h"
+#include <private/qopenglextensions_p.h>
#include "qgl_p.h"
#include <QtCore/private/qobject_p.h>
#include <QtCore/qdebug.h>
@@ -197,10 +197,11 @@ class QGLShaderPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QGLShader)
public:
- QGLShaderPrivate(const QGLContext *, QGLShader::ShaderType type)
+ QGLShaderPrivate(const QGLContext *ctx, QGLShader::ShaderType type)
: shaderGuard(0)
, shaderType(type)
, compiled(false)
+ , glfuncs(new QOpenGLFunctions(ctx->contextHandle()))
{
}
~QGLShaderPrivate();
@@ -210,6 +211,8 @@ public:
bool compiled;
QString log;
+ QOpenGLFunctions *glfuncs;
+
bool create();
bool compile(QGLShader *q);
void deleteShader();
@@ -218,8 +221,8 @@ public:
namespace {
void freeShaderFunc(QGLContext *ctx, GLuint id)
{
- Q_UNUSED(ctx);
- glDeleteShader(id);
+ Q_ASSERT(ctx);
+ ctx->contextHandle()->functions()->glDeleteShader(id);
}
}
@@ -227,6 +230,7 @@ namespace {
QGLShaderPrivate::~QGLShaderPrivate()
{
+ delete glfuncs;
if (shaderGuard)
shaderGuard->free();
}
@@ -236,16 +240,17 @@ bool QGLShaderPrivate::create()
QGLContext *context = const_cast<QGLContext *>(QGLContext::currentContext());
if (!context)
return false;
- if (qt_resolve_glsl_extensions(context)) {
+
+ if (glfuncs->hasOpenGLFeature(QOpenGLFunctions::Shaders)) {
GLuint shader;
if (shaderType == QGLShader::Vertex)
- shader = glCreateShader(GL_VERTEX_SHADER);
+ shader = glfuncs->glCreateShader(GL_VERTEX_SHADER);
#if !defined(QT_OPENGL_ES_2)
else if (shaderType == QGLShader::Geometry)
- shader = glCreateShader(GL_GEOMETRY_SHADER_EXT);
+ shader = glfuncs->glCreateShader(GL_GEOMETRY_SHADER_EXT);
#endif
else
- shader = glCreateShader(GL_FRAGMENT_SHADER);
+ shader = glfuncs->glCreateShader(GL_FRAGMENT_SHADER);
if (!shader) {
qWarning("%s: Could not create shader of type %d.",
Q_FUNC_INFO, int(shaderType));
@@ -263,16 +268,16 @@ bool QGLShaderPrivate::compile(QGLShader *q)
GLuint shader = shaderGuard ? shaderGuard->id() : 0;
if (!shader)
return false;
- glCompileShader(shader);
+ glfuncs->glCompileShader(shader);
GLint value = 0;
- glGetShaderiv(shader, GL_COMPILE_STATUS, &value);
+ glfuncs->glGetShaderiv(shader, GL_COMPILE_STATUS, &value);
compiled = (value != 0);
value = 0;
- glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &value);
+ glfuncs->glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &value);
if (!compiled && value > 1) {
char *logbuf = new char [value];
GLint len;
- glGetShaderInfoLog(shader, value, &len, logbuf);
+ glfuncs->glGetShaderInfoLog(shader, value, &len, logbuf);
log = QString::fromLatin1(logbuf);
QString name = q->objectName();
@@ -434,7 +439,7 @@ bool QGLShader::compileSourceCode(const char *source)
#endif
src.append(source + headerLen);
srclen.append(GLint(qstrlen(source + headerLen)));
- glShaderSource(d->shaderGuard->id(), src.size(), src.data(), srclen.data());
+ d->glfuncs->glShaderSource(d->shaderGuard->id(), src.size(), src.data(), srclen.data());
return d->compile(this);
} else {
return false;
@@ -498,12 +503,12 @@ QByteArray QGLShader::sourceCode() const
if (!shader)
return QByteArray();
GLint size = 0;
- glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &size);
+ d->glfuncs->glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &size);
if (size <= 0)
return QByteArray();
GLint len = 0;
char *source = new char [size];
- glGetShaderSource(shader, size, &len, source);
+ d->glfuncs->glGetShaderSource(shader, size, &len, source);
QByteArray src(source);
delete [] source;
return src;
@@ -544,6 +549,32 @@ GLuint QGLShader::shaderId() const
#undef ctx
+class ShaderProgramOpenGLFunctions : public QOpenGLFunctions
+{
+public:
+ ShaderProgramOpenGLFunctions()
+ : QOpenGLFunctions()
+ , glProgramParameteri(0)
+ {
+ }
+
+ typedef void (QOPENGLF_APIENTRYP type_glProgramParameteri)(GLuint program, GLenum pname, GLint value);
+
+ void initializeGeometryShaderFunctions()
+ {
+ QOpenGLContext *context = QOpenGLContext::currentContext();
+ glProgramParameteri = (type_glProgramParameteri)
+ context->getProcAddress("glProgramParameteri");
+
+ if (!glProgramParameteri) {
+ glProgramParameteri = (type_glProgramParameteri)
+ context->getProcAddress("glProgramParameteriEXT");
+ }
+ }
+
+ type_glProgramParameteri glProgramParameteri;
+};
+
class QGLShaderProgramPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QGLShaderProgram)
@@ -556,6 +587,7 @@ public:
, geometryVertexCount(64)
, geometryInputType(0)
, geometryOutputType(0)
+ , glfuncs(new ShaderProgramOpenGLFunctions)
{
}
~QGLShaderProgramPrivate();
@@ -573,20 +605,23 @@ public:
QList<QGLShader *> shaders;
QList<QGLShader *> anonShaders;
+ ShaderProgramOpenGLFunctions *glfuncs;
+
bool hasShader(QGLShader::ShaderType type) const;
};
namespace {
void freeProgramFunc(QGLContext *ctx, GLuint id)
{
- Q_UNUSED(ctx);
- glDeleteProgram(id);
+ Q_ASSERT(ctx);
+ ctx->contextHandle()->functions()->glDeleteProgram(id);
}
}
QGLShaderProgramPrivate::~QGLShaderProgramPrivate()
{
+ delete glfuncs;
if (programGuard)
programGuard->free();
}
@@ -644,8 +679,10 @@ bool QGLShaderProgram::init()
QGLContext *context = const_cast<QGLContext *>(QGLContext::currentContext());
if (!context)
return false;
- if (qt_resolve_glsl_extensions(context)) {
- GLuint program = glCreateProgram();
+ d->glfuncs->initializeOpenGLFunctions();
+ d->glfuncs->initializeGeometryShaderFunctions();
+ if (d->glfuncs->hasOpenGLFeature(QOpenGLFunctions::Shaders)) {
+ GLuint program = d->glfuncs->glCreateProgram();
if (!program) {
qWarning() << "QGLShaderProgram: could not create shader program";
return false;
@@ -686,7 +723,7 @@ bool QGLShaderProgram::addShader(QGLShader *shader)
qWarning("QGLShaderProgram::addShader: Program and shader are not associated with same context.");
return false;
}
- glAttachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
+ d->glfuncs->glAttachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
d->linked = false; // Program needs to be relinked.
d->shaders.append(shader);
connect(shader, SIGNAL(destroyed()), this, SLOT(shaderDestroyed()));
@@ -805,7 +842,7 @@ void QGLShaderProgram::removeShader(QGLShader *shader)
if (d->programGuard && d->programGuard->id()
&& shader && shader->d_func()->shaderGuard)
{
- glDetachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
+ d->glfuncs->glDetachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
}
d->linked = false; // Program needs to be relinked.
if (shader) {
@@ -843,7 +880,7 @@ void QGLShaderProgram::removeAllShaders()
if (d->programGuard && d->programGuard->id()
&& shader && shader->d_func()->shaderGuard)
{
- glDetachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
+ d->glfuncs->glDetachShader(d->programGuard->id(), shader->d_func()->shaderGuard->id());
}
}
foreach (QGLShader *shader, d->anonShaders) {
@@ -884,7 +921,7 @@ bool QGLShaderProgram::link()
// or otherwise populated the shaders itself. Check to see if the
// program is already linked and bail out if so.
value = 0;
- glGetProgramiv(program, GL_LINK_STATUS, &value);
+ d->glfuncs->glGetProgramiv(program, GL_LINK_STATUS, &value);
d->linked = (value != 0);
if (d->linked)
return true;
@@ -892,14 +929,14 @@ bool QGLShaderProgram::link()
#if !defined(QT_OPENGL_ES_2)
// Set up the geometry shader parameters
- if (glProgramParameteriEXT) {
+ if (d->glfuncs->glProgramParameteri) {
foreach (QGLShader *shader, d->shaders) {
if (shader->shaderType() & QGLShader::Geometry) {
- glProgramParameteriEXT(program, GL_GEOMETRY_INPUT_TYPE_EXT,
+ d->glfuncs->glProgramParameteri(program, GL_GEOMETRY_INPUT_TYPE_EXT,
d->geometryInputType);
- glProgramParameteriEXT(program, GL_GEOMETRY_OUTPUT_TYPE_EXT,
+ d->glfuncs->glProgramParameteri(program, GL_GEOMETRY_OUTPUT_TYPE_EXT,
d->geometryOutputType);
- glProgramParameteriEXT(program, GL_GEOMETRY_VERTICES_OUT_EXT,
+ d->glfuncs->glProgramParameteri(program, GL_GEOMETRY_VERTICES_OUT_EXT,
d->geometryVertexCount);
break;
}
@@ -907,17 +944,17 @@ bool QGLShaderProgram::link()
}
#endif
- glLinkProgram(program);
+ d->glfuncs->glLinkProgram(program);
value = 0;
- glGetProgramiv(program, GL_LINK_STATUS, &value);
+ d->glfuncs->glGetProgramiv(program, GL_LINK_STATUS, &value);
d->linked = (value != 0);
value = 0;
- glGetProgramiv(program, GL_INFO_LOG_LENGTH, &value);
+ d->glfuncs->glGetProgramiv(program, GL_INFO_LOG_LENGTH, &value);
d->log = QString();
if (value > 1) {
char *logbuf = new char [value];
GLint len;
- glGetProgramInfoLog(program, value, &len, logbuf);
+ d->glfuncs->glGetProgramInfoLog(program, value, &len, logbuf);
d->log = QString::fromLatin1(logbuf);
QString name = objectName();
if (name.isEmpty())
@@ -976,7 +1013,7 @@ bool QGLShaderProgram::bind()
return false;
}
#endif
- glUseProgram(program);
+ d->glfuncs->glUseProgram(program);
return true;
}
@@ -991,17 +1028,12 @@ bool QGLShaderProgram::bind()
*/
void QGLShaderProgram::release()
{
-#ifndef QT_NO_DEBUG
Q_D(QGLShaderProgram);
+#ifndef QT_NO_DEBUG
if (d->programGuard && d->programGuard->group() != QOpenGLContextGroup::currentContextGroup())
qWarning("QGLShaderProgram::release: program is not valid in the current context.");
#endif
-#if defined(QT_OPENGL_ES_2)
- glUseProgram(0);
-#else
- if (glUseProgram)
- glUseProgram(0);
-#endif
+ d->glfuncs->glUseProgram(0);
}
/*!
@@ -1040,7 +1072,7 @@ void QGLShaderProgram::bindAttributeLocation(const char *name, int location)
Q_D(QGLShaderProgram);
if (!init() || !d->programGuard || !d->programGuard->id())
return;
- glBindAttribLocation(d->programGuard->id(), location, name);
+ d->glfuncs->glBindAttribLocation(d->programGuard->id(), location, name);
d->linked = false; // Program needs to be relinked.
}
@@ -1091,7 +1123,7 @@ int QGLShaderProgram::attributeLocation(const char *name) const
{
Q_D(const QGLShaderProgram);
if (d->linked && d->programGuard && d->programGuard->id()) {
- return glGetAttribLocation(d->programGuard->id(), name);
+ return d->glfuncs->glGetAttribLocation(d->programGuard->id(), name);
} else {
qWarning() << "QGLShaderProgram::attributeLocation(" << name
<< "): shader program is not linked";
@@ -1137,7 +1169,7 @@ void QGLShaderProgram::setAttributeValue(int location, GLfloat value)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glVertexAttrib1fv(location, &value);
+ d->glfuncs->glVertexAttrib1fv(location, &value);
}
/*!
@@ -1164,7 +1196,7 @@ void QGLShaderProgram::setAttributeValue(int location, GLfloat x, GLfloat y)
Q_UNUSED(d);
if (location != -1) {
GLfloat values[2] = {x, y};
- glVertexAttrib2fv(location, values);
+ d->glfuncs->glVertexAttrib2fv(location, values);
}
}
@@ -1194,7 +1226,7 @@ void QGLShaderProgram::setAttributeValue
Q_UNUSED(d);
if (location != -1) {
GLfloat values[3] = {x, y, z};
- glVertexAttrib3fv(location, values);
+ d->glfuncs->glVertexAttrib3fv(location, values);
}
}
@@ -1225,7 +1257,7 @@ void QGLShaderProgram::setAttributeValue
Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {x, y, z, w};
- glVertexAttrib4fv(location, values);
+ d->glfuncs->glVertexAttrib4fv(location, values);
}
}
@@ -1253,7 +1285,7 @@ void QGLShaderProgram::setAttributeValue(int location, const QVector2D& value)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glVertexAttrib2fv(location, reinterpret_cast<const GLfloat *>(&value));
+ d->glfuncs->glVertexAttrib2fv(location, reinterpret_cast<const GLfloat *>(&value));
}
/*!
@@ -1278,7 +1310,7 @@ void QGLShaderProgram::setAttributeValue(int location, const QVector3D& value)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glVertexAttrib3fv(location, reinterpret_cast<const GLfloat *>(&value));
+ d->glfuncs->glVertexAttrib3fv(location, reinterpret_cast<const GLfloat *>(&value));
}
/*!
@@ -1303,7 +1335,7 @@ void QGLShaderProgram::setAttributeValue(int location, const QVector4D& value)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glVertexAttrib4fv(location, reinterpret_cast<const GLfloat *>(&value));
+ d->glfuncs->glVertexAttrib4fv(location, reinterpret_cast<const GLfloat *>(&value));
}
/*!
@@ -1330,7 +1362,7 @@ void QGLShaderProgram::setAttributeValue(int location, const QColor& value)
if (location != -1) {
GLfloat values[4] = {GLfloat(value.redF()), GLfloat(value.greenF()),
GLfloat(value.blueF()), GLfloat(value.alphaF())};
- glVertexAttrib4fv(location, values);
+ d->glfuncs->glVertexAttrib4fv(location, values);
}
}
@@ -1367,13 +1399,13 @@ void QGLShaderProgram::setAttributeValue
if (location != -1) {
while (columns-- > 0) {
if (rows == 1)
- glVertexAttrib1fv(location, values);
+ d->glfuncs->glVertexAttrib1fv(location, values);
else if (rows == 2)
- glVertexAttrib2fv(location, values);
+ d->glfuncs->glVertexAttrib2fv(location, values);
else if (rows == 3)
- glVertexAttrib3fv(location, values);
+ d->glfuncs->glVertexAttrib3fv(location, values);
else
- glVertexAttrib4fv(location, values);
+ d->glfuncs->glVertexAttrib4fv(location, values);
values += rows;
++location;
}
@@ -1417,7 +1449,7 @@ void QGLShaderProgram::setAttributeArray
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1) {
- glVertexAttribPointer(location, tupleSize, GL_FLOAT, GL_FALSE,
+ d->glfuncs->glVertexAttribPointer(location, tupleSize, GL_FLOAT, GL_FALSE,
stride, values);
}
}
@@ -1441,7 +1473,7 @@ void QGLShaderProgram::setAttributeArray
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1) {
- glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE,
+ d->glfuncs->glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE,
stride, values);
}
}
@@ -1465,7 +1497,7 @@ void QGLShaderProgram::setAttributeArray
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1) {
- glVertexAttribPointer(location, 3, GL_FLOAT, GL_FALSE,
+ d->glfuncs->glVertexAttribPointer(location, 3, GL_FLOAT, GL_FALSE,
stride, values);
}
}
@@ -1489,7 +1521,7 @@ void QGLShaderProgram::setAttributeArray
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1) {
- glVertexAttribPointer(location, 4, GL_FLOAT, GL_FALSE,
+ d->glfuncs->glVertexAttribPointer(location, 4, GL_FLOAT, GL_FALSE,
stride, values);
}
}
@@ -1521,7 +1553,7 @@ void QGLShaderProgram::setAttributeArray
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1) {
- glVertexAttribPointer(location, tupleSize, type, GL_TRUE,
+ d->glfuncs->glVertexAttribPointer(location, tupleSize, type, GL_TRUE,
stride, values);
}
}
@@ -1665,7 +1697,7 @@ void QGLShaderProgram::setAttributeBuffer
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1) {
- glVertexAttribPointer(location, tupleSize, type, GL_TRUE, stride,
+ d->glfuncs->glVertexAttribPointer(location, tupleSize, type, GL_TRUE, stride,
reinterpret_cast<const void *>(offset));
}
}
@@ -1710,7 +1742,7 @@ void QGLShaderProgram::enableAttributeArray(int location)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glEnableVertexAttribArray(location);
+ d->glfuncs->glEnableVertexAttribArray(location);
}
/*!
@@ -1740,7 +1772,7 @@ void QGLShaderProgram::disableAttributeArray(int location)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glDisableVertexAttribArray(location);
+ d->glfuncs->glDisableVertexAttribArray(location);
}
/*!
@@ -1769,7 +1801,7 @@ int QGLShaderProgram::uniformLocation(const char *name) const
Q_D(const QGLShaderProgram);
Q_UNUSED(d);
if (d->linked && d->programGuard && d->programGuard->id()) {
- return glGetUniformLocation(d->programGuard->id(), name);
+ return d->glfuncs->glGetUniformLocation(d->programGuard->id(), name);
} else {
qWarning() << "QGLShaderProgram::uniformLocation(" << name
<< "): shader program is not linked";
@@ -1815,7 +1847,7 @@ void QGLShaderProgram::setUniformValue(int location, GLfloat value)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glUniform1fv(location, 1, &value);
+ d->glfuncs->glUniform1fv(location, 1, &value);
}
/*!
@@ -1841,7 +1873,7 @@ void QGLShaderProgram::setUniformValue(int location, GLint value)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glUniform1i(location, value);
+ d->glfuncs->glUniform1i(location, value);
}
/*!
@@ -1868,7 +1900,7 @@ void QGLShaderProgram::setUniformValue(int location, GLuint value)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glUniform1i(location, value);
+ d->glfuncs->glUniform1i(location, value);
}
/*!
@@ -1896,7 +1928,7 @@ void QGLShaderProgram::setUniformValue(int location, GLfloat x, GLfloat y)
Q_UNUSED(d);
if (location != -1) {
GLfloat values[2] = {x, y};
- glUniform2fv(location, 1, values);
+ d->glfuncs->glUniform2fv(location, 1, values);
}
}
@@ -1926,7 +1958,7 @@ void QGLShaderProgram::setUniformValue
Q_UNUSED(d);
if (location != -1) {
GLfloat values[3] = {x, y, z};
- glUniform3fv(location, 1, values);
+ d->glfuncs->glUniform3fv(location, 1, values);
}
}
@@ -1957,7 +1989,7 @@ void QGLShaderProgram::setUniformValue
Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {x, y, z, w};
- glUniform4fv(location, 1, values);
+ d->glfuncs->glUniform4fv(location, 1, values);
}
}
@@ -1985,7 +2017,7 @@ void QGLShaderProgram::setUniformValue(int location, const QVector2D& value)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glUniform2fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
+ d->glfuncs->glUniform2fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
}
/*!
@@ -2011,7 +2043,7 @@ void QGLShaderProgram::setUniformValue(int location, const QVector3D& value)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glUniform3fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
+ d->glfuncs->glUniform3fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
}
/*!
@@ -2037,7 +2069,7 @@ void QGLShaderProgram::setUniformValue(int location, const QVector4D& value)
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glUniform4fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
+ d->glfuncs->glUniform4fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
}
/*!
@@ -2066,7 +2098,7 @@ void QGLShaderProgram::setUniformValue(int location, const QColor& color)
if (location != -1) {
GLfloat values[4] = {GLfloat(color.redF()), GLfloat(color.greenF()),
GLfloat(color.blueF()), GLfloat(color.alphaF())};
- glUniform4fv(location, 1, values);
+ d->glfuncs->glUniform4fv(location, 1, values);
}
}
@@ -2095,7 +2127,7 @@ void QGLShaderProgram::setUniformValue(int location, const QPoint& point)
Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {GLfloat(point.x()), GLfloat(point.y())};
- glUniform2fv(location, 1, values);
+ d->glfuncs->glUniform2fv(location, 1, values);
}
}
@@ -2124,7 +2156,7 @@ void QGLShaderProgram::setUniformValue(int location, const QPointF& point)
Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {GLfloat(point.x()), GLfloat(point.y())};
- glUniform2fv(location, 1, values);
+ d->glfuncs->glUniform2fv(location, 1, values);
}
}
@@ -2153,7 +2185,7 @@ void QGLShaderProgram::setUniformValue(int location, const QSize& size)
Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {GLfloat(size.width()), GLfloat(size.height())};
- glUniform2fv(location, 1, values);
+ d->glfuncs->glUniform2fv(location, 1, values);
}
}
@@ -2182,7 +2214,7 @@ void QGLShaderProgram::setUniformValue(int location, const QSizeF& size)
Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {GLfloat(size.width()), GLfloat(size.height())};
- glUniform2fv(location, 1, values);
+ d->glfuncs->glUniform2fv(location, 1, values);
}
}
@@ -2208,8 +2240,7 @@ void QGLShaderProgram::setUniformValue(const char *name, const QSizeF& size)
void QGLShaderProgram::setUniformValue(int location, const QMatrix2x2& value)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- glUniformMatrix2fv(location, 1, GL_FALSE, value.constData());
+ d->glfuncs->glUniformMatrix2fv(location, 1, GL_FALSE, value.constData());
}
/*!
@@ -2234,8 +2265,7 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix2x2& value
void QGLShaderProgram::setUniformValue(int location, const QMatrix2x3& value)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- glUniform3fv(location, 2, value.constData());
+ d->glfuncs->glUniform3fv(location, 2, value.constData());
}
/*!
@@ -2260,8 +2290,7 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix2x3& value
void QGLShaderProgram::setUniformValue(int location, const QMatrix2x4& value)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- glUniform4fv(location, 2, value.constData());
+ d->glfuncs->glUniform4fv(location, 2, value.constData());
}
/*!
@@ -2286,8 +2315,7 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix2x4& value
void QGLShaderProgram::setUniformValue(int location, const QMatrix3x2& value)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- glUniform2fv(location, 3, value.constData());
+ d->glfuncs->glUniform2fv(location, 3, value.constData());
}
/*!
@@ -2312,8 +2340,7 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix3x2& value
void QGLShaderProgram::setUniformValue(int location, const QMatrix3x3& value)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- glUniformMatrix3fv(location, 1, GL_FALSE, value.constData());
+ d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, value.constData());
}
/*!
@@ -2338,8 +2365,7 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix3x3& value
void QGLShaderProgram::setUniformValue(int location, const QMatrix3x4& value)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- glUniform4fv(location, 3, value.constData());
+ d->glfuncs->glUniform4fv(location, 3, value.constData());
}
/*!
@@ -2364,8 +2390,7 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix3x4& value
void QGLShaderProgram::setUniformValue(int location, const QMatrix4x2& value)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- glUniform2fv(location, 4, value.constData());
+ d->glfuncs->glUniform2fv(location, 4, value.constData());
}
/*!
@@ -2390,8 +2415,7 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix4x2& value
void QGLShaderProgram::setUniformValue(int location, const QMatrix4x3& value)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- glUniform3fv(location, 4, value.constData());
+ d->glfuncs->glUniform3fv(location, 4, value.constData());
}
/*!
@@ -2416,8 +2440,7 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix4x3& value
void QGLShaderProgram::setUniformValue(int location, const QMatrix4x4& value)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
- glUniformMatrix4fv(location, 1, GL_FALSE, value.constData());
+ d->glfuncs->glUniformMatrix4fv(location, 1, GL_FALSE, value.constData());
}
/*!
@@ -2446,9 +2469,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix4x4& value
void QGLShaderProgram::setUniformValue(int location, const GLfloat value[2][2])
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
if (location != -1)
- glUniformMatrix2fv(location, 1, GL_FALSE, value[0]);
+ d->glfuncs->glUniformMatrix2fv(location, 1, GL_FALSE, value[0]);
}
/*!
@@ -2464,9 +2486,8 @@ void QGLShaderProgram::setUniformValue(int location, const GLfloat value[2][2])
void QGLShaderProgram::setUniformValue(int location, const GLfloat value[3][3])
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
if (location != -1)
- glUniformMatrix3fv(location, 1, GL_FALSE, value[0]);
+ d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, value[0]);
}
/*!
@@ -2481,9 +2502,8 @@ void QGLShaderProgram::setUniformValue(int location, const GLfloat value[3][3])
void QGLShaderProgram::setUniformValue(int location, const GLfloat value[4][4])
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
if (location != -1)
- glUniformMatrix4fv(location, 1, GL_FALSE, value[0]);
+ d->glfuncs->glUniformMatrix4fv(location, 1, GL_FALSE, value[0]);
}
@@ -2541,14 +2561,13 @@ void QGLShaderProgram::setUniformValue(const char *name, const GLfloat value[4][
void QGLShaderProgram::setUniformValue(int location, const QTransform& value)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
if (location != -1) {
GLfloat mat[3][3] = {
{GLfloat(value.m11()), GLfloat(value.m12()), GLfloat(value.m13())},
{GLfloat(value.m21()), GLfloat(value.m22()), GLfloat(value.m23())},
{GLfloat(value.m31()), GLfloat(value.m32()), GLfloat(value.m33())}
};
- glUniformMatrix3fv(location, 1, GL_FALSE, mat[0]);
+ d->glfuncs->glUniformMatrix3fv(location, 1, GL_FALSE, mat[0]);
}
}
@@ -2576,9 +2595,8 @@ void QGLShaderProgram::setUniformValue
void QGLShaderProgram::setUniformValueArray(int location, const GLint *values, int count)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
if (location != -1)
- glUniform1iv(location, count, values);
+ d->glfuncs->glUniform1iv(location, count, values);
}
/*!
@@ -2605,9 +2623,8 @@ void QGLShaderProgram::setUniformValueArray
void QGLShaderProgram::setUniformValueArray(int location, const GLuint *values, int count)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
if (location != -1)
- glUniform1iv(location, count, reinterpret_cast<const GLint *>(values));
+ d->glfuncs->glUniform1iv(location, count, reinterpret_cast<const GLint *>(values));
}
/*!
@@ -2635,16 +2652,15 @@ void QGLShaderProgram::setUniformValueArray
void QGLShaderProgram::setUniformValueArray(int location, const GLfloat *values, int count, int tupleSize)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
if (location != -1) {
if (tupleSize == 1)
- glUniform1fv(location, count, values);
+ d->glfuncs->glUniform1fv(location, count, values);
else if (tupleSize == 2)
- glUniform2fv(location, count, values);
+ d->glfuncs->glUniform2fv(location, count, values);
else if (tupleSize == 3)
- glUniform3fv(location, count, values);
+ d->glfuncs->glUniform3fv(location, count, values);
else if (tupleSize == 4)
- glUniform4fv(location, count, values);
+ d->glfuncs->glUniform4fv(location, count, values);
else
qWarning() << "QGLShaderProgram::setUniformValue: size" << tupleSize << "not supported";
}
@@ -2674,9 +2690,8 @@ void QGLShaderProgram::setUniformValueArray
void QGLShaderProgram::setUniformValueArray(int location, const QVector2D *values, int count)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
if (location != -1)
- glUniform2fv(location, count, reinterpret_cast<const GLfloat *>(values));
+ d->glfuncs->glUniform2fv(location, count, reinterpret_cast<const GLfloat *>(values));
}
/*!
@@ -2701,9 +2716,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QVector2D *v
void QGLShaderProgram::setUniformValueArray(int location, const QVector3D *values, int count)
{
Q_D(QGLShaderProgram);
- Q_UNUSED(d);
if (location != -1)
- glUniform3fv(location, count, reinterpret_cast<const GLfloat *>(values));
+ d->glfuncs->glUniform3fv(location, count, reinterpret_cast<const GLfloat *>(values));
}
/*!
@@ -2730,7 +2744,7 @@ void QGLShaderProgram::setUniformValueArray(int location, const QVector4D *value
Q_D(QGLShaderProgram);
Q_UNUSED(d);
if (location != -1)
- glUniform4fv(location, count, reinterpret_cast<const GLfloat *>(values));
+ d->glfuncs->glUniform4fv(location, count, reinterpret_cast<const GLfloat *>(values));
}
/*!
@@ -2763,32 +2777,7 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QVector4D *v
} \
func(location, count, GL_FALSE, temp.constData()); \
}
-#if !defined(QT_OPENGL_ES_2)
-#define setUniformGenericMatrixArray(func,colfunc,location,values,count,type,cols,rows) \
- if (location == -1 || count <= 0) \
- return; \
- if (sizeof(type) == sizeof(GLfloat) * cols * rows) { \
- const GLfloat *data = reinterpret_cast<const GLfloat *> \
- (values[0].constData()); \
- if (func) \
- func(location, count, GL_FALSE, data); \
- else \
- colfunc(location, count * cols, data); \
- } else { \
- QVarLengthArray<GLfloat> temp(cols * rows * count); \
- for (int index = 0; index < count; ++index) { \
- for (int index2 = 0; index2 < (cols * rows); ++index2) { \
- temp.data()[cols * rows * index + index2] = \
- values[index].constData()[index2]; \
- } \
- } \
- if (func) \
- func(location, count, GL_FALSE, temp.constData()); \
- else \
- colfunc(location, count * cols, temp.constData()); \
- }
-#else
-#define setUniformGenericMatrixArray(func,colfunc,location,values,count,type,cols,rows) \
+#define setUniformGenericMatrixArray(colfunc,location,values,count,type,cols,rows) \
if (location == -1 || count <= 0) \
return; \
if (sizeof(type) == sizeof(GLfloat) * cols * rows) { \
@@ -2805,7 +2794,6 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QVector4D *v
} \
colfunc(location, count * cols, temp.constData()); \
}
-#endif
/*!
Sets the uniform variable array at \a location in the current
@@ -2818,7 +2806,7 @@ void QGLShaderProgram::setUniformValueArray(int location, const QMatrix2x2 *valu
Q_D(QGLShaderProgram);
Q_UNUSED(d);
setUniformMatrixArray
- (glUniformMatrix2fv, location, values, count, QMatrix2x2, 2, 2);
+ (d->glfuncs->glUniformMatrix2fv, location, values, count, QMatrix2x2, 2, 2);
}
/*!
@@ -2845,7 +2833,7 @@ void QGLShaderProgram::setUniformValueArray(int location, const QMatrix2x3 *valu
Q_D(QGLShaderProgram);
Q_UNUSED(d);
setUniformGenericMatrixArray
- (glUniformMatrix2x3fv, glUniform3fv, location, values, count,
+ (d->glfuncs->glUniform3fv, location, values, count,
QMatrix2x3, 2, 3);
}
@@ -2873,7 +2861,7 @@ void QGLShaderProgram::setUniformValueArray(int location, const QMatrix2x4 *valu
Q_D(QGLShaderProgram);
Q_UNUSED(d);
setUniformGenericMatrixArray
- (glUniformMatrix2x4fv, glUniform4fv, location, values, count,
+ (d->glfuncs->glUniform4fv, location, values, count,
QMatrix2x4, 2, 4);
}
@@ -2901,7 +2889,7 @@ void QGLShaderProgram::setUniformValueArray(int location, const QMatrix3x2 *valu
Q_D(QGLShaderProgram);
Q_UNUSED(d);
setUniformGenericMatrixArray
- (glUniformMatrix3x2fv, glUniform2fv, location, values, count,
+ (d->glfuncs->glUniform2fv, location, values, count,
QMatrix3x2, 3, 2);
}
@@ -2929,7 +2917,7 @@ void QGLShaderProgram::setUniformValueArray(int location, const QMatrix3x3 *valu
Q_D(QGLShaderProgram);
Q_UNUSED(d);
setUniformMatrixArray
- (glUniformMatrix3fv, location, values, count, QMatrix3x3, 3, 3);
+ (d->glfuncs->glUniformMatrix3fv, location, values, count, QMatrix3x3, 3, 3);
}
/*!
@@ -2956,7 +2944,7 @@ void QGLShaderProgram::setUniformValueArray(int location, const QMatrix3x4 *valu
Q_D(QGLShaderProgram);
Q_UNUSED(d);
setUniformGenericMatrixArray
- (glUniformMatrix3x4fv, glUniform4fv, location, values, count,
+ (d->glfuncs->glUniform4fv, location, values, count,
QMatrix3x4, 3, 4);
}
@@ -2984,7 +2972,7 @@ void QGLShaderProgram::setUniformValueArray(int location, const QMatrix4x2 *valu
Q_D(QGLShaderProgram);
Q_UNUSED(d);
setUniformGenericMatrixArray
- (glUniformMatrix4x2fv, glUniform2fv, location, values, count,
+ (d->glfuncs->glUniform2fv, location, values, count,
QMatrix4x2, 4, 2);
}
@@ -3012,7 +3000,7 @@ void QGLShaderProgram::setUniformValueArray(int location, const QMatrix4x3 *valu
Q_D(QGLShaderProgram);
Q_UNUSED(d);
setUniformGenericMatrixArray
- (glUniformMatrix4x3fv, glUniform3fv, location, values, count,
+ (d->glfuncs->glUniform3fv, location, values, count,
QMatrix4x3, 4, 3);
}
@@ -3040,7 +3028,7 @@ void QGLShaderProgram::setUniformValueArray(int location, const QMatrix4x4 *valu
Q_D(QGLShaderProgram);
Q_UNUSED(d);
setUniformMatrixArray
- (glUniformMatrix4fv, location, values, count, QMatrix4x4, 4, 4);
+ (d->glfuncs->glUniformMatrix4fv, location, values, count, QMatrix4x4, 4, 4);
}
/*!
@@ -3176,7 +3164,9 @@ bool QGLShaderProgram::hasOpenGLShaderPrograms(const QGLContext *context)
context = QGLContext::currentContext();
if (!context)
return false;
- return qt_resolve_glsl_extensions(const_cast<QGLContext *>(context));
+
+ QOpenGLFunctions functions(context->contextHandle());
+ return functions.hasOpenGLFeature(QOpenGLFunctions::Shaders);
#else
Q_UNUSED(context);
return true;
@@ -3217,7 +3207,8 @@ bool QGLShader::hasOpenGLShaders(ShaderType type, const QGLContext *context)
if ((type & ~(Geometry | Vertex | Fragment)) || type == 0)
return false;
- bool resolved = qt_resolve_glsl_extensions(const_cast<QGLContext *>(context));
+ QOpenGLFunctions functions(context->contextHandle());
+ bool resolved = functions.hasOpenGLFeature(QOpenGLFunctions::Shaders);
if (!resolved)
return false;