2007-11-27 19:40:25 +00:00
|
|
|
/********************************************************************
|
2007-04-29 17:35:43 +00:00
|
|
|
KWin - the KDE window manager
|
|
|
|
This file is part of the KDE project.
|
|
|
|
|
|
|
|
Copyright (C) 2007 Rivo Laks <rivolaks@hot.ee>
|
|
|
|
|
2007-11-27 19:40:25 +00:00
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*********************************************************************/
|
2007-04-29 17:35:43 +00:00
|
|
|
|
|
|
|
#include "kwinglutils.h"
|
2015-11-13 10:42:01 +00:00
|
|
|
#include "kwinglplatform.h"
|
2007-04-29 17:35:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
// Resolves given function, using getProcAddress
|
2012-10-03 07:32:25 +00:00
|
|
|
// Useful when functionality is defined in an extension with a different name
|
|
|
|
#define GL_RESOLVE_WITH_EXT( function, symbolName ) \
|
2016-11-11 08:16:23 +00:00
|
|
|
function = (function ## _func)resolveFunction( #symbolName );
|
2012-09-29 11:19:35 +00:00
|
|
|
|
2007-04-29 17:35:43 +00:00
|
|
|
namespace KWin
|
|
|
|
{
|
|
|
|
|
2013-05-19 14:14:47 +00:00
|
|
|
static GLenum GetGraphicsResetStatus();
|
|
|
|
static void ReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format,
|
|
|
|
GLenum type, GLsizei bufSize, GLvoid *data);
|
|
|
|
static void GetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
|
|
|
|
|
2014-02-11 18:57:06 +00:00
|
|
|
// GL_ARB_robustness / GL_EXT_robustness
|
2015-11-17 10:00:53 +00:00
|
|
|
glGetGraphicsResetStatus_func glGetGraphicsResetStatus;
|
|
|
|
glReadnPixels_func glReadnPixels;
|
|
|
|
glGetnUniformfv_func glGetnUniformfv;
|
2013-05-19 14:14:47 +00:00
|
|
|
|
2016-11-11 08:16:23 +00:00
|
|
|
void glResolveFunctions(std::function<resolveFuncPtr(const char*)> resolveFunction)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2015-11-13 10:42:01 +00:00
|
|
|
const bool haveArbRobustness = hasGLExtension(QByteArrayLiteral("GL_ARB_robustness"));
|
|
|
|
const bool haveExtRobustness = hasGLExtension(QByteArrayLiteral("GL_EXT_robustness"));
|
|
|
|
bool robustContext = false;
|
|
|
|
if (GLPlatform::instance()->isGLES()) {
|
|
|
|
if (haveExtRobustness) {
|
|
|
|
GLint value = 0;
|
|
|
|
glGetIntegerv(GL_CONTEXT_ROBUST_ACCESS_EXT, &value);
|
|
|
|
robustContext = (value != 0);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (haveArbRobustness) {
|
2015-11-19 10:20:33 +00:00
|
|
|
if (hasGLVersion(3, 0)) {
|
|
|
|
GLint value = 0;
|
|
|
|
glGetIntegerv(GL_CONTEXT_FLAGS, &value);
|
|
|
|
if (value & GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB) {
|
|
|
|
robustContext = true;
|
|
|
|
}
|
|
|
|
} else {
|
2015-11-13 10:42:01 +00:00
|
|
|
robustContext = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (robustContext && haveArbRobustness) {
|
2013-05-19 14:14:47 +00:00
|
|
|
// See http://www.opengl.org/registry/specs/ARB/robustness.txt
|
2015-11-17 10:00:53 +00:00
|
|
|
GL_RESOLVE_WITH_EXT(glGetGraphicsResetStatus, glGetGraphicsResetStatusARB);
|
|
|
|
GL_RESOLVE_WITH_EXT(glReadnPixels, glReadnPixelsARB);
|
|
|
|
GL_RESOLVE_WITH_EXT(glGetnUniformfv, glGetnUniformfvARB);
|
2015-11-13 10:42:01 +00:00
|
|
|
} else if (robustContext && haveExtRobustness) {
|
2013-05-19 14:17:41 +00:00
|
|
|
// See http://www.khronos.org/registry/gles/extensions/EXT/EXT_robustness.txt
|
2016-11-11 08:16:23 +00:00
|
|
|
glGetGraphicsResetStatus = (glGetGraphicsResetStatus_func) resolveFunction("glGetGraphicsResetStatusEXT");
|
|
|
|
glReadnPixels = (glReadnPixels_func) resolveFunction("glReadnPixelsEXT");
|
|
|
|
glGetnUniformfv = (glGetnUniformfv_func) resolveFunction("glGetnUniformfvEXT");
|
2013-05-19 14:17:41 +00:00
|
|
|
} else {
|
2015-11-17 10:00:53 +00:00
|
|
|
glGetGraphicsResetStatus = KWin::GetGraphicsResetStatus;
|
|
|
|
glReadnPixels = KWin::ReadnPixels;
|
|
|
|
glGetnUniformfv = KWin::GetnUniformfv;
|
2013-05-19 14:17:41 +00:00
|
|
|
}
|
2010-12-05 11:35:40 +00:00
|
|
|
}
|
|
|
|
|
2013-05-19 14:14:47 +00:00
|
|
|
static GLenum GetGraphicsResetStatus()
|
|
|
|
{
|
|
|
|
return GL_NO_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void ReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format,
|
|
|
|
GLenum type, GLsizei bufSize, GLvoid *data)
|
|
|
|
{
|
|
|
|
Q_UNUSED(bufSize)
|
|
|
|
glReadPixels(x, y, width, height, format, type, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void GetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
|
|
|
|
{
|
|
|
|
Q_UNUSED(bufSize)
|
|
|
|
glGetUniformfv(program, location, params);
|
|
|
|
}
|
|
|
|
|
2010-12-05 11:35:40 +00:00
|
|
|
} // namespace
|