00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://ogre.sourceforge.net/ 00006 00007 Copyright © 2000-2002 The OGRE Team 00008 Also see acknowledgements in Readme.html 00009 00010 This program is free software; you can redistribute it and/or modify it under 00011 the terms of the GNU Lesser General Public License as published by the Free Software 00012 Foundation; either version 2 of the License, or (at your option) any later 00013 version. 00014 00015 This program is distributed in the hope that it will be useful, but WITHOUT 00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License along with 00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00022 http://www.gnu.org/copyleft/lesser.txt. 00023 ----------------------------------------------------------------------------- 00024 */ 00025 00026 #include "OgreLogManager.h" 00027 #include "OgreGLSLExtSupport.h" 00028 #include "OgreGLSupport.h" 00029 00030 namespace Ogre 00031 { 00032 // 00033 // OpenGL Shading Language entry points 00034 // 00035 PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB_ptr = NULL; 00036 PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB_ptr = NULL; 00037 PFNGLDELETEOBJECTARBPROC glDeleteObjectARB_ptr = NULL; 00038 PFNGLDETACHOBJECTARBPROC glDetachObjectARB_ptr = NULL; 00039 PFNGLATTACHOBJECTARBPROC glAttachObjectARB_ptr = NULL; 00040 00041 PFNGLSHADERSOURCEARBPROC glShaderSourceARB_ptr = NULL; 00042 PFNGLCOMPILESHADERARBPROC glCompileShaderARB_ptr = NULL; 00043 PFNGLLINKPROGRAMARBPROC glLinkProgramARB_ptr = NULL; 00044 PFNGLGETINFOLOGARBPROC glGetInfoLogARB_ptr = NULL; 00045 PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB_ptr = NULL; 00046 00047 PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB_ptr = NULL; 00048 PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB_ptr = NULL; 00049 PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB_ptr = NULL; 00050 PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB_ptr = NULL; 00051 PFNGLGETACTIVEUNIFORMARBPROC glGetActiveUniformARB_ptr = NULL; 00052 00053 PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB_ptr = NULL; 00054 00055 PFNGLUNIFORM1FARBPROC glUniform1fARB_ptr = NULL; 00056 PFNGLUNIFORM2FARBPROC glUniform2fARB_ptr = NULL; 00057 PFNGLUNIFORM3FARBPROC glUniform3fARB_ptr = NULL; 00058 PFNGLUNIFORM4FARBPROC glUniform4fARB_ptr = NULL; 00059 00060 PFNGLUNIFORM1IARBPROC glUniform1iARB_ptr = NULL; 00061 PFNGLUNIFORM2IARBPROC glUniform2iARB_ptr = NULL; 00062 PFNGLUNIFORM3IARBPROC glUniform3iARB_ptr = NULL; 00063 PFNGLUNIFORM4IARBPROC glUniform4iARB_ptr = NULL; 00064 00065 PFNGLUNIFORM1FVARBPROC glUniform1fvARB_ptr = NULL; 00066 PFNGLUNIFORM2FVARBPROC glUniform2fvARB_ptr = NULL; 00067 PFNGLUNIFORM3FVARBPROC glUniform3fvARB_ptr = NULL; 00068 PFNGLUNIFORM4FVARBPROC glUniform4fvARB_ptr = NULL; 00069 00070 PFNGLUNIFORM1IVARBPROC glUniform1ivARB_ptr = NULL; 00071 PFNGLUNIFORM2IVARBPROC glUniform2ivARB_ptr = NULL; 00072 PFNGLUNIFORM3IVARBPROC glUniform3ivARB_ptr = NULL; 00073 PFNGLUNIFORM4IVARBPROC glUniform4ivARB_ptr = NULL; 00074 00075 PFNGLVERTEXATTRIB4FVARBPROC glVertexAttrib4fvARB_ptr = NULL; 00076 PFNGLVERTEXATTRIB3FVARBPROC glVertexAttrib3fvARB_ptr = NULL; 00077 PFNGLVERTEXATTRIB2FVARBPROC glVertexAttrib2fvARB_ptr = NULL; 00078 PFNGLVERTEXATTRIB1FVARBPROC glVertexAttrib1fvARB_ptr = NULL; 00079 PFNGLVERTEXATTRIB4FARBPROC glVertexAttrib4fARB_ptr = NULL; 00080 PFNGLVERTEXATTRIB3FARBPROC glVertexAttrib3fARB_ptr = NULL; 00081 PFNGLVERTEXATTRIB2FARBPROC glVertexAttrib2fARB_ptr = NULL; 00082 PFNGLVERTEXATTRIB1FARBPROC glVertexAttrib1fARB_ptr = NULL; 00083 00084 00085 //----------------------------------------------------------------------------- 00086 bool InitGLShaderLanguageExtensions( GLSupport& glSupport ) 00087 { 00088 static bool init = false; 00089 00090 // check that this has not been done before -- only need to get proc addresses once 00091 if (!init) 00092 { 00093 00094 glCreateProgramObjectARB_ptr = (PFNGLCREATEPROGRAMOBJECTARBPROC) glSupport.getProcAddress( "glCreateProgramObjectARB" ); 00095 glCreateShaderObjectARB_ptr = (PFNGLCREATESHADEROBJECTARBPROC) glSupport.getProcAddress( "glCreateShaderObjectARB" ); 00096 glDeleteObjectARB_ptr = (PFNGLDELETEOBJECTARBPROC) glSupport.getProcAddress( "glDeleteObjectARB" ); 00097 glDetachObjectARB_ptr = (PFNGLDETACHOBJECTARBPROC) glSupport.getProcAddress( "glDetachObjectARB" ); 00098 glAttachObjectARB_ptr = (PFNGLATTACHOBJECTARBPROC) glSupport.getProcAddress( "glAttachObjectARB" ); 00099 glShaderSourceARB_ptr = (PFNGLSHADERSOURCEARBPROC) glSupport.getProcAddress( "glShaderSourceARB" ); 00100 glCompileShaderARB_ptr = (PFNGLCOMPILESHADERARBPROC) glSupport.getProcAddress( "glCompileShaderARB" ); 00101 glLinkProgramARB_ptr = (PFNGLLINKPROGRAMARBPROC) glSupport.getProcAddress( "glLinkProgramARB" ); 00102 glGetInfoLogARB_ptr = (PFNGLGETINFOLOGARBPROC) glSupport.getProcAddress( "glGetInfoLogARB" ); 00103 glUseProgramObjectARB_ptr = (PFNGLUSEPROGRAMOBJECTARBPROC) glSupport.getProcAddress( "glUseProgramObjectARB" ); 00104 glGetObjectParameterivARB_ptr = (PFNGLGETOBJECTPARAMETERIVARBPROC) glSupport.getProcAddress( "glGetObjectParameterivARB" ); 00105 glGetObjectParameterfvARB_ptr = (PFNGLGETOBJECTPARAMETERFVARBPROC) glSupport.getProcAddress( "glGetObjectParameterfvARB" ); 00106 glGetUniformLocationARB_ptr = (PFNGLGETUNIFORMLOCATIONARBPROC) glSupport.getProcAddress( "glGetUniformLocationARB" ); 00107 glGetActiveUniformARB_ptr = (PFNGLGETACTIVEUNIFORMARBPROC) glSupport.getProcAddress( "glGetActiveUniformARB" ); 00108 glGetAttribLocationARB_ptr = (PFNGLGETATTRIBLOCATIONARBPROC) glSupport.getProcAddress( "glGetAttribLocationARB" ); 00109 glBindAttribLocationARB_ptr = (PFNGLBINDATTRIBLOCATIONARBPROC) glSupport.getProcAddress( "glBindAttribLocationARB" ); 00110 00111 glUniform1fARB_ptr = (PFNGLUNIFORM1FARBPROC) glSupport.getProcAddress( "glUniform1fARB" ); 00112 glUniform2fARB_ptr = (PFNGLUNIFORM2FARBPROC) glSupport.getProcAddress( "glUniform2fARB" ); 00113 glUniform3fARB_ptr = (PFNGLUNIFORM3FARBPROC) glSupport.getProcAddress( "glUniform3fARB" ); 00114 glUniform4fARB_ptr = (PFNGLUNIFORM4FARBPROC) glSupport.getProcAddress( "glUniform4fARB" ); 00115 glUniform1iARB_ptr = (PFNGLUNIFORM1IARBPROC) glSupport.getProcAddress( "glUniform1iARB" ); 00116 glUniform2iARB_ptr = (PFNGLUNIFORM2IARBPROC) glSupport.getProcAddress( "glUniform2iARB" ); 00117 glUniform3iARB_ptr = (PFNGLUNIFORM3IARBPROC) glSupport.getProcAddress( "glUniform3iARB" ); 00118 glUniform4iARB_ptr = (PFNGLUNIFORM4IARBPROC) glSupport.getProcAddress( "glUniform4iARB" ); 00119 glUniform1fvARB_ptr = (PFNGLUNIFORM1FVARBPROC) glSupport.getProcAddress( "glUniform1fvARB" ); 00120 glUniform2fvARB_ptr = (PFNGLUNIFORM2FVARBPROC) glSupport.getProcAddress( "glUniform2fvARB" ); 00121 glUniform3fvARB_ptr = (PFNGLUNIFORM3FVARBPROC) glSupport.getProcAddress( "glUniform3fvARB" ); 00122 glUniform4fvARB_ptr = (PFNGLUNIFORM4FVARBPROC) glSupport.getProcAddress( "glUniform4fvARB" ); 00123 glUniform1ivARB_ptr = (PFNGLUNIFORM1IVARBPROC) glSupport.getProcAddress( "glUniform1ivARB" ); 00124 glUniform2ivARB_ptr = (PFNGLUNIFORM2IVARBPROC) glSupport.getProcAddress( "glUniform2ivARB" ); 00125 glUniform3ivARB_ptr = (PFNGLUNIFORM3IVARBPROC) glSupport.getProcAddress( "glUniform3ivARB" ); 00126 glUniform4ivARB_ptr = (PFNGLUNIFORM4IVARBPROC) glSupport.getProcAddress( "glUniform4ivARB" ); 00127 00128 glVertexAttrib4fvARB_ptr = (PFNGLVERTEXATTRIB4FVARBPROC) glSupport.getProcAddress( "glVertexAttrib4fvARB" ); 00129 glVertexAttrib3fvARB_ptr = (PFNGLVERTEXATTRIB3FVARBPROC) glSupport.getProcAddress( "glVertexAttrib3fvARB" ); 00130 glVertexAttrib2fvARB_ptr = (PFNGLVERTEXATTRIB2FVARBPROC) glSupport.getProcAddress( "glVertexAttrib2fvARB" ); 00131 glVertexAttrib1fvARB_ptr = (PFNGLVERTEXATTRIB1FVARBPROC) glSupport.getProcAddress( "glVertexAttrib1fvARB" ); 00132 glVertexAttrib4fARB_ptr = (PFNGLVERTEXATTRIB4FARBPROC) glSupport.getProcAddress( "glVertexAttrib4fARB" ); 00133 glVertexAttrib3fARB_ptr = (PFNGLVERTEXATTRIB3FARBPROC) glSupport.getProcAddress( "glVertexAttrib3fARB" ); 00134 glVertexAttrib2fARB_ptr = (PFNGLVERTEXATTRIB2FARBPROC) glSupport.getProcAddress( "glVertexAttrib2fARB" ); 00135 glVertexAttrib1fARB_ptr = (PFNGLVERTEXATTRIB1FARBPROC) glSupport.getProcAddress( "glVertexAttrib1fARB" ); 00136 00137 init = true; 00138 } 00139 00140 return init; 00141 00142 } 00143 00144 //----------------------------------------------------------------------------- 00145 void checkForGLSLError(const String& ogreMethod, const String& errorTextPrefix, const GLhandleARB obj, const bool forceInfoLog, const bool forceException) 00146 { 00147 GLenum glErr; 00148 bool errorsFound = false; 00149 String msg = errorTextPrefix; 00150 00151 // get all the GL errors 00152 glErr = glGetError(); 00153 while (glErr != GL_NO_ERROR) 00154 { 00155 msg += "\n" + String((char*)gluErrorString(glErr)); 00156 glErr = glGetError(); 00157 errorsFound = true; 00158 } 00159 00160 00161 // if errors were found then put them in the Log and raise and exception 00162 if (errorsFound || forceInfoLog) 00163 { 00164 // if shader or program object then get the log message and send to the log manager 00165 msg += logObjectInfo( msg, obj ); 00166 00167 if (forceException) 00168 { 00169 Except(Exception::ERR_INTERNAL_ERROR, msg, ogreMethod); 00170 } 00171 } 00172 } 00173 00174 //----------------------------------------------------------------------------- 00175 String logObjectInfo(const String& msg, const GLhandleARB obj) 00176 { 00177 String logMessage = msg; 00178 00179 if (obj > 0) 00180 { 00181 int infologLength = 0; 00182 00183 glGetObjectParameterivARB_ptr(obj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &infologLength); 00184 00185 if (infologLength > 0) 00186 { 00187 int charsWritten = 0; 00188 00189 GLcharARB * infoLog = new GLcharARB[infologLength]; 00190 00191 glGetInfoLogARB_ptr(obj, infologLength, &charsWritten, infoLog); 00192 logMessage += String(infoLog) + "\n"; 00193 LogManager::getSingleton().logMessage(logMessage); 00194 00195 delete [] infoLog; 00196 } 00197 } 00198 00199 return logMessage; 00200 00201 } 00202 00203 00204 } // namespace Ogre
Copyright © 2002-2003 by The OGRE Team
Last modified Sun Nov 28 19:48:26 2004