1
/****************************************************************************
3
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4
** Contact: Nokia Corporation (qt-info@nokia.com)
6
** This file is part of the demonstration applications of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL$
10
** Licensees holding valid Qt Commercial licenses may use this file in
11
** accordance with the Qt Commercial License Agreement provided with the
12
** Software or, alternatively, in accordance with the terms contained in
13
** a written agreement between you and Nokia.
15
** GNU Lesser General Public License Usage
16
** Alternatively, this file may be used under the terms of the GNU Lesser
17
** General Public License version 2.1 as published by the Free Software
18
** Foundation and appearing in the file LICENSE.LGPL included in the
19
** packaging of this file. Please review the following information to
20
** ensure the GNU Lesser General Public License version 2.1 requirements
21
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23
** In addition, as a special exception, Nokia gives you certain
24
** additional rights. These rights are described in the Nokia Qt LGPL
25
** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
28
** GNU General Public License Usage
29
** Alternatively, this file may be used under the terms of the GNU
30
** General Public License version 3.0 as published by the Free Software
31
** Foundation and appearing in the file LICENSE.GPL included in the
32
** packaging of this file. Please review the following information to
33
** ensure the GNU General Public License version 3.0 requirements will be
34
** met: http://www.gnu.org/copyleft/gpl.html.
36
** If you are unsure which license is appropriate for your use, please
37
** contact the sales department at http://www.qtsoftware.com/contact.
40
****************************************************************************/
42
#include "glshaders.h"
44
#define GLSHADERS_ASSERT_OPENGL(prefix, assertion, returnStatement) \
45
if (m_failed || !(assertion)) { \
46
if (!m_failed) qCritical(prefix ": The necessary OpenGL functions are not available."); \
52
GLShader::GLShader(const char *data, int size, GLenum shaderType)
53
: m_compileError(false), m_failed(false)
55
GLSHADERS_ASSERT_OPENGL("GLShader::GLShader",
56
glCreateShaderObjectARB && glShaderSourceARB && glCompileShaderARB && glGetObjectParameterivARB, return)
58
m_shader = glCreateShaderObjectARB(shaderType);
61
glShaderSourceARB(m_shader, 1, &data, &glSize);
62
glCompileShaderARB(m_shader);
64
glGetObjectParameterivARB(m_shader, GL_OBJECT_COMPILE_STATUS_ARB, &status);
65
m_compileError = (status != 1);
68
GLShader::GLShader(const QString& fileName, GLenum shaderType)
69
: m_compileError(false), m_failed(false)
71
GLSHADERS_ASSERT_OPENGL("GLShader::GLShader",
72
glCreateShaderObjectARB && glShaderSourceARB && glCompileShaderARB && glGetObjectParameterivARB, return)
74
m_shader = glCreateShaderObjectARB(shaderType);
77
if (file.open(QIODevice::ReadOnly)) {
78
QByteArray bytes = file.readAll();
79
GLint size = file.size();
80
const char *p = bytes.data();
82
glShaderSourceARB(m_shader, 1, &p, &size);
83
glCompileShaderARB(m_shader);
85
glGetObjectParameterivARB(m_shader, GL_OBJECT_COMPILE_STATUS_ARB, &status);
86
m_compileError = (status != 1);
88
m_compileError = true;
94
GLSHADERS_ASSERT_OPENGL("GLShader::~GLShader", glDeleteObjectARB, return)
96
glDeleteObjectARB(m_shader);
99
QString GLShader::log()
101
GLSHADERS_ASSERT_OPENGL("GLShader::log", glGetObjectParameterivARB
102
&& glGetInfoLogARB, return QLatin1String("GLSL not supported."))
105
glGetObjectParameterivARB(m_shader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
106
char *log = new char[length + 1];
107
GLsizei glLength = length;
108
glGetInfoLogARB(m_shader, glLength, &glLength, log);
109
log[glLength] = '\0';
115
GLVertexShader::GLVertexShader(const char *data, int size) : GLShader(data, size, GL_VERTEX_SHADER_ARB)
119
GLVertexShader::GLVertexShader(const QString& fileName) : GLShader(fileName, GL_VERTEX_SHADER_ARB)
123
GLFragmentShader::GLFragmentShader(const char *data, int size) : GLShader(data, size, GL_FRAGMENT_SHADER_ARB)
127
GLFragmentShader::GLFragmentShader(const QString& fileName) : GLShader(fileName, GL_FRAGMENT_SHADER_ARB)
131
GLProgram::GLProgram() : m_linked(false), m_linkError(false), m_failed(false)
133
GLSHADERS_ASSERT_OPENGL("GLProgram::GLProgram", glCreateProgramObjectARB, return)
135
m_program = glCreateProgramObjectARB();
138
GLProgram::~GLProgram()
140
GLSHADERS_ASSERT_OPENGL("GLProgram::~GLProgram", glDeleteObjectARB, return)
142
glDeleteObjectARB(m_program);
145
void GLProgram::attach(const GLShader &shader)
147
GLSHADERS_ASSERT_OPENGL("GLProgram::attach", glAttachObjectARB, return)
149
glAttachObjectARB(m_program, shader.m_shader);
150
m_linked = m_linkError = false;
153
void GLProgram::detach(const GLShader &shader)
155
GLSHADERS_ASSERT_OPENGL("GLProgram::detach", glDetachObjectARB, return)
157
glDetachObjectARB(m_program, shader.m_shader);
158
m_linked = m_linkError = false;
161
bool GLProgram::failed()
163
if (m_failed || m_linkError)
169
GLSHADERS_ASSERT_OPENGL("GLProgram::failed", glLinkProgramARB && glGetObjectParameterivARB, return true)
171
glLinkProgramARB(m_program);
173
glGetObjectParameterivARB(m_program, GL_OBJECT_LINK_STATUS_ARB, &status);
174
m_linkError = !(m_linked = (status == 1));
178
QString GLProgram::log()
180
GLSHADERS_ASSERT_OPENGL("GLProgram::log", glGetObjectParameterivARB && glGetInfoLogARB,
181
return QLatin1String("Failed."))
184
glGetObjectParameterivARB(m_program, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
185
char *log = new char[length + 1];
186
GLsizei glLength = length;
187
glGetInfoLogARB(m_program, glLength, &glLength, log);
188
log[glLength] = '\0';
194
void GLProgram::bind()
196
GLSHADERS_ASSERT_OPENGL("GLProgram::bind", glUseProgramObjectARB, return)
199
glUseProgramObjectARB(m_program);
202
void GLProgram::unbind()
204
GLSHADERS_ASSERT_OPENGL("GLProgram::bind", glUseProgramObjectARB, return)
206
glUseProgramObjectARB(0);
209
bool GLProgram::hasParameter(const QString& name)
211
GLSHADERS_ASSERT_OPENGL("GLProgram::hasParameter", glGetUniformLocationARB, return false)
214
QByteArray asciiName = name.toAscii();
215
return -1 != glGetUniformLocationARB(m_program, asciiName.data());
220
void GLProgram::setInt(const QString& name, int value)
222
GLSHADERS_ASSERT_OPENGL("GLProgram::setInt", glGetUniformLocationARB && glUniform1iARB, return)
225
QByteArray asciiName = name.toAscii();
226
int loc = glGetUniformLocationARB(m_program, asciiName.data());
227
glUniform1iARB(loc, value);
231
void GLProgram::setFloat(const QString& name, float value)
233
GLSHADERS_ASSERT_OPENGL("GLProgram::setFloat", glGetUniformLocationARB && glUniform1fARB, return)
236
QByteArray asciiName = name.toAscii();
237
int loc = glGetUniformLocationARB(m_program, asciiName.data());
238
glUniform1fARB(loc, value);
242
void GLProgram::setColor(const QString& name, QRgb value)
244
GLSHADERS_ASSERT_OPENGL("GLProgram::setColor", glGetUniformLocationARB && glUniform4fARB, return)
246
//qDebug() << "Setting color" << name;
248
QByteArray asciiName = name.toAscii();
249
int loc = glGetUniformLocationARB(m_program, asciiName.data());
250
//qDebug() << "Location of" << name << "is" << loc;
252
glUniform4fARB(loc, color.redF(), color.greenF(), color.blueF(), color.alphaF());
256
void GLProgram::setMatrix(const QString& name, const gfx::Matrix4x4f &mat)
258
GLSHADERS_ASSERT_OPENGL("GLProgram::setMatrix", glGetUniformLocationARB && glUniformMatrix4fvARB, return)
261
QByteArray asciiName = name.toAscii();
262
int loc = glGetUniformLocationARB(m_program, asciiName.data());
263
//qDebug() << "Location of" << name << "is" << loc;
264
glUniformMatrix4fvARB(loc, 1, GL_FALSE, mat.bits());
b'\\ No newline at end of file'