00001 /**************************************************************************** 00002 00003 This file is part of the GLC-lib library. 00004 Copyright (C) 2005-2008 Laurent Ribon (laumaya@users.sourceforge.net) 00005 http://glc-lib.sourceforge.net 00006 00007 GLC-lib is free software; you can redistribute it and/or modify 00008 it under the terms of the GNU Lesser General Public License as published by 00009 the Free Software Foundation; either version 3 of the License, or 00010 (at your option) any later version. 00011 00012 GLC-lib is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 GNU Lesser General Public License for more details. 00016 00017 You should have received a copy of the GNU Lesser General Public License 00018 along with GLC-lib; if not, write to the Free Software 00019 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00020 00021 *****************************************************************************/ 00023 00024 #include "glc_ext.h" 00025 #include <QString> 00026 #include <QGLContext> 00027 #include <QDebug> 00028 #include <QGLShaderProgram> 00029 00030 #if !defined(Q_OS_MAC) 00031 // ARB_vertex_buffer_object 00032 PFNGLBINDBUFFERARBPROC glBindBuffer = NULL; 00033 PFNGLDELETEBUFFERSARBPROC glDeleteBuffers = NULL; 00034 PFNGLGENBUFFERSARBPROC glGenBuffers = NULL; 00035 PFNGLISBUFFERARBPROC glIsBuffer = NULL; 00036 PFNGLBUFFERDATAARBPROC glBufferData = NULL; 00037 PFNGLBUFFERSUBDATAARBPROC glBufferSubData = NULL; 00038 PFNGLGETBUFFERSUBDATAARBPROC glGetBufferSubData = NULL; 00039 PFNGLMAPBUFFERARBPROC glMapBuffer = NULL; 00040 PFNGLUNMAPBUFFERARBPROC glUnmapBuffer = NULL; 00041 PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameteriv = NULL; 00042 PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointerv = NULL; 00043 // glDrawRangElement 00044 //PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements = NULL; 00045 00046 // glMultiDrawElement 00047 PFNGLMULTIDRAWELEMENTSPROC glMultiDrawElements = NULL; 00048 00049 // GL_point_parameters Point Sprite 00050 PFNGLPOINTPARAMETERFARBPROC glPointParameterf = NULL; 00051 PFNGLPOINTPARAMETERFVARBPROC glPointParameterfv = NULL; 00052 00053 #endif 00054 00055 //const QString glExtension(reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); 00056 00057 // Return true if the extension is supported 00058 bool glc::extensionIsSupported(const QString& extension) 00059 { 00060 QString glExtension(reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); 00061 return glExtension.contains(extension); 00062 } 00063 00064 // Return true if VBO extension is succesfully loaded 00065 bool glc::loadVboExtension() 00066 { 00067 bool result= true; 00068 #if !defined(Q_OS_MAC) 00069 const QGLContext* pContext= QGLContext::currentContext(); 00070 glBindBuffer = (PFNGLBINDBUFFERARBPROC)pContext->getProcAddress(QLatin1String("glBindBuffer")); 00071 glDeleteBuffers = (PFNGLDELETEBUFFERSARBPROC)pContext->getProcAddress(QLatin1String("glDeleteBuffers")); 00072 glGenBuffers = (PFNGLGENBUFFERSARBPROC)pContext->getProcAddress(QLatin1String("glGenBuffers")); 00073 glIsBuffer = (PFNGLISBUFFERARBPROC)pContext->getProcAddress(QLatin1String("glIsBuffer")); 00074 glBufferData = (PFNGLBUFFERDATAARBPROC)pContext->getProcAddress(QLatin1String("glBufferData")); 00075 glBufferSubData = (PFNGLBUFFERSUBDATAARBPROC)pContext->getProcAddress(QLatin1String("glBufferSubData")); 00076 glGetBufferSubData = (PFNGLGETBUFFERSUBDATAARBPROC)pContext->getProcAddress(QLatin1String("glGetBufferSubData")); 00077 glMapBuffer = (PFNGLMAPBUFFERARBPROC)pContext->getProcAddress(QLatin1String("glMapBuffer")); 00078 glUnmapBuffer = (PFNGLUNMAPBUFFERARBPROC)pContext->getProcAddress(QLatin1String("glUnmapBuffer")); 00079 glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVARBPROC)pContext->getProcAddress(QLatin1String("glGetBufferParameteriv")); 00080 glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVARBPROC)pContext->getProcAddress(QLatin1String("glGetBufferPointerv")); 00081 //glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)pContext->getProcAddress(QLatin1String("glDrawRangeElements")); 00082 glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)pContext->getProcAddress(QLatin1String("glMultiDrawElements")); 00083 00084 result= glBindBuffer && glDeleteBuffers && glGenBuffers && glIsBuffer && glBufferData && glBufferSubData && 00085 glGetBufferSubData && glMapBuffer && glUnmapBuffer && glGetBufferParameteriv && glGetBufferPointerv && glMultiDrawElements;// and glDrawRangeElements; 00086 #endif 00087 return result; 00088 00089 } 00090 00091 // Load GLSL extensions 00092 bool glc::loadGlSlExtension() 00093 { 00094 return QGLShaderProgram::hasOpenGLShaderPrograms(); 00095 } 00096 00097 // Load Point Sprite extension 00098 bool glc::loadPointSpriteExtension() 00099 { 00100 bool result= true; 00101 #if !defined(Q_OS_MAC) 00102 const QGLContext* pContext= QGLContext::currentContext(); 00103 glPointParameterf = (PFNGLPOINTPARAMETERFARBPROC)pContext->getProcAddress(QLatin1String("glPointParameterf")); 00104 if (!glPointParameterf) qDebug() << "not glPointParameterf"; 00105 glPointParameterfv = (PFNGLPOINTPARAMETERFVARBPROC)pContext->getProcAddress(QLatin1String("glPointParameterfv")); 00106 if (!glPointParameterfv) qDebug() << "not glPointParameterfv"; 00107 00108 result= glPointParameterf && glPointParameterfv; 00109 00110 #endif 00111 return result; 00112 } 00113