00001 /**************************************************************************** 00002 00003 This file is part of the GLC-lib library. 00004 Copyright (C) 2005-2008 Laurent Ribon (laumaya@users.sourceforge.net) 00005 Version 2.0.0 Beta 1, packaged on April 2010. 00006 00007 http://glc-lib.sourceforge.net 00008 00009 GLC-lib is free software; you can redistribute it and/or modify 00010 it under the terms of the GNU General Public License as published by 00011 the Free Software Foundation; either version 2 of the License, or 00012 (at your option) any later version. 00013 00014 GLC-lib is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 GNU General Public License for more details. 00018 00019 You should have received a copy of the GNU General Public License 00020 along with GLC-lib; if not, write to the Free Software 00021 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00022 00023 *****************************************************************************/ 00025 00026 #include "glc_ext.h" 00027 #include <QString> 00028 #include <QGLContext> 00029 #include <QDebug> 00030 00031 #if !defined(Q_OS_MAC) 00032 // ARB_vertex_buffer_object 00033 PFNGLBINDBUFFERARBPROC glBindBuffer = NULL; 00034 PFNGLDELETEBUFFERSARBPROC glDeleteBuffers = NULL; 00035 PFNGLGENBUFFERSARBPROC glGenBuffers = NULL; 00036 PFNGLISBUFFERARBPROC glIsBuffer = NULL; 00037 PFNGLBUFFERDATAARBPROC glBufferData = NULL; 00038 PFNGLBUFFERSUBDATAARBPROC glBufferSubData = NULL; 00039 PFNGLGETBUFFERSUBDATAARBPROC glGetBufferSubData = NULL; 00040 PFNGLMAPBUFFERARBPROC glMapBuffer = NULL; 00041 PFNGLUNMAPBUFFERARBPROC glUnmapBuffer = NULL; 00042 PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameteriv = NULL; 00043 PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointerv = NULL; 00044 // glDrawRangElement 00045 //PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements = NULL; 00046 00047 // glMultiDrawElement 00048 PFNGLMULTIDRAWELEMENTSPROC glMultiDrawElements = NULL; 00049 // GL_ARB_shader_objects 00050 PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgram = NULL; 00051 PFNGLDELETEPROGRAMPROC glDeleteProgram = NULL; 00052 PFNGLUSEPROGRAMOBJECTARBPROC glUseProgram = NULL; 00053 PFNGLCREATESHADEROBJECTARBPROC glCreateShader = NULL; 00054 PFNGLDELETESHADERPROC glDeleteShader = NULL; 00055 PFNGLSHADERSOURCEARBPROC glShaderSource = NULL; 00056 PFNGLCOMPILESHADERARBPROC glCompileShader = NULL; 00057 PFNGLATTACHOBJECTARBPROC glAttachShader = NULL; 00058 PFNGLDETACHOBJECTARBPROC glDetachShader = NULL; 00059 PFNGLLINKPROGRAMARBPROC glLinkProgram = NULL; 00060 PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocation = NULL; 00061 PFNGLUNIFORM4FARBPROC glUniform4f = NULL; 00062 PFNGLUNIFORM1IARBPROC glUniform1i = NULL; 00063 PFNGLGETSHADERIVPROC glGetShaderiv = NULL; 00064 PFNGLGETPROGRAMIVARBPROC glGetProgramiv = NULL; 00065 PFNGLISPROGRAMARBPROC glIsProgram = NULL; 00066 00067 // GL_point_parameters Point Sprite 00068 PFNGLPOINTPARAMETERFARBPROC glPointParameterf = NULL; 00069 PFNGLPOINTPARAMETERFVARBPROC glPointParameterfv = NULL; 00070 00071 #endif 00072 00073 //const QString glExtension(reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); 00074 00075 // Return true if the extension is supported 00076 bool glc::extensionIsSupported(const QString& extension) 00077 { 00078 QString glExtension(reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); 00079 return glExtension.contains(extension); 00080 } 00081 00082 // Return true if VBO extension is succesfully loaded 00083 bool glc::loadVboExtension() 00084 { 00085 bool result= true; 00086 #if !defined(Q_OS_MAC) 00087 const QGLContext* pContext= QGLContext::currentContext(); 00088 glBindBuffer = (PFNGLBINDBUFFERARBPROC)pContext->getProcAddress(QLatin1String("glBindBuffer")); 00089 glDeleteBuffers = (PFNGLDELETEBUFFERSARBPROC)pContext->getProcAddress(QLatin1String("glDeleteBuffers")); 00090 glGenBuffers = (PFNGLGENBUFFERSARBPROC)pContext->getProcAddress(QLatin1String("glGenBuffers")); 00091 glIsBuffer = (PFNGLISBUFFERARBPROC)pContext->getProcAddress(QLatin1String("glIsBuffer")); 00092 glBufferData = (PFNGLBUFFERDATAARBPROC)pContext->getProcAddress(QLatin1String("glBufferData")); 00093 glBufferSubData = (PFNGLBUFFERSUBDATAARBPROC)pContext->getProcAddress(QLatin1String("glBufferSubData")); 00094 glGetBufferSubData = (PFNGLGETBUFFERSUBDATAARBPROC)pContext->getProcAddress(QLatin1String("glGetBufferSubData")); 00095 glMapBuffer = (PFNGLMAPBUFFERARBPROC)pContext->getProcAddress(QLatin1String("glMapBuffer")); 00096 glUnmapBuffer = (PFNGLUNMAPBUFFERARBPROC)pContext->getProcAddress(QLatin1String("glUnmapBuffer")); 00097 glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVARBPROC)pContext->getProcAddress(QLatin1String("glGetBufferParameteriv")); 00098 glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVARBPROC)pContext->getProcAddress(QLatin1String("glGetBufferPointerv")); 00099 //glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)pContext->getProcAddress(QLatin1String("glDrawRangeElements")); 00100 glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)pContext->getProcAddress(QLatin1String("glMultiDrawElements")); 00101 00102 result= glBindBuffer && glDeleteBuffers && glGenBuffers && glIsBuffer && glBufferData && glBufferSubData && 00103 glGetBufferSubData && glMapBuffer && glUnmapBuffer && glGetBufferParameteriv && glGetBufferPointerv && glMultiDrawElements;// and glDrawRangeElements; 00104 #endif 00105 return result; 00106 00107 } 00108 00109 // Load GLSL extensions 00110 bool glc::loadGlSlExtension() 00111 { 00112 bool result= true; 00113 #if !defined(Q_OS_MAC) 00114 const QGLContext* pContext= QGLContext::currentContext(); 00115 glCreateProgram = (PFNGLCREATEPROGRAMOBJECTARBPROC)pContext->getProcAddress(QLatin1String("glCreateProgram")); 00116 if (!glCreateProgram) qDebug() << "not glCreateProgram"; 00117 glDeleteProgram = (PFNGLDELETEPROGRAMPROC)pContext->getProcAddress(QLatin1String("glDeleteProgram")); 00118 if (!glDeleteProgram) qDebug() << "not glDeleteProgram"; 00119 glUseProgram = (PFNGLUSEPROGRAMOBJECTARBPROC)pContext->getProcAddress(QLatin1String("glUseProgram")); 00120 if (!glUseProgram) qDebug() << "not glUseProgram"; 00121 glCreateShader = (PFNGLCREATESHADEROBJECTARBPROC)pContext->getProcAddress(QLatin1String("glCreateShader")); 00122 if (!glCreateShader) qDebug() << "not glCreateShader"; 00123 glDeleteShader = (PFNGLDELETESHADERPROC)pContext->getProcAddress(QLatin1String("glDeleteShader")); 00124 if (!glDeleteShader) qDebug() << "not glDeleteShader"; 00125 glShaderSource = (PFNGLSHADERSOURCEARBPROC)pContext->getProcAddress(QLatin1String("glShaderSource")); 00126 if (!glShaderSource) qDebug() << "not glShaderSource"; 00127 glCompileShader = (PFNGLCOMPILESHADERARBPROC)pContext->getProcAddress(QLatin1String("glCompileShader")); 00128 if (!glCompileShader) qDebug() << "not glCompileShader"; 00129 glAttachShader = (PFNGLATTACHOBJECTARBPROC)pContext->getProcAddress(QLatin1String("glAttachShader")); 00130 if (!glAttachShader) qDebug() << "not glAttachShader"; 00131 glDetachShader = (PFNGLDETACHOBJECTARBPROC)pContext->getProcAddress(QLatin1String("glDetachShader")); 00132 if (!glDetachShader) qDebug() << "not glDetachShader"; 00133 glLinkProgram = (PFNGLLINKPROGRAMARBPROC)pContext->getProcAddress(QLatin1String("glLinkProgram")); 00134 if (!glLinkProgram) qDebug() << "not glLinkProgram"; 00135 glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONARBPROC)pContext->getProcAddress(QLatin1String("glGetUniformLocation")); 00136 if (!glGetUniformLocation) qDebug() << "not glGetUniformLocation"; 00137 glUniform4f = (PFNGLUNIFORM4FARBPROC)pContext->getProcAddress(QLatin1String("glUniform4f")); 00138 if (!glUniform4f) qDebug() << "not glUniform4f"; 00139 glUniform1i = (PFNGLUNIFORM1IARBPROC)pContext->getProcAddress(QLatin1String("glUniform1i")); 00140 if (!glUniform1i) qDebug() << "not glUniform1i"; 00141 glGetShaderiv = (PFNGLGETSHADERIVPROC)pContext->getProcAddress(QLatin1String("glGetShaderiv")); 00142 if (!glGetShaderiv) qDebug() << "not glGetShaderiv"; 00143 glGetProgramiv = (PFNGLGETPROGRAMIVARBPROC)pContext->getProcAddress(QLatin1String("glGetProgramiv")); 00144 if (!glGetProgramiv) qDebug() << "not glGetProgramiv"; 00145 glIsProgram = (PFNGLISPROGRAMARBPROC)pContext->getProcAddress(QLatin1String("glIsProgram")); 00146 00147 result= glCreateProgram && glDeleteProgram && glUseProgram && glCreateShader && glDeleteShader && 00148 glShaderSource && glCompileShader && glAttachShader && glDetachShader && glLinkProgram && 00149 glGetUniformLocation && glUniform4f && glUniform1i && glGetShaderiv && glGetProgramiv && glIsProgram; 00150 00151 #endif 00152 return result; 00153 } 00154 00155 // Load Point Sprite extension 00156 bool glc::loadPointSpriteExtension() 00157 { 00158 bool result= true; 00159 #if !defined(Q_OS_MAC) 00160 const QGLContext* pContext= QGLContext::currentContext(); 00161 glPointParameterf = (PFNGLPOINTPARAMETERFARBPROC)pContext->getProcAddress(QLatin1String("glPointParameterf")); 00162 if (!glPointParameterf) qDebug() << "not glPointParameterf"; 00163 glPointParameterfv = (PFNGLPOINTPARAMETERFVARBPROC)pContext->getProcAddress(QLatin1String("glPointParameterfv")); 00164 if (!glPointParameterfv) qDebug() << "not glPointParameterfv"; 00165 00166 result= glPointParameterf && glPointParameterfv; 00167 00168 #endif 00169 return result; 00170 } 00171