llgl.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:66k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llgl.cpp
  3.  * @brief LLGL implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. // This file sets some global GL parameters, and implements some 
  33. // useful functions for GL operations.
  34. #define GLH_EXT_SINGLE_FILE
  35. #include "linden_common.h"
  36. #include "boost/tokenizer.hpp"
  37. #include "llsys.h"
  38. #include "llgl.h"
  39. #include "llrender.h"
  40. #include "llerror.h"
  41. #include "llerrorcontrol.h"
  42. #include "llquaternion.h"
  43. #include "llmath.h"
  44. #include "m4math.h"
  45. #include "llstring.h"
  46. #include "llmemtype.h"
  47. #include "llstacktrace.h"
  48. #include "llglheaders.h"
  49. #ifdef _DEBUG
  50. //#define GL_STATE_VERIFY
  51. #endif
  52. BOOL gDebugSession = FALSE;
  53. BOOL gDebugGL = FALSE;
  54. BOOL gClothRipple = FALSE;
  55. BOOL gNoRender = FALSE;
  56. BOOL gGLActive = FALSE;
  57. std::ofstream gFailLog;
  58. void ll_init_fail_log(std::string filename)
  59. {
  60. gFailLog.open(filename.c_str());
  61. }
  62. void ll_fail(std::string msg)
  63. {
  64. if (gDebugSession)
  65. {
  66. std::vector<std::string> lines;
  67. gFailLog << LLError::utcTime() << " " << msg << std::endl;
  68. gFailLog << "Stack Trace:" << std::endl;
  69. ll_get_stack_trace(lines);
  70. for(size_t i = 0; i < lines.size(); ++i)
  71. {
  72. gFailLog << lines[i] << std::endl;
  73. }
  74. gFailLog << "End of Stack Trace." << std::endl << std::endl;
  75. gFailLog.flush();
  76. }
  77. };
  78. void ll_close_fail_log()
  79. {
  80. gFailLog.close();
  81. }
  82. LLMatrix4 gGLObliqueProjectionInverse;
  83. #define LL_GL_NAME_POOLING 0
  84. LLGLNamePool::pool_list_t LLGLNamePool::sInstances;
  85. std::list<LLGLUpdate*> LLGLUpdate::sGLQ;
  86. #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS)  && !LL_MESA_HEADLESS
  87. // ATI prototypes
  88. // vertex blending prototypes
  89. PFNGLWEIGHTPOINTERARBPROC glWeightPointerARB = NULL;
  90. PFNGLVERTEXBLENDARBPROC glVertexBlendARB = NULL;
  91. PFNGLWEIGHTFVARBPROC glWeightfvARB = NULL;
  92. // Vertex buffer object prototypes
  93. PFNGLBINDBUFFERARBPROC glBindBufferARB = NULL;
  94. PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB = NULL;
  95. PFNGLGENBUFFERSARBPROC glGenBuffersARB = NULL;
  96. PFNGLISBUFFERARBPROC glIsBufferARB = NULL;
  97. PFNGLBUFFERDATAARBPROC glBufferDataARB = NULL;
  98. PFNGLBUFFERSUBDATAARBPROC glBufferSubDataARB = NULL;
  99. PFNGLGETBUFFERSUBDATAARBPROC glGetBufferSubDataARB = NULL;
  100. PFNGLMAPBUFFERARBPROC glMapBufferARB = NULL;
  101. PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB = NULL;
  102. PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB = NULL;
  103. PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB = NULL;
  104. // vertex object prototypes
  105. PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI = NULL;
  106. PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI = NULL;
  107. PFNGLUPDATEOBJECTBUFFERATIPROC glUpdateObjectBufferATI = NULL;
  108. PFNGLGETOBJECTBUFFERFVATIPROC glGetObjectBufferfvATI = NULL;
  109. PFNGLGETOBJECTBUFFERIVATIPROC glGetObjectBufferivATI = NULL;
  110. PFNGLFREEOBJECTBUFFERATIPROC glFreeObjectBufferATI = NULL;
  111. PFNGLARRAYOBJECTATIPROC glArrayObjectATI = NULL;
  112. PFNGLVERTEXATTRIBARRAYOBJECTATIPROC glVertexAttribArrayObjectATI = NULL;
  113. PFNGLGETARRAYOBJECTFVATIPROC glGetArrayObjectfvATI = NULL;
  114. PFNGLGETARRAYOBJECTIVATIPROC glGetArrayObjectivATI = NULL;
  115. PFNGLVARIANTARRAYOBJECTATIPROC glVariantObjectArrayATI = NULL;
  116. PFNGLGETVARIANTARRAYOBJECTFVATIPROC glGetVariantArrayObjectfvATI = NULL;
  117. PFNGLGETVARIANTARRAYOBJECTIVATIPROC glGetVariantArrayObjectivATI = NULL;
  118. // GL_ARB_occlusion_query
  119. PFNGLGENQUERIESARBPROC glGenQueriesARB = NULL;
  120. PFNGLDELETEQUERIESARBPROC glDeleteQueriesARB = NULL;
  121. PFNGLISQUERYARBPROC glIsQueryARB = NULL;
  122. PFNGLBEGINQUERYARBPROC glBeginQueryARB = NULL;
  123. PFNGLENDQUERYARBPROC glEndQueryARB = NULL;
  124. PFNGLGETQUERYIVARBPROC glGetQueryivARB = NULL;
  125. PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB = NULL;
  126. PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB = NULL;
  127. // GL_ARB_point_parameters
  128. PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB = NULL;
  129. PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB = NULL;
  130. // GL_EXT_framebuffer_object
  131. PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT = NULL;
  132. PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT = NULL;
  133. PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT = NULL;
  134. PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT = NULL;
  135. PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT = NULL;
  136. PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT = NULL;
  137. PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT = NULL;
  138. PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT = NULL;
  139. PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = NULL;
  140. PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL;
  141. PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = NULL;
  142. PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT = NULL;
  143. PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = NULL;
  144. PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT = NULL;
  145. PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT = NULL;
  146. PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT = NULL;
  147. PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT = NULL;
  148. // GL_EXT_framebuffer_multisample
  149. PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT = NULL;
  150. // GL_EXT_framebuffer_blit
  151. PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT = NULL;
  152. // GL_ARB_draw_buffers
  153. PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB = NULL;
  154. //shader object prototypes
  155. PFNGLDELETEOBJECTARBPROC glDeleteObjectARB = NULL;
  156. PFNGLGETHANDLEARBPROC glGetHandleARB = NULL;
  157. PFNGLDETACHOBJECTARBPROC glDetachObjectARB = NULL;
  158. PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
  159. PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
  160. PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
  161. PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
  162. PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
  163. PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
  164. PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
  165. PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB = NULL;
  166. PFNGLUNIFORM1FARBPROC glUniform1fARB = NULL;
  167. PFNGLUNIFORM2FARBPROC glUniform2fARB = NULL;
  168. PFNGLUNIFORM3FARBPROC glUniform3fARB = NULL;
  169. PFNGLUNIFORM4FARBPROC glUniform4fARB = NULL;
  170. PFNGLUNIFORM1IARBPROC glUniform1iARB = NULL;
  171. PFNGLUNIFORM2IARBPROC glUniform2iARB = NULL;
  172. PFNGLUNIFORM3IARBPROC glUniform3iARB = NULL;
  173. PFNGLUNIFORM4IARBPROC glUniform4iARB = NULL;
  174. PFNGLUNIFORM1FVARBPROC glUniform1fvARB = NULL;
  175. PFNGLUNIFORM2FVARBPROC glUniform2fvARB = NULL;
  176. PFNGLUNIFORM3FVARBPROC glUniform3fvARB = NULL;
  177. PFNGLUNIFORM4FVARBPROC glUniform4fvARB = NULL;
  178. PFNGLUNIFORM1IVARBPROC glUniform1ivARB = NULL;
  179. PFNGLUNIFORM2IVARBPROC glUniform2ivARB = NULL;
  180. PFNGLUNIFORM3IVARBPROC glUniform3ivARB = NULL;
  181. PFNGLUNIFORM4IVARBPROC glUniform4ivARB = NULL;
  182. PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB = NULL;
  183. PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB = NULL;
  184. PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB = NULL;
  185. PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB = NULL;
  186. PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = NULL;
  187. PFNGLGETINFOLOGARBPROC glGetInfoLogARB = NULL;
  188. PFNGLGETATTACHEDOBJECTSARBPROC glGetAttachedObjectsARB = NULL;
  189. PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
  190. PFNGLGETACTIVEUNIFORMARBPROC glGetActiveUniformARB = NULL;
  191. PFNGLGETUNIFORMFVARBPROC glGetUniformfvARB = NULL;
  192. PFNGLGETUNIFORMIVARBPROC glGetUniformivARB = NULL;
  193. PFNGLGETSHADERSOURCEARBPROC glGetShaderSourceARB = NULL;
  194. // vertex shader prototypes
  195. #if LL_LINUX || LL_SOLARIS
  196. PFNGLVERTEXATTRIB1DARBPROC glVertexAttrib1dARB = NULL;
  197. PFNGLVERTEXATTRIB1DVARBPROC glVertexAttrib1dvARB = NULL;
  198. PFNGLVERTEXATTRIB1FARBPROC glVertexAttrib1fARB = NULL;
  199. PFNGLVERTEXATTRIB1FVARBPROC glVertexAttrib1fvARB = NULL;
  200. PFNGLVERTEXATTRIB1SARBPROC glVertexAttrib1sARB = NULL;
  201. PFNGLVERTEXATTRIB1SVARBPROC glVertexAttrib1svARB = NULL;
  202. PFNGLVERTEXATTRIB2DARBPROC glVertexAttrib2dARB = NULL;
  203. PFNGLVERTEXATTRIB2DVARBPROC glVertexAttrib2dvARB = NULL;
  204. PFNGLVERTEXATTRIB2FARBPROC glVertexAttrib2fARB = NULL;
  205. PFNGLVERTEXATTRIB2FVARBPROC glVertexAttrib2fvARB = NULL;
  206. PFNGLVERTEXATTRIB2SARBPROC glVertexAttrib2sARB = NULL;
  207. PFNGLVERTEXATTRIB2SVARBPROC glVertexAttrib2svARB = NULL;
  208. PFNGLVERTEXATTRIB3DARBPROC glVertexAttrib3dARB = NULL;
  209. PFNGLVERTEXATTRIB3DVARBPROC glVertexAttrib3dvARB = NULL;
  210. PFNGLVERTEXATTRIB3FARBPROC glVertexAttrib3fARB = NULL;
  211. PFNGLVERTEXATTRIB3FVARBPROC glVertexAttrib3fvARB = NULL;
  212. PFNGLVERTEXATTRIB3SARBPROC glVertexAttrib3sARB = NULL;
  213. PFNGLVERTEXATTRIB3SVARBPROC glVertexAttrib3svARB = NULL;
  214. #endif // LL_LINUX || LL_SOLARIS
  215. PFNGLVERTEXATTRIB4NBVARBPROC glVertexAttrib4nbvARB = NULL;
  216. PFNGLVERTEXATTRIB4NIVARBPROC glVertexAttrib4nivARB = NULL;
  217. PFNGLVERTEXATTRIB4NSVARBPROC glVertexAttrib4nsvARB = NULL;
  218. PFNGLVERTEXATTRIB4NUBARBPROC glVertexAttrib4nubARB = NULL;
  219. PFNGLVERTEXATTRIB4NUBVARBPROC glVertexAttrib4nubvARB = NULL;
  220. PFNGLVERTEXATTRIB4NUIVARBPROC glVertexAttrib4nuivARB = NULL;
  221. PFNGLVERTEXATTRIB4NUSVARBPROC glVertexAttrib4nusvARB = NULL;
  222. #if LL_LINUX  || LL_SOLARIS
  223. PFNGLVERTEXATTRIB4BVARBPROC glVertexAttrib4bvARB = NULL;
  224. PFNGLVERTEXATTRIB4DARBPROC glVertexAttrib4dARB = NULL;
  225. PFNGLVERTEXATTRIB4DVARBPROC glVertexAttrib4dvARB = NULL;
  226. PFNGLVERTEXATTRIB4FARBPROC glVertexAttrib4fARB = NULL;
  227. PFNGLVERTEXATTRIB4FVARBPROC glVertexAttrib4fvARB = NULL;
  228. PFNGLVERTEXATTRIB4IVARBPROC glVertexAttrib4ivARB = NULL;
  229. PFNGLVERTEXATTRIB4SARBPROC glVertexAttrib4sARB = NULL;
  230. PFNGLVERTEXATTRIB4SVARBPROC glVertexAttrib4svARB = NULL;
  231. PFNGLVERTEXATTRIB4UBVARBPROC glVertexAttrib4ubvARB = NULL;
  232. PFNGLVERTEXATTRIB4UIVARBPROC glVertexAttrib4uivARB = NULL;
  233. PFNGLVERTEXATTRIB4USVARBPROC glVertexAttrib4usvARB = NULL;
  234. PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB = NULL;
  235. PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB = NULL;
  236. PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB = NULL;
  237. PFNGLPROGRAMSTRINGARBPROC glProgramStringARB = NULL;
  238. PFNGLBINDPROGRAMARBPROC glBindProgramARB = NULL;
  239. PFNGLDELETEPROGRAMSARBPROC glDeleteProgramsARB = NULL;
  240. PFNGLGENPROGRAMSARBPROC glGenProgramsARB = NULL;
  241. PFNGLPROGRAMENVPARAMETER4DARBPROC glProgramEnvParameter4dARB = NULL;
  242. PFNGLPROGRAMENVPARAMETER4DVARBPROC glProgramEnvParameter4dvARB = NULL;
  243. PFNGLPROGRAMENVPARAMETER4FARBPROC glProgramEnvParameter4fARB = NULL;
  244. PFNGLPROGRAMENVPARAMETER4FVARBPROC glProgramEnvParameter4fvARB = NULL;
  245. PFNGLPROGRAMLOCALPARAMETER4DARBPROC glProgramLocalParameter4dARB = NULL;
  246. PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glProgramLocalParameter4dvARB = NULL;
  247. PFNGLPROGRAMLOCALPARAMETER4FARBPROC glProgramLocalParameter4fARB = NULL;
  248. PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glProgramLocalParameter4fvARB = NULL;
  249. PFNGLGETPROGRAMENVPARAMETERDVARBPROC glGetProgramEnvParameterdvARB = NULL;
  250. PFNGLGETPROGRAMENVPARAMETERFVARBPROC glGetProgramEnvParameterfvARB = NULL;
  251. PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glGetProgramLocalParameterdvARB = NULL;
  252. PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glGetProgramLocalParameterfvARB = NULL;
  253. PFNGLGETPROGRAMIVARBPROC glGetProgramivARB = NULL;
  254. PFNGLGETPROGRAMSTRINGARBPROC glGetProgramStringARB = NULL;
  255. PFNGLGETVERTEXATTRIBDVARBPROC glGetVertexAttribdvARB = NULL;
  256. PFNGLGETVERTEXATTRIBFVARBPROC glGetVertexAttribfvARB = NULL;
  257. PFNGLGETVERTEXATTRIBIVARBPROC glGetVertexAttribivARB = NULL;
  258. PFNGLGETVERTEXATTRIBPOINTERVARBPROC glGetVertexAttribPointervARB = NULL;
  259. PFNGLISPROGRAMARBPROC glIsProgramARB = NULL;
  260. #endif // LL_LINUX || LL_SOLARIS
  261. PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB = NULL;
  262. PFNGLGETACTIVEATTRIBARBPROC glGetActiveAttribARB = NULL;
  263. PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB = NULL;
  264. #if LL_WINDOWS
  265. PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL;
  266. #endif
  267. #if LL_LINUX_NV_GL_HEADERS
  268. // linux nvidia headers.  these define these differently to mesa's.  ugh.
  269. PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = NULL;
  270. PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB = NULL;
  271. PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements = NULL;
  272. #endif // LL_LINUX_NV_GL_HEADERS
  273. #endif
  274. LLGLManager gGLManager;
  275. LLGLManager::LLGLManager() :
  276. mInited(FALSE),
  277. mIsDisabled(FALSE),
  278. mHasMultitexture(FALSE),
  279. mNumTextureUnits(1),
  280. mHasMipMapGeneration(FALSE),
  281. mHasCompressedTextures(FALSE),
  282. mHasFramebufferObject(FALSE),
  283. mHasFramebufferMultisample(FALSE),
  284. mHasVertexBufferObject(FALSE),
  285. mHasPBuffer(FALSE),
  286. mHasShaderObjects(FALSE),
  287. mHasVertexShader(FALSE),
  288. mHasFragmentShader(FALSE),
  289. mHasOcclusionQuery(FALSE),
  290. mHasPointParameters(FALSE),
  291. mHasDrawBuffers(FALSE),
  292. mHasTextureRectangle(FALSE),
  293. mHasAnisotropic(FALSE),
  294. mHasARBEnvCombine(FALSE),
  295. mHasCubeMap(FALSE),
  296. mIsATI(FALSE),
  297. mIsNVIDIA(FALSE),
  298. mIsIntel(FALSE),
  299. mIsGF2or4MX(FALSE),
  300. mIsGF3(FALSE),
  301. mIsGFFX(FALSE),
  302. mATIOffsetVerticalLines(FALSE),
  303. mATIOldDriver(FALSE),
  304. mHasRequirements(TRUE),
  305. mHasSeparateSpecularColor(FALSE),
  306. mDriverVersionMajor(1),
  307. mDriverVersionMinor(0),
  308. mDriverVersionRelease(0),
  309. mGLVersion(1.0f),
  310. mVRAM(0),
  311. mGLMaxVertexRange(0),
  312. mGLMaxIndexRange(0)
  313. {
  314. }
  315. //---------------------------------------------------------------------
  316. // Global initialization for GL
  317. //---------------------------------------------------------------------
  318. void LLGLManager::initWGL()
  319. {
  320. mHasPBuffer = FALSE;
  321. #if LL_WINDOWS && !LL_MESA_HEADLESS
  322. if (!glh_init_extensions("WGL_ARB_pixel_format"))
  323. {
  324. LL_WARNS("RenderInit") << "No ARB pixel format extensions" << LL_ENDL;
  325. }
  326. if (ExtensionExists("WGL_EXT_swap_control", gGLHExts.mSysExts))
  327. {
  328.         GLH_EXT_NAME(wglSwapIntervalEXT) = (PFNWGLSWAPINTERVALEXTPROC)GLH_EXT_GET_PROC_ADDRESS("wglSwapIntervalEXT");
  329. }
  330. if( !glh_init_extensions("WGL_ARB_pbuffer") )
  331. {
  332. LL_WARNS("RenderInit") << "No ARB WGL PBuffer extensions" << LL_ENDL;
  333. }
  334. if( !glh_init_extensions("WGL_ARB_render_texture") )
  335. {
  336. LL_WARNS("RenderInit") << "No ARB WGL render texture extensions" << LL_ENDL;
  337. }
  338. mHasPBuffer = ExtensionExists("WGL_ARB_pbuffer", gGLHExts.mSysExts) &&
  339. ExtensionExists("WGL_ARB_render_texture", gGLHExts.mSysExts) &&
  340. ExtensionExists("WGL_ARB_pixel_format", gGLHExts.mSysExts);
  341. #endif
  342. }
  343. // return false if unable (or unwilling due to old drivers) to init GL
  344. bool LLGLManager::initGL()
  345. {
  346. if (mInited)
  347. {
  348. LL_ERRS("RenderInit") << "Calling init on LLGLManager after already initialized!" << LL_ENDL;
  349. }
  350. GLint alpha_bits;
  351. glGetIntegerv( GL_ALPHA_BITS, &alpha_bits );
  352. if( 8 != alpha_bits )
  353. {
  354. LL_WARNS("RenderInit") << "Frame buffer has less than 8 bits of alpha.  Avatar texture compositing will fail." << LL_ENDL;
  355. }
  356. // Extract video card strings and convert to upper case to
  357. // work around driver-to-driver variation in capitalization.
  358. mGLVendor = std::string((const char *)glGetString(GL_VENDOR));
  359. LLStringUtil::toUpper(mGLVendor);
  360. mGLRenderer = std::string((const char *)glGetString(GL_RENDERER));
  361. LLStringUtil::toUpper(mGLRenderer);
  362. parse_gl_version( &mDriverVersionMajor, 
  363. &mDriverVersionMinor, 
  364. &mDriverVersionRelease, 
  365. &mDriverVersionVendorString );
  366. mGLVersion = mDriverVersionMajor + mDriverVersionMinor * .1f;
  367. // Trailing space necessary to keep "nVidia Corpor_ati_on" cards
  368. // from being recognized as ATI.
  369. if (mGLVendor.substr(0,4) == "ATI ")
  370. {
  371. mGLVendorShort = "ATI";
  372. BOOL mobile = FALSE;
  373. if (mGLRenderer.find("MOBILITY") != std::string::npos)
  374. {
  375. mobile = TRUE;
  376. }
  377. mIsATI = TRUE;
  378. #if LL_WINDOWS && !LL_MESA_HEADLESS
  379. if (mDriverVersionRelease < 3842)
  380. {
  381. mATIOffsetVerticalLines = TRUE;
  382. }
  383. #endif // LL_WINDOWS
  384. #if (LL_WINDOWS || LL_LINUX) && !LL_MESA_HEADLESS
  385. // release 7277 is a point at which we verify that ATI OpenGL
  386. // drivers get pretty stable with SL, ~Catalyst 8.2,
  387. // for both Win32 and Linux.
  388. if (mDriverVersionRelease < 7277 &&
  389.     mDriverVersionRelease != 0) // 0 == Undetectable driver version - these get to pretend to be new ATI drivers, though that decision may be revisited.
  390. {
  391. mATIOldDriver = TRUE;
  392. }
  393. #endif // (LL_WINDOWS || LL_LINUX) && !LL_MESA_HEADLESS
  394. }
  395. else if (mGLVendor.find("NVIDIA ") != std::string::npos)
  396. {
  397. mGLVendorShort = "NVIDIA";
  398. mIsNVIDIA = TRUE;
  399. if (   mGLRenderer.find("GEFORCE4 MX") != std::string::npos
  400. || mGLRenderer.find("GEFORCE2") != std::string::npos
  401. || mGLRenderer.find("GEFORCE 2") != std::string::npos
  402. || mGLRenderer.find("GEFORCE4 460 GO") != std::string::npos
  403. || mGLRenderer.find("GEFORCE4 440 GO") != std::string::npos
  404. || mGLRenderer.find("GEFORCE4 420 GO") != std::string::npos)
  405. {
  406. mIsGF2or4MX = TRUE;
  407. }
  408. else if (mGLRenderer.find("GEFORCE FX") != std::string::npos
  409.  || mGLRenderer.find("QUADRO FX") != std::string::npos
  410.  || mGLRenderer.find("NV34") != std::string::npos)
  411. {
  412. mIsGFFX = TRUE;
  413. }
  414. else if(mGLRenderer.find("GEFORCE3") != std::string::npos)
  415. {
  416. mIsGF3 = TRUE;
  417. }
  418. }
  419. else if (mGLVendor.find("INTEL") != std::string::npos
  420. #if LL_LINUX
  421.  // The Mesa-based drivers put this in the Renderer string,
  422.  // not the Vendor string.
  423.  || mGLRenderer.find("INTEL") != std::string::npos
  424. #endif //LL_LINUX
  425.  )
  426. {
  427. mGLVendorShort = "INTEL";
  428. mIsIntel = TRUE;
  429. }
  430. else
  431. {
  432. mGLVendorShort = "MISC";
  433. }
  434. // This is called here because it depends on the setting of mIsGF2or4MX, and sets up mHasMultitexture.
  435. initExtensions();
  436. if (mHasMultitexture)
  437. {
  438. GLint num_tex_units;
  439. glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &num_tex_units);
  440. mNumTextureUnits = llmin(num_tex_units, (GLint)MAX_GL_TEXTURE_UNITS);
  441. if (mIsIntel)
  442. {
  443. mNumTextureUnits = llmin(mNumTextureUnits, 2);
  444. }
  445. }
  446. else
  447. {
  448. mHasRequirements = FALSE;
  449. // We don't support cards that don't support the GL_ARB_multitexture extension
  450. LL_WARNS("RenderInit") << "GL Drivers do not support GL_ARB_multitexture" << LL_ENDL;
  451. return false;
  452. }
  453. initGLStates();
  454. return true;
  455. }
  456. void LLGLManager::getGLInfo(LLSD& info)
  457. {
  458. info["GLInfo"]["GLVendor"] = std::string((const char *)glGetString(GL_VENDOR));
  459. info["GLInfo"]["GLRenderer"] = std::string((const char *)glGetString(GL_RENDERER));
  460. info["GLInfo"]["GLVersion"] = std::string((const char *)glGetString(GL_VERSION));
  461. #if !LL_MESA_HEADLESS
  462. std::string all_exts = ll_safe_string((const char *)gGLHExts.mSysExts);
  463. boost::char_separator<char> sep(" ");
  464. boost::tokenizer<boost::char_separator<char> > tok(all_exts, sep);
  465. for(boost::tokenizer<boost::char_separator<char> >::iterator i = tok.begin(); i != tok.end(); ++i)
  466. {
  467. info["GLInfo"]["GLExtensions"].append(*i);
  468. }
  469. #endif
  470. }
  471. std::string LLGLManager::getGLInfoString()
  472. {
  473. std::string info_str;
  474. std::string all_exts, line;
  475. info_str += std::string("GL_VENDOR      ") + ll_safe_string((const char *)glGetString(GL_VENDOR)) + std::string("n");
  476. info_str += std::string("GL_RENDERER    ") + ll_safe_string((const char *)glGetString(GL_RENDERER)) + std::string("n");
  477. info_str += std::string("GL_VERSION     ") + ll_safe_string((const char *)glGetString(GL_VERSION)) + std::string("n");
  478. #if !LL_MESA_HEADLESS 
  479. all_exts = (const char *)gGLHExts.mSysExts;
  480. LLStringUtil::replaceChar(all_exts, ' ', 'n');
  481. info_str += std::string("GL_EXTENSIONS:n") + all_exts + std::string("n");
  482. #endif
  483. return info_str;
  484. }
  485. void LLGLManager::printGLInfoString()
  486. {
  487. std::string info_str;
  488. std::string all_exts, line;
  489. LL_INFOS("RenderInit") << "GL_VENDOR:     " << ((const char *)glGetString(GL_VENDOR)) << LL_ENDL;
  490. LL_INFOS("RenderInit") << "GL_RENDERER:   " << ((const char *)glGetString(GL_RENDERER)) << LL_ENDL;
  491. LL_INFOS("RenderInit") << "GL_VERSION:    " << ((const char *)glGetString(GL_VERSION)) << LL_ENDL;
  492. #if !LL_MESA_HEADLESS
  493. all_exts = std::string(gGLHExts.mSysExts);
  494. LLStringUtil::replaceChar(all_exts, ' ', 'n');
  495. LL_DEBUGS("RenderInit") << "GL_EXTENSIONS:n" << all_exts << LL_ENDL;
  496. #endif
  497. }
  498. std::string LLGLManager::getRawGLString()
  499. {
  500. std::string gl_string;
  501. gl_string = ll_safe_string((char*)glGetString(GL_VENDOR)) + " " + ll_safe_string((char*)glGetString(GL_RENDERER));
  502. return gl_string;
  503. }
  504. void LLGLManager::shutdownGL()
  505. {
  506. if (mInited)
  507. {
  508. glFinish();
  509. stop_glerror();
  510. mInited = FALSE;
  511. }
  512. }
  513. // these are used to turn software blending on. They appear in the Debug/Avatar menu
  514. // presence of vertex skinning/blending or vertex programs will set these to FALSE by default.
  515. void LLGLManager::initExtensions()
  516. {
  517. #if LL_MESA_HEADLESS
  518. # if GL_ARB_multitexture
  519. mHasMultitexture = TRUE;
  520. # else
  521. mHasMultitexture = FALSE;
  522. # endif
  523. # if GL_ARB_texture_env_combine
  524. mHasARBEnvCombine = TRUE;
  525. # else
  526. mHasARBEnvCombine = FALSE;
  527. # endif
  528. # if GL_ARB_texture_compression
  529. mHasCompressedTextures = TRUE;
  530. # else
  531. mHasCompressedTextures = FALSE;
  532. # endif
  533. # if GL_ARB_vertex_buffer_object
  534. mHasVertexBufferObject = TRUE;
  535. # else
  536. mHasVertexBufferObject = FALSE;
  537. # endif
  538. # if GL_EXT_framebuffer_object
  539. mHasFramebufferObject = TRUE;
  540. # else
  541. mHasFramebufferObject = FALSE;
  542. # endif
  543. # if GL_EXT_framebuffer_multisample
  544. mHasFramebufferMultisample = TRUE;
  545. # else
  546. mHasFramebufferMultisample = FALSE;
  547. # endif
  548. # if GL_ARB_draw_buffers
  549. mHasDrawBuffers = TRUE;
  550. #else
  551. mHasDrawBuffers = FALSE;
  552. # endif
  553. mHasMipMapGeneration = FALSE;
  554. mHasSeparateSpecularColor = FALSE;
  555. mHasAnisotropic = FALSE;
  556. mHasCubeMap = FALSE;
  557. mHasOcclusionQuery = FALSE;
  558. mHasPointParameters = FALSE;
  559. mHasShaderObjects = FALSE;
  560. mHasVertexShader = FALSE;
  561. mHasFragmentShader = FALSE;
  562. mHasTextureRectangle = FALSE;
  563. #else // LL_MESA_HEADLESS
  564. mHasMultitexture = glh_init_extensions("GL_ARB_multitexture");
  565. mHasMipMapGeneration = glh_init_extensions("GL_SGIS_generate_mipmap");
  566. mHasSeparateSpecularColor = glh_init_extensions("GL_EXT_separate_specular_color");
  567. mHasAnisotropic = glh_init_extensions("GL_EXT_texture_filter_anisotropic");
  568. glh_init_extensions("GL_ARB_texture_cube_map");
  569. mHasCubeMap = ExtensionExists("GL_ARB_texture_cube_map", gGLHExts.mSysExts);
  570. mHasARBEnvCombine = ExtensionExists("GL_ARB_texture_env_combine", gGLHExts.mSysExts);
  571. mHasCompressedTextures = glh_init_extensions("GL_ARB_texture_compression");
  572. mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts);
  573. mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts);
  574. // mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad
  575. mHasFramebufferObject = ExtensionExists("GL_EXT_framebuffer_object", gGLHExts.mSysExts)
  576. && ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts);
  577. mHasFramebufferMultisample = mHasFramebufferObject && ExtensionExists("GL_EXT_framebuffer_multisample", gGLHExts.mSysExts);
  578. mHasDrawBuffers = ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts);
  579. mHasTextureRectangle = ExtensionExists("GL_ARB_texture_rectangle", gGLHExts.mSysExts);
  580. #if !LL_DARWIN
  581. mHasPointParameters = !mIsATI && ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts);
  582. #endif
  583. mHasShaderObjects = ExtensionExists("GL_ARB_shader_objects", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts);
  584. mHasVertexShader = ExtensionExists("GL_ARB_vertex_program", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_vertex_shader", gGLHExts.mSysExts)
  585. && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts);
  586. mHasFragmentShader = ExtensionExists("GL_ARB_fragment_shader", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts);
  587. #endif
  588. #if LL_LINUX || LL_SOLARIS
  589. llinfos << "initExtensions() checking shell variables to adjust features..." << llendl;
  590. // Our extension support for the Linux Client is very young with some
  591. // potential driver gotchas, so offer a semi-secret way to turn it off.
  592. if (getenv("LL_GL_NOEXT"))
  593. {
  594. //mHasMultitexture = FALSE; // NEEDED!
  595. mHasARBEnvCombine = FALSE;
  596. mHasCompressedTextures = FALSE;
  597. mHasVertexBufferObject = FALSE;
  598. mHasFramebufferObject = FALSE;
  599. mHasFramebufferMultisample = FALSE;
  600. mHasDrawBuffers = FALSE;
  601. mHasMipMapGeneration = FALSE;
  602. mHasSeparateSpecularColor = FALSE;
  603. mHasAnisotropic = FALSE;
  604. mHasCubeMap = FALSE;
  605. mHasOcclusionQuery = FALSE;
  606. mHasPointParameters = FALSE;
  607. mHasShaderObjects = FALSE;
  608. mHasVertexShader = FALSE;
  609. mHasFragmentShader = FALSE;
  610. LL_WARNS("RenderInit") << "GL extension support DISABLED via LL_GL_NOEXT" << LL_ENDL;
  611. }
  612. else if (getenv("LL_GL_BASICEXT")) /* Flawfinder: ignore */
  613. {
  614. // This switch attempts to turn off all support for exotic
  615. // extensions which I believe correspond to fatal driver
  616. // bug reports.  This should be the default until we get a
  617. // proper blacklist/whitelist on Linux.
  618. mHasMipMapGeneration = FALSE;
  619. mHasAnisotropic = FALSE;
  620. //mHasCubeMap = FALSE; // apparently fatal on Intel 915 & similar
  621. //mHasOcclusionQuery = FALSE; // source of many ATI system hangs
  622. mHasShaderObjects = FALSE;
  623. mHasVertexShader = FALSE;
  624. mHasFragmentShader = FALSE;
  625. LL_WARNS("RenderInit") << "GL extension support forced to SIMPLE level via LL_GL_BASICEXT" << LL_ENDL;
  626. }
  627. if (getenv("LL_GL_BLACKLIST")) /* Flawfinder: ignore */
  628. {
  629. // This lets advanced troubleshooters disable specific
  630. // GL extensions to isolate problems with their hardware.
  631. // SL-28126
  632. const char *const blacklist = getenv("LL_GL_BLACKLIST"); /* Flawfinder: ignore */
  633. LL_WARNS("RenderInit") << "GL extension support partially disabled via LL_GL_BLACKLIST: " << blacklist << LL_ENDL;
  634. if (strchr(blacklist,'a')) mHasARBEnvCombine = FALSE;
  635. if (strchr(blacklist,'b')) mHasCompressedTextures = FALSE;
  636. if (strchr(blacklist,'c')) mHasVertexBufferObject = FALSE;
  637. if (strchr(blacklist,'d')) mHasMipMapGeneration = FALSE;//S
  638. //  if (strchr(blacklist,'f')) mHasNVVertexArrayRange = FALSE;//S
  639. //  if (strchr(blacklist,'g')) mHasNVFence = FALSE;//S
  640. if (strchr(blacklist,'h')) mHasSeparateSpecularColor = FALSE;
  641. if (strchr(blacklist,'i')) mHasAnisotropic = FALSE;//S
  642. if (strchr(blacklist,'j')) mHasCubeMap = FALSE;//S
  643. //  if (strchr(blacklist,'k')) mHasATIVAO = FALSE;//S
  644. if (strchr(blacklist,'l')) mHasOcclusionQuery = FALSE;
  645. if (strchr(blacklist,'m')) mHasShaderObjects = FALSE;//S
  646. if (strchr(blacklist,'n')) mHasVertexShader = FALSE;//S
  647. if (strchr(blacklist,'o')) mHasFragmentShader = FALSE;//S
  648. if (strchr(blacklist,'p')) mHasPointParameters = FALSE;//S
  649. if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S
  650. if (strchr(blacklist,'r')) mHasDrawBuffers = FALSE;//S
  651. if (strchr(blacklist,'s')) mHasFramebufferMultisample = FALSE;
  652. if (strchr(blacklist,'t')) mHasTextureRectangle = FALSE;
  653. }
  654. #endif // LL_LINUX || LL_SOLARIS
  655. if (!mHasMultitexture)
  656. {
  657. LL_INFOS("RenderInit") << "Couldn't initialize multitexturing" << LL_ENDL;
  658. }
  659. if (!mHasMipMapGeneration)
  660. {
  661. LL_INFOS("RenderInit") << "Couldn't initialize mipmap generation" << LL_ENDL;
  662. }
  663. if (!mHasARBEnvCombine)
  664. {
  665. LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_texture_env_combine" << LL_ENDL;
  666. }
  667. if (!mHasSeparateSpecularColor)
  668. {
  669. LL_INFOS("RenderInit") << "Couldn't initialize separate specular color" << LL_ENDL;
  670. }
  671. if (!mHasAnisotropic)
  672. {
  673. LL_INFOS("RenderInit") << "Couldn't initialize anisotropic filtering" << LL_ENDL;
  674. }
  675. if (!mHasCompressedTextures)
  676. {
  677. LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_texture_compression" << LL_ENDL;
  678. }
  679. if (!mHasOcclusionQuery)
  680. {
  681. LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_occlusion_query" << LL_ENDL;
  682. }
  683. if (!mHasPointParameters)
  684. {
  685. LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_point_parameters" << LL_ENDL;
  686. }
  687. if (!mHasShaderObjects)
  688. {
  689. LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_shader_objects" << LL_ENDL;
  690. }
  691. if (!mHasVertexShader)
  692. {
  693. LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_vertex_shader" << LL_ENDL;
  694. }
  695. if (!mHasFragmentShader)
  696. {
  697. LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_fragment_shader" << LL_ENDL;
  698. }
  699. // Disable certain things due to known bugs
  700. if (mIsIntel && mHasMipMapGeneration)
  701. {
  702. LL_INFOS("RenderInit") << "Disabling mip-map generation for Intel GPUs" << LL_ENDL;
  703. mHasMipMapGeneration = FALSE;
  704. }
  705. if (mIsATI && mHasMipMapGeneration)
  706. {
  707. LL_INFOS("RenderInit") << "Disabling mip-map generation for ATI GPUs (performance opt)" << LL_ENDL;
  708. mHasMipMapGeneration = FALSE;
  709. }
  710. // Misc
  711. glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);
  712. glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange);
  713. #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS
  714. LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL;
  715. if (mHasVertexBufferObject)
  716. {
  717. glBindBufferARB = (PFNGLBINDBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBindBufferARB");
  718. if (glBindBufferARB)
  719. {
  720. glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteBuffersARB");
  721. glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenBuffersARB");
  722. glIsBufferARB = (PFNGLISBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glIsBufferARB");
  723. glBufferDataARB = (PFNGLBUFFERDATAARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBufferDataARB");
  724. glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBufferSubDataARB");
  725. glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetBufferSubDataARB");
  726. glMapBufferARB = (PFNGLMAPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMapBufferARB");
  727. glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glUnmapBufferARB");
  728. glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetBufferParameterivARB");
  729. glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetBufferPointervARB");
  730. }
  731. else
  732. {
  733. mHasVertexBufferObject = FALSE;
  734. }
  735. }
  736. if (mHasFramebufferObject)
  737. {
  738. llinfos << "initExtensions() FramebufferObject-related procs..." << llendl;
  739. glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsRenderbufferEXT");
  740. glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindRenderbufferEXT");
  741. glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteRenderbuffersEXT");
  742. glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenRenderbuffersEXT");
  743. glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageEXT");
  744. glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetRenderbufferParameterivEXT");
  745. glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsFramebufferEXT");
  746. glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindFramebufferEXT");
  747. glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteFramebuffersEXT");
  748. glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenFramebuffersEXT");
  749. glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glCheckFramebufferStatusEXT");
  750. glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture1DEXT");
  751. glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture2DEXT");
  752. glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture3DEXT");
  753. glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferRenderbufferEXT");
  754. glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetFramebufferAttachmentParameterivEXT");
  755. glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenerateMipmapEXT");
  756. }
  757. if (mHasFramebufferMultisample)
  758. {
  759. glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageMultisampleEXT");
  760. glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBlitFramebufferEXT");
  761. }
  762. if (mHasDrawBuffers)
  763. {
  764. glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDrawBuffersARB");
  765. }
  766. #if (!LL_LINUX && !LL_SOLARIS) || LL_LINUX_NV_GL_HEADERS
  767. // This is expected to be a static symbol on Linux GL implementations, except if we use the nvidia headers - bah
  768. glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements");
  769. if (!glDrawRangeElements)
  770. {
  771. mGLMaxVertexRange = 0;
  772. mGLMaxIndexRange = 0;
  773. }
  774. #endif // !LL_LINUX || LL_LINUX_NV_GL_HEADERS
  775. #if LL_LINUX_NV_GL_HEADERS
  776. // nvidia headers are critically different from mesa-esque
  777.   glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveTextureARB");
  778.   glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)GLH_EXT_GET_PROC_ADDRESS("glClientActiveTextureARB");
  779. #endif // LL_LINUX_NV_GL_HEADERS
  780. if (mHasOcclusionQuery)
  781. {
  782. llinfos << "initExtensions() OcclusionQuery-related procs..." << llendl;
  783. glGenQueriesARB = (PFNGLGENQUERIESARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenQueriesARB");
  784. glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteQueriesARB");
  785. glIsQueryARB = (PFNGLISQUERYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glIsQueryARB");
  786. glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBeginQueryARB");
  787. glEndQueryARB = (PFNGLENDQUERYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glEndQueryARB");
  788. glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryivARB");
  789. glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectivARB");
  790. glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectuivARB");
  791. }
  792. if (mHasPointParameters)
  793. {
  794. llinfos << "initExtensions() PointParameters-related procs..." << llendl;
  795. glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfARB");
  796. glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfvARB");
  797. }
  798. if (mHasShaderObjects)
  799. {
  800. glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteObjectARB");
  801. glGetHandleARB = (PFNGLGETHANDLEARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetHandleARB");
  802. glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDetachObjectARB");
  803. glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) GLH_EXT_GET_PROC_ADDRESS("glCreateShaderObjectARB");
  804. glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) GLH_EXT_GET_PROC_ADDRESS("glShaderSourceARB");
  805. glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) GLH_EXT_GET_PROC_ADDRESS("glCompileShaderARB");
  806. glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) GLH_EXT_GET_PROC_ADDRESS("glCreateProgramObjectARB");
  807. glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) GLH_EXT_GET_PROC_ADDRESS("glAttachObjectARB");
  808. glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) GLH_EXT_GET_PROC_ADDRESS("glLinkProgramARB");
  809. glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUseProgramObjectARB");
  810. glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) GLH_EXT_GET_PROC_ADDRESS("glValidateProgramARB");
  811. glUniform1fARB = (PFNGLUNIFORM1FARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform1fARB");
  812. glUniform2fARB = (PFNGLUNIFORM2FARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform2fARB");
  813. glUniform3fARB = (PFNGLUNIFORM3FARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform3fARB");
  814. glUniform4fARB = (PFNGLUNIFORM4FARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform4fARB");
  815. glUniform1iARB = (PFNGLUNIFORM1IARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform1iARB");
  816. glUniform2iARB = (PFNGLUNIFORM2IARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform2iARB");
  817. glUniform3iARB = (PFNGLUNIFORM3IARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform3iARB");
  818. glUniform4iARB = (PFNGLUNIFORM4IARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform4iARB");
  819. glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform1fvARB");
  820. glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform2fvARB");
  821. glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform3fvARB");
  822. glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform4fvARB");
  823. glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform1ivARB");
  824. glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform2ivARB");
  825. glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform3ivARB");
  826. glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform4ivARB");
  827. glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix2fvARB");
  828. glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix3fvARB");
  829. glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix4fvARB");
  830. glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterfvARB");
  831. glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterivARB");
  832. glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetInfoLogARB");
  833. glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetAttachedObjectsARB");
  834. glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetUniformLocationARB");
  835. glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetActiveUniformARB");
  836. glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetUniformfvARB");
  837. glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetUniformivARB");
  838. glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetShaderSourceARB");
  839. }
  840. if (mHasVertexShader)
  841. {
  842. llinfos << "initExtensions() VertexShader-related procs..." << llendl;
  843. glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetAttribLocationARB");
  844. glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) GLH_EXT_GET_PROC_ADDRESS("glBindAttribLocationARB");
  845. glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetActiveAttribARB");
  846. glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dARB");
  847. glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dvARB");
  848. glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fARB");
  849. glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fvARB");
  850. glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1sARB");
  851. glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1svARB");
  852. glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dARB");
  853. glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dvARB");
  854. glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fARB");
  855. glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fvARB");
  856. glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2sARB");
  857. glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2svARB");
  858. glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dARB");
  859. glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dvARB");
  860. glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fARB");
  861. glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fvARB");
  862. glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3sARB");
  863. glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3svARB");
  864. glVertexAttrib4nbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4nbvARB");
  865. glVertexAttrib4nivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4nivARB");
  866. glVertexAttrib4nsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4nsvARB");
  867. glVertexAttrib4nubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4nubARB");
  868. glVertexAttrib4nubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4nubvARB");
  869. glVertexAttrib4nuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4nuivARB");
  870. glVertexAttrib4nusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4nusvARB");
  871. glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4bvARB");
  872. glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dARB");
  873. glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dvARB");
  874. glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fARB");
  875. glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fvARB");
  876. glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4ivARB");
  877. glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4sARB");
  878. glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4svARB");
  879. glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4ubvARB");
  880. glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4uivARB");
  881. glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4usvARB");
  882. glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttribPointerARB");
  883. glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) GLH_EXT_GET_PROC_ADDRESS("glEnableVertexAttribArrayARB");
  884. glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDisableVertexAttribArrayARB");
  885. glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) GLH_EXT_GET_PROC_ADDRESS("glProgramStringARB");
  886. glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) GLH_EXT_GET_PROC_ADDRESS("glBindProgramARB");
  887. glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteProgramsARB");
  888. glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGenProgramsARB");
  889. glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4dARB");
  890. glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4dvARB");
  891. glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4fARB");
  892. glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4fvARB");
  893. glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4dARB");
  894. glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4dvARB");
  895. glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4fARB");
  896. glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4fvARB");
  897. glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetProgramEnvParameterdvARB");
  898. glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetProgramEnvParameterfvARB");
  899. glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetProgramLocalParameterdvARB");
  900. glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetProgramLocalParameterfvARB");
  901. glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetProgramivARB");
  902. glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetProgramStringARB");
  903. glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribdvARB");
  904. glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribfvARB");
  905. glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribivARB");
  906. glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glgetVertexAttribPointervARB");
  907. glIsProgramARB = (PFNGLISPROGRAMARBPROC) GLH_EXT_GET_PROC_ADDRESS("glIsProgramARB");
  908. }
  909. LL_DEBUGS("RenderInit") << "GL Probe: Got symbols" << LL_ENDL;
  910. #endif
  911. mInited = TRUE;
  912. }
  913. void rotate_quat(LLQuaternion& rotation)
  914. {
  915. F32 angle_radians, x, y, z;
  916. rotation.getAngleAxis(&angle_radians, &x, &y, &z);
  917. glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
  918. }
  919. void flush_glerror()
  920. {
  921. glGetError();
  922. }
  923. void assert_glerror()
  924. {
  925. if (!gGLActive)
  926. {
  927. //llwarns << "GL used while not active!" << llendl;
  928. if (gDebugSession)
  929. {
  930. //ll_fail("GL used while not active");
  931. }
  932. }
  933. if (gNoRender || !gDebugGL) 
  934. {
  935. return;
  936. }
  937. if (!gGLManager.mInited)
  938. {
  939. LL_ERRS("RenderInit") << "GL not initialized" << LL_ENDL;
  940. }
  941. //  Create or update texture to be used with this data 
  942. GLenum error;
  943. error = glGetError();
  944. BOOL quit = FALSE;
  945. while (error)
  946. {
  947. quit = TRUE;
  948. #ifndef LL_LINUX // *FIX: !  This should be an error for linux as well.
  949. GLubyte const * gl_error_msg = gluErrorString(error);
  950. if (NULL != gl_error_msg)
  951. {
  952. LL_WARNS("RenderState") << "GL Error:" << error<< LL_ENDL;
  953. LL_WARNS("RenderState") << "GL Error String:" << gl_error_msg << LL_ENDL;
  954. if (gDebugSession)
  955. {
  956. gFailLog << "GL Error:" << gl_error_msg << std::endl;
  957. }
  958. }
  959. else
  960. {
  961. // gluErrorString returns NULL for some extensions' error codes.
  962. // you'll probably have to grep for the number in glext.h.
  963. LL_WARNS("RenderState") << "GL Error: UNKNOWN 0x" << std::hex << error << std::dec << LL_ENDL;
  964. if (gDebugSession)
  965. {
  966. gFailLog << "GL Error: UNKNOWN 0x" << std::hex << error << std::dec << std::endl;
  967. }
  968. }
  969. error = glGetError();
  970. #endif
  971. }
  972. if (quit)
  973. {
  974. if (gDebugSession)
  975. {
  976. ll_fail("assert_glerror failed");
  977. }
  978. else
  979. {
  980. llerrs << "One or more unhandled GL errors." << llendl;
  981. }
  982. }
  983. }
  984. void clear_glerror()
  985. {
  986. //  Create or update texture to be used with this data 
  987. GLenum error;
  988. error = glGetError();
  989. }
  990. ///////////////////////////////////////////////////////////////
  991. //
  992. // LLGLState
  993. //
  994. // Static members
  995. std::map<LLGLenum, LLGLboolean> LLGLState::sStateMap;
  996. GLboolean LLGLDepthTest::sDepthEnabled = GL_FALSE; // OpenGL default
  997. GLenum LLGLDepthTest::sDepthFunc = GL_LESS; // OpenGL default
  998. GLboolean LLGLDepthTest::sWriteEnabled = GL_TRUE; // OpenGL default
  999. //static
  1000. void LLGLState::initClass() 
  1001. {
  1002. sStateMap[GL_DITHER] = GL_TRUE;
  1003. // sStateMap[GL_TEXTURE_2D] = GL_TRUE;
  1004. //make sure multisample defaults to disabled
  1005. sStateMap[GL_MULTISAMPLE_ARB] = GL_FALSE;
  1006. glDisable(GL_MULTISAMPLE_ARB);
  1007. sStateMap[GL_MULTISAMPLE_ARB] = GL_FALSE;
  1008. glDisable(GL_MULTISAMPLE_ARB);
  1009. glEnableClientState(GL_VERTEX_ARRAY);
  1010. }
  1011. //static
  1012. void LLGLState::restoreGL()
  1013. {
  1014. sStateMap.clear();
  1015. initClass();
  1016. }
  1017. //static
  1018. // Really shouldn't be needed, but seems we sometimes do.
  1019. void LLGLState::resetTextureStates()
  1020. {
  1021. gGL.flush();
  1022. GLint maxTextureUnits;
  1023. glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &maxTextureUnits);
  1024. for (S32 j = maxTextureUnits-1; j >=0; j--)
  1025. {
  1026. gGL.getTexUnit(j)->activate();
  1027. glClientActiveTextureARB(GL_TEXTURE0_ARB+j);
  1028. j == 0 ? gGL.getTexUnit(j)->enable(LLTexUnit::TT_TEXTURE) : gGL.getTexUnit(j)->disable();
  1029. }
  1030. }
  1031. void LLGLState::dumpStates() 
  1032. {
  1033. LL_INFOS("RenderState") << "GL States:" << LL_ENDL;
  1034. for (std::map<LLGLenum, LLGLboolean>::iterator iter = sStateMap.begin();
  1035.  iter != sStateMap.end(); ++iter)
  1036. {
  1037. LL_INFOS("RenderState") << llformat(" 0x%04x : %s",(S32)iter->first,iter->second?"TRUE":"FALSE") << LL_ENDL;
  1038. }
  1039. }
  1040. void LLGLState::checkStates(const std::string& msg)  
  1041. {
  1042. if (!gDebugGL)
  1043. {
  1044. return;
  1045. }
  1046. stop_glerror();
  1047. GLint src;
  1048. GLint dst;
  1049. glGetIntegerv(GL_BLEND_SRC, &src);
  1050. glGetIntegerv(GL_BLEND_DST, &dst);
  1051. BOOL error = FALSE;
  1052. if (src != GL_SRC_ALPHA || dst != GL_ONE_MINUS_SRC_ALPHA)
  1053. {
  1054. if (gDebugSession)
  1055. {
  1056. gFailLog << "Blend function corrupted: " << std::hex << src << " " << std::hex << dst << "  " << msg << std::dec << std::endl;
  1057. error = TRUE;
  1058. }
  1059. else
  1060. {
  1061. LL_GL_ERRS << "Blend function corrupted: " << std::hex << src << " " << std::hex << dst << "  " << msg << std::dec << LL_ENDL;
  1062. }
  1063. }
  1064. for (std::map<LLGLenum, LLGLboolean>::iterator iter = sStateMap.begin();
  1065.  iter != sStateMap.end(); ++iter)
  1066. {
  1067. LLGLenum state = iter->first;
  1068. LLGLboolean cur_state = iter->second;
  1069. LLGLboolean gl_state = glIsEnabled(state);
  1070. if(cur_state != gl_state)
  1071. {
  1072. dumpStates();
  1073. if (gDebugSession)
  1074. {
  1075. gFailLog << llformat("LLGLState error. State: 0x%04x",state) << std::endl;
  1076. error = TRUE;
  1077. }
  1078. else
  1079. {
  1080. LL_GL_ERRS << llformat("LLGLState error. State: 0x%04x",state) << LL_ENDL;
  1081. }
  1082. }
  1083. }
  1084. if (error)
  1085. {
  1086. ll_fail("LLGLState::checkStates failed.");
  1087. }
  1088. stop_glerror();
  1089. }
  1090. void LLGLState::checkTextureChannels(const std::string& msg)
  1091. {
  1092. if (!gDebugGL)
  1093. {
  1094. return;
  1095. }
  1096. stop_glerror();
  1097. GLint activeTexture;
  1098. glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &activeTexture);
  1099. stop_glerror();
  1100. BOOL error = FALSE;
  1101. if (activeTexture == GL_TEXTURE0_ARB)
  1102. {
  1103. GLint tex_env_mode = 0;
  1104. glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &tex_env_mode);
  1105. stop_glerror();
  1106. if (tex_env_mode != GL_MODULATE)
  1107. {
  1108. error = TRUE;
  1109. LL_WARNS("RenderState") << "GL_TEXTURE_ENV_MODE invalid: " << std::hex << tex_env_mode << std::dec << LL_ENDL;
  1110. if (gDebugSession)
  1111. {
  1112. gFailLog << "GL_TEXTURE_ENV_MODE invalid: " << std::hex << tex_env_mode << std::dec << std::endl;
  1113. }
  1114. }
  1115. }
  1116. GLint maxTextureUnits = 0;
  1117. glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &maxTextureUnits);
  1118. stop_glerror();
  1119. static const char* label[] =
  1120. {
  1121. "GL_TEXTURE_2D",
  1122. "GL_TEXTURE_COORD_ARRAY",
  1123. "GL_TEXTURE_1D",
  1124. "GL_TEXTURE_CUBE_MAP_ARB",
  1125. "GL_TEXTURE_GEN_S",
  1126. "GL_TEXTURE_GEN_T",
  1127. "GL_TEXTURE_GEN_Q",
  1128. "GL_TEXTURE_GEN_R",
  1129. "GL_TEXTURE_RECTANGLE_ARB"
  1130. };
  1131. static GLint value[] =
  1132. {
  1133. GL_TEXTURE_2D,
  1134. GL_TEXTURE_COORD_ARRAY,
  1135. GL_TEXTURE_1D,
  1136. GL_TEXTURE_CUBE_MAP_ARB,
  1137. GL_TEXTURE_GEN_S,
  1138. GL_TEXTURE_GEN_T,
  1139. GL_TEXTURE_GEN_Q,
  1140. GL_TEXTURE_GEN_R,
  1141. GL_TEXTURE_RECTANGLE_ARB
  1142. };
  1143. GLint stackDepth = 0;
  1144. glh::matrix4f mat;
  1145. glh::matrix4f identity;
  1146. identity.identity();
  1147. for (GLint i = 1; i < maxTextureUnits; i++)
  1148. {
  1149. gGL.getTexUnit(i)->activate();
  1150. glClientActiveTextureARB(GL_TEXTURE0_ARB+i);
  1151. stop_glerror();
  1152. glGetIntegerv(GL_TEXTURE_STACK_DEPTH, &stackDepth);
  1153. stop_glerror();
  1154. if (stackDepth != 1)
  1155. {
  1156. error = TRUE;
  1157. LL_WARNS("RenderState") << "Texture matrix stack corrupted." << LL_ENDL;
  1158. if (gDebugSession)
  1159. {
  1160. gFailLog << "Texture matrix stack corrupted." << std::endl;
  1161. }
  1162. }
  1163. glGetFloatv(GL_TEXTURE_MATRIX, (GLfloat*) mat.m);
  1164. stop_glerror();
  1165. if (mat != identity)
  1166. {
  1167. error = TRUE;
  1168. LL_WARNS("RenderState") << "Texture matrix in channel " << i << " corrupt." << LL_ENDL;
  1169. if (gDebugSession)
  1170. {
  1171. gFailLog << "Texture matrix in channel " << i << " corrupt." << std::endl;
  1172. }
  1173. }
  1174. for (S32 j = (i == 0 ? 1 : 0); 
  1175. j < (gGLManager.mHasTextureRectangle ? 9 : 8); j++)
  1176. {
  1177. if (glIsEnabled(value[j]))
  1178. {
  1179. error = TRUE;
  1180. LL_WARNS("RenderState") << "Texture channel " << i << " still has " << label[j] << " enabled." << LL_ENDL;
  1181. if (gDebugSession)
  1182. {
  1183. gFailLog << "Texture channel " << i << " still has " << label[j] << " enabled." << std::endl;
  1184. }
  1185. }
  1186. stop_glerror();
  1187. }
  1188. glGetFloatv(GL_TEXTURE_MATRIX, mat.m);
  1189. stop_glerror();
  1190. if (mat != identity)
  1191. {
  1192. error = TRUE;
  1193. LL_WARNS("RenderState") << "Texture matrix " << i << " is not identity." << LL_ENDL;
  1194. if (gDebugSession)
  1195. {
  1196. gFailLog << "Texture matrix " << i << " is not identity." << std::endl;
  1197. }
  1198. }
  1199. }
  1200. gGL.getTexUnit(0)->activate();
  1201. glClientActiveTextureARB(GL_TEXTURE0_ARB);
  1202. stop_glerror();
  1203. if (error)
  1204. {
  1205. if (gDebugSession)
  1206. {
  1207. ll_fail("LLGLState::checkTextureChannels failed.");
  1208. }
  1209. else
  1210. {
  1211. LL_GL_ERRS << "GL texture state corruption detected.  " << msg << LL_ENDL;
  1212. }
  1213. }
  1214. }
  1215. void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
  1216. {
  1217. if (!gDebugGL)
  1218. {
  1219. return;
  1220. }
  1221. stop_glerror();
  1222. BOOL error = FALSE;
  1223. GLint active_texture;
  1224. glGetIntegerv(GL_CLIENT_ACTIVE_TEXTURE_ARB, &active_texture);
  1225. if (active_texture != GL_TEXTURE0_ARB)
  1226. {
  1227. llwarns << "Client active texture corrupted: " << active_texture << llendl;
  1228. if (gDebugSession)
  1229. {
  1230. gFailLog << "Client active texture corrupted: " << active_texture << std::endl;
  1231. }
  1232. error = TRUE;
  1233. }
  1234. glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &active_texture);
  1235. if (active_texture != GL_TEXTURE0_ARB)
  1236. {
  1237. llwarns << "Active texture corrupted: " << active_texture << llendl;
  1238. if (gDebugSession)
  1239. {
  1240. gFailLog << "Active texture corrupted: " << active_texture << std::endl;
  1241. }
  1242. error = TRUE;
  1243. }
  1244. static const char* label[] =
  1245. {
  1246. "GL_VERTEX_ARRAY",
  1247. "GL_NORMAL_ARRAY",
  1248. "GL_COLOR_ARRAY",
  1249. "GL_TEXTURE_COORD_ARRAY"
  1250. };
  1251. static GLint value[] =
  1252. {
  1253. GL_VERTEX_ARRAY,
  1254. GL_NORMAL_ARRAY,
  1255. GL_COLOR_ARRAY,
  1256. GL_TEXTURE_COORD_ARRAY
  1257. };
  1258.  U32 mask[] = 
  1259. { //copied from llvertexbuffer.h
  1260. 0x0001, //MAP_VERTEX,
  1261. 0x0002, //MAP_NORMAL,
  1262. 0x0010, //MAP_COLOR,
  1263. 0x0004, //MAP_TEXCOORD
  1264. };
  1265. for (S32 j = 0; j < 4; j++)
  1266. {
  1267. if (glIsEnabled(value[j]))
  1268. {
  1269. if (!(mask[j] & data_mask))
  1270. {
  1271. error = TRUE;
  1272. LL_WARNS("RenderState") << "GL still has " << label[j] << " enabled." << LL_ENDL;
  1273. if (gDebugSession)
  1274. {
  1275. gFailLog << "GL still has " << label[j] << " enabled." << std::endl;
  1276. }
  1277. }
  1278. }
  1279. else
  1280. {
  1281. if (mask[j] & data_mask)
  1282. {
  1283. error = TRUE;
  1284. LL_WARNS("RenderState") << "GL does not have " << label[j] << " enabled." << LL_ENDL;
  1285. if (gDebugSession)
  1286. {
  1287. gFailLog << "GL does not have " << label[j] << " enabled." << std::endl;
  1288. }
  1289. }
  1290. }
  1291. }
  1292. glClientActiveTextureARB(GL_TEXTURE1_ARB);
  1293. gGL.getTexUnit(1)->activate();
  1294. if (glIsEnabled(GL_TEXTURE_COORD_ARRAY))
  1295. {
  1296. if (!(data_mask & 0x0008))
  1297. {
  1298. error = TRUE;
  1299. LL_WARNS("RenderState") << "GL still has GL_TEXTURE_COORD_ARRAY enabled on channel 1." << LL_ENDL;
  1300. if (gDebugSession)
  1301. {
  1302. gFailLog << "GL still has GL_TEXTURE_COORD_ARRAY enabled on channel 1." << std::endl;
  1303. }
  1304. }
  1305. }
  1306. else
  1307. {
  1308. if (data_mask & 0x0008)
  1309. {
  1310. error = TRUE;
  1311. LL_WARNS("RenderState") << "GL does not have GL_TEXTURE_COORD_ARRAY enabled on channel 1." << LL_ENDL;
  1312. if (gDebugSession)
  1313. {
  1314. gFailLog << "GL does not have GL_TEXTURE_COORD_ARRAY enabled on channel 1." << std::endl;
  1315. }
  1316. }
  1317. }
  1318. if (glIsEnabled(GL_TEXTURE_2D))
  1319. {
  1320. if (!(data_mask & 0x0008))
  1321. {
  1322. error = TRUE;
  1323. LL_WARNS("RenderState") << "GL still has GL_TEXTURE_2D enabled on channel 1." << LL_ENDL;
  1324. if (gDebugSession)
  1325. {
  1326. gFailLog << "GL still has GL_TEXTURE_2D enabled on channel 1." << std::endl;
  1327. }
  1328. }
  1329. }
  1330. else
  1331. {
  1332. if (data_mask & 0x0008)
  1333. {
  1334. error = TRUE;
  1335. LL_WARNS("RenderState") << "GL does not have GL_TEXTURE_2D enabled on channel 1." << LL_ENDL;
  1336. if (gDebugSession)
  1337. {
  1338. gFailLog << "GL does not have GL_TEXTURE_2D enabled on channel 1." << std::endl;
  1339. }
  1340. }
  1341. }
  1342. glClientActiveTextureARB(GL_TEXTURE0_ARB);
  1343. gGL.getTexUnit(0)->activate();
  1344. if (gGLManager.mHasVertexShader)
  1345. { //make sure vertex attribs are all disabled
  1346. GLint count;
  1347. glGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &count);
  1348. for (GLint i = 0; i < count; i++)
  1349. {
  1350. GLint enabled;
  1351. glGetVertexAttribivARB((GLuint) i, GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB, &enabled);
  1352. if (enabled)
  1353. {
  1354. error = TRUE;
  1355. LL_WARNS("RenderState") << "GL still has vertex attrib array " << i << " enabled." << LL_ENDL;
  1356. if (gDebugSession)
  1357. {
  1358. gFailLog <<  "GL still has vertex attrib array " << i << " enabled." << std::endl;
  1359. }
  1360. }
  1361. }
  1362. }
  1363. if (error)
  1364. {
  1365. if (gDebugSession)
  1366. {
  1367. ll_fail("LLGLState::checkClientArrays failed.");
  1368. }
  1369. else
  1370. {
  1371. LL_GL_ERRS << "GL client array corruption detected.  " << msg << LL_ENDL;
  1372. }
  1373. }
  1374. }
  1375. ///////////////////////////////////////////////////////////////////////
  1376. LLGLState::LLGLState(LLGLenum state, S32 enabled) :
  1377. mState(state), mWasEnabled(FALSE), mIsEnabled(FALSE)
  1378. {
  1379. stop_glerror();
  1380. if (state)
  1381. {
  1382. mWasEnabled = sStateMap[state];
  1383. llassert(mWasEnabled == glIsEnabled(state));
  1384. setEnabled(enabled);
  1385. stop_glerror();
  1386. }
  1387. }
  1388. void LLGLState::setEnabled(S32 enabled)
  1389. {
  1390. if (!mState)
  1391. {
  1392. return;
  1393. }
  1394. if (enabled == CURRENT_STATE)
  1395. {
  1396. enabled = sStateMap[mState] == GL_TRUE ? TRUE : FALSE;
  1397. }
  1398. else if (enabled == TRUE && sStateMap[mState] != GL_TRUE)
  1399. {
  1400. gGL.flush();
  1401. glEnable(mState);
  1402. sStateMap[mState] = GL_TRUE;
  1403. }
  1404. else if (enabled == FALSE && sStateMap[mState] != GL_FALSE)
  1405. {
  1406. gGL.flush();
  1407. glDisable(mState);
  1408. sStateMap[mState] = GL_FALSE;
  1409. }
  1410. mIsEnabled = enabled;
  1411. }
  1412. LLGLState::~LLGLState() 
  1413. {
  1414. stop_glerror();
  1415. if (mState)
  1416. {
  1417. if (gDebugGL)
  1418. {
  1419. if (!gDebugSession)
  1420. {
  1421. llassert_always(sStateMap[mState] == glIsEnabled(mState));
  1422. }
  1423. else
  1424. {
  1425. if (sStateMap[mState] != glIsEnabled(mState))
  1426. {
  1427. ll_fail("GL enabled state does not match expected");
  1428. }
  1429. }
  1430. }
  1431. if (mIsEnabled != mWasEnabled)
  1432. {
  1433. gGL.flush();
  1434. if (mWasEnabled)
  1435. {
  1436. glEnable(mState);
  1437. sStateMap[mState] = GL_TRUE;
  1438. }
  1439. else
  1440. {
  1441. glDisable(mState);
  1442. sStateMap[mState] = GL_FALSE;
  1443. }
  1444. }
  1445. }
  1446. stop_glerror();
  1447. }
  1448. ////////////////////////////////////////////////////////////////////////////////
  1449. void LLGLManager::initGLStates()
  1450. {
  1451. //gl states moved to classes in llglstates.h
  1452. LLGLState::initClass();
  1453. }
  1454. ////////////////////////////////////////////////////////////////////////////////
  1455. void enable_vertex_weighting(const S32 index)
  1456. {
  1457. #if GL_ARB_vertex_program
  1458. if (index > 0) glEnableVertexAttribArrayARB(index); // vertex weights
  1459. #endif
  1460. }
  1461. void disable_vertex_weighting(const S32 index)
  1462. {
  1463. #if GL_ARB_vertex_program
  1464. if (index > 0) glDisableVertexAttribArrayARB(index); // vertex weights
  1465. #endif
  1466. }
  1467. void enable_binormals(const S32 index)
  1468. {
  1469. #if GL_ARB_vertex_program
  1470. if (index > 0)
  1471. {
  1472. glEnableVertexAttribArrayARB(index); // binormals
  1473. }
  1474. #endif
  1475. }
  1476. void disable_binormals(const S32 index)
  1477. {
  1478. #if GL_ARB_vertex_program
  1479. if (index > 0)
  1480. {
  1481. glDisableVertexAttribArrayARB(index); // binormals
  1482. }
  1483. #endif
  1484. }
  1485. void enable_cloth_weights(const S32 index)
  1486. {
  1487. #if GL_ARB_vertex_program
  1488. if (index > 0) glEnableVertexAttribArrayARB(index);
  1489. #endif
  1490. }
  1491. void disable_cloth_weights(const S32 index)
  1492. {
  1493. #if GL_ARB_vertex_program
  1494. if (index > 0) glDisableVertexAttribArrayARB(index);
  1495. #endif
  1496. }
  1497. void set_vertex_weights(const S32 index, const U32 stride, const F32 *weights)
  1498. {
  1499. #if GL_ARB_vertex_program
  1500. if (index > 0) glVertexAttribPointerARB(index, 1, GL_FLOAT, FALSE, stride, weights);
  1501. stop_glerror();
  1502. #endif
  1503. }
  1504. void set_vertex_clothing_weights(const S32 index, const U32 stride, const LLVector4 *weights)
  1505. {
  1506. #if GL_ARB_vertex_program
  1507. if (index > 0) glVertexAttribPointerARB(index, 4, GL_FLOAT, TRUE, stride, weights);
  1508. stop_glerror();
  1509. #endif
  1510. }
  1511. void set_binormals(const S32 index, const U32 stride,const LLVector3 *binormals)
  1512. {
  1513. #if GL_ARB_vertex_program
  1514. if (index > 0) glVertexAttribPointerARB(index, 3, GL_FLOAT, FALSE, stride, binormals);
  1515. stop_glerror();
  1516. #endif
  1517. }
  1518. void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific )
  1519. {
  1520. // GL_VERSION returns a null-terminated string with the format: 
  1521. // <major>.<minor>[.<release>] [<vendor specific>]
  1522. const char* version = (const char*) glGetString(GL_VERSION);
  1523. *major = 0;
  1524. *minor = 0;
  1525. *release = 0;
  1526. vendor_specific->assign("");
  1527. if( !version )
  1528. {
  1529. return;
  1530. }
  1531. std::string ver_copy( version );
  1532. S32 len = (S32)strlen( version ); /* Flawfinder: ignore */
  1533. S32 i = 0;
  1534. S32 start;
  1535. // Find the major version
  1536. start = i;
  1537. for( ; i < len; i++ )
  1538. {
  1539. if( '.' == version[i] )
  1540. {
  1541. break;
  1542. }
  1543. }
  1544. std::string major_str = ver_copy.substr(start,i-start);
  1545. LLStringUtil::convertToS32(major_str, *major);
  1546. if( '.' == version[i] )
  1547. {
  1548. i++;
  1549. }
  1550. // Find the minor version
  1551. start = i;
  1552. for( ; i < len; i++ )
  1553. {
  1554. if( ('.' == version[i]) || isspace(version[i]) )
  1555. {
  1556. break;
  1557. }
  1558. }
  1559. std::string minor_str = ver_copy.substr(start,i-start);
  1560. LLStringUtil::convertToS32(minor_str, *minor);
  1561. // Find the release number (optional)
  1562. if( '.' == version[i] )
  1563. {
  1564. i++;
  1565. start = i;
  1566. for( ; i < len; i++ )
  1567. {
  1568. if( isspace(version[i]) )
  1569. {
  1570. break;
  1571. }
  1572. }
  1573. std::string release_str = ver_copy.substr(start,i-start);
  1574. LLStringUtil::convertToS32(release_str, *release);
  1575. }
  1576. // Skip over any white space
  1577. while( version[i] && isspace( version[i] ) )
  1578. {
  1579. i++;
  1580. }
  1581. // Copy the vendor-specific string (optional)
  1582. if( version[i] )
  1583. {
  1584. vendor_specific->assign( version + i );
  1585. }
  1586. }
  1587. LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const glh::matrix4f& modelview, const glh::matrix4f& projection)
  1588. {
  1589. mModelview = modelview;
  1590. mProjection = projection;
  1591. setPlane(p.mV[0], p.mV[1], p.mV[2], p.mV[3]);
  1592. }
  1593. void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)
  1594. {
  1595. glh::matrix4f& P = mProjection;
  1596. glh::matrix4f& M = mModelview;
  1597.     
  1598. glh::matrix4f invtrans_MVP = (P * M).inverse().transpose();
  1599.     glh::vec4f oplane(a,b,c,d);
  1600.     glh::vec4f cplane;
  1601.     invtrans_MVP.mult_matrix_vec(oplane, cplane);
  1602.     cplane /= fabs(cplane[2]); // normalize such that depth is not scaled
  1603.     cplane[3] -= 1;
  1604.     if(cplane[2] < 0)
  1605.         cplane *= -1;
  1606.     glh::matrix4f suffix;
  1607.     suffix.set_row(2, cplane);
  1608.     glh::matrix4f newP = suffix * P;
  1609.     glMatrixMode(GL_PROJECTION);
  1610. glPushMatrix();
  1611.     glLoadMatrixf(newP.m);
  1612. gGLObliqueProjectionInverse = LLMatrix4(newP.inverse().transpose().m);
  1613.     glMatrixMode(GL_MODELVIEW);
  1614. }
  1615. LLGLUserClipPlane::~LLGLUserClipPlane()
  1616. {
  1617. glMatrixMode(GL_PROJECTION);
  1618. glPopMatrix();
  1619. glMatrixMode(GL_MODELVIEW);
  1620. }
  1621. LLGLNamePool::LLGLNamePool()
  1622. {
  1623. }
  1624. void LLGLNamePool::registerPool(LLGLNamePool* pool)
  1625. {
  1626. pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), pool);
  1627. if (iter == sInstances.end())
  1628. {
  1629. sInstances.push_back(pool);
  1630. }
  1631. }
  1632. LLGLNamePool::~LLGLNamePool()
  1633. {
  1634. pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), this);
  1635. if (iter != sInstances.end())
  1636. {
  1637. sInstances.erase(iter);
  1638. }
  1639. }
  1640. void LLGLNamePool::upkeep()
  1641. {
  1642. std::sort(mNameList.begin(), mNameList.end(), CompareUsed());
  1643. }
  1644. void LLGLNamePool::cleanup()
  1645. {
  1646. for (name_list_t::iterator iter = mNameList.begin(); iter != mNameList.end(); ++iter)
  1647. {
  1648. releaseName(iter->name);
  1649. }
  1650. mNameList.clear();
  1651. }
  1652. GLuint LLGLNamePool::allocate()
  1653. {
  1654. #if LL_GL_NAME_POOLING
  1655. for (name_list_t::iterator iter = mNameList.begin(); iter != mNameList.end(); ++iter)
  1656. {
  1657. if (!iter->used)
  1658. {
  1659. iter->used = TRUE;
  1660. return iter->name;
  1661. }
  1662. }
  1663. NameEntry entry;
  1664. entry.name = allocateName();
  1665. entry.used = TRUE;
  1666. mNameList.push_back(entry);
  1667. return entry.name;
  1668. #else
  1669. return allocateName();
  1670. #endif
  1671. }
  1672. void LLGLNamePool::release(GLuint name)
  1673. {
  1674. #if LL_GL_NAME_POOLING
  1675. for (name_list_t::iterator iter = mNameList.begin(); iter != mNameList.end(); ++iter)
  1676. {
  1677. if (iter->name == name)
  1678. {
  1679. if (iter->used)
  1680. {
  1681. iter->used = FALSE;
  1682. return;
  1683. }
  1684. else
  1685. {
  1686. llerrs << "Attempted to release a pooled name that is not in use!" << llendl;
  1687. }
  1688. }
  1689. }
  1690. llerrs << "Attempted to release a non pooled name!" << llendl;
  1691. #else
  1692. releaseName(name);
  1693. #endif
  1694. }
  1695. //static
  1696. void LLGLNamePool::upkeepPools()
  1697. {
  1698. LLMemType mt(LLMemType::MTYPE_UPKEEP_POOLS);
  1699. for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
  1700. {
  1701. LLGLNamePool* pool = *iter;
  1702. pool->upkeep();
  1703. }
  1704. }
  1705. //static
  1706. void LLGLNamePool::cleanupPools()
  1707. {
  1708. for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
  1709. {
  1710. LLGLNamePool* pool = *iter;
  1711. pool->cleanup();
  1712. }
  1713. }
  1714. LLGLDepthTest::LLGLDepthTest(GLboolean depth_enabled, GLboolean write_enabled, GLenum depth_func)
  1715. : mPrevDepthEnabled(sDepthEnabled), mPrevDepthFunc(sDepthFunc), mPrevWriteEnabled(sWriteEnabled)
  1716. {
  1717. stop_glerror();
  1718. checkState();
  1719. if (!depth_enabled)
  1720. { // always disable depth writes if depth testing is disabled
  1721.   // GL spec defines this as a requirement, but some implementations allow depth writes with testing disabled
  1722.   // The proper way to write to depth buffer with testing disabled is to enable testing and use a depth_func of GL_ALWAYS
  1723. write_enabled = FALSE;
  1724. }
  1725. if (depth_enabled != sDepthEnabled)
  1726. {
  1727. gGL.flush();
  1728. if (depth_enabled) glEnable(GL_DEPTH_TEST);
  1729. else glDisable(GL_DEPTH_TEST);
  1730. sDepthEnabled = depth_enabled;
  1731. }
  1732. if (depth_func != sDepthFunc)
  1733. {
  1734. gGL.flush();
  1735. glDepthFunc(depth_func);
  1736. sDepthFunc = depth_func;
  1737. }
  1738. if (write_enabled != sWriteEnabled)
  1739. {
  1740. gGL.flush();
  1741. glDepthMask(write_enabled);
  1742. sWriteEnabled = write_enabled;
  1743. }
  1744. }
  1745. LLGLDepthTest::~LLGLDepthTest()
  1746. {
  1747. checkState();
  1748. if (sDepthEnabled != mPrevDepthEnabled )
  1749. {
  1750. gGL.flush();
  1751. if (mPrevDepthEnabled) glEnable(GL_DEPTH_TEST);
  1752. else glDisable(GL_DEPTH_TEST);
  1753. sDepthEnabled = mPrevDepthEnabled;
  1754. }
  1755. if (sDepthFunc != mPrevDepthFunc)
  1756. {
  1757. gGL.flush();
  1758. glDepthFunc(mPrevDepthFunc);
  1759. sDepthFunc = mPrevDepthFunc;
  1760. }
  1761. if (sWriteEnabled != mPrevWriteEnabled )
  1762. {
  1763. gGL.flush();
  1764. glDepthMask(mPrevWriteEnabled);
  1765. sWriteEnabled = mPrevWriteEnabled;
  1766. }
  1767. }
  1768. void LLGLDepthTest::checkState()
  1769. {
  1770. if (gDebugGL)
  1771. {
  1772. GLint func = 0;
  1773. GLboolean mask = FALSE;
  1774. glGetIntegerv(GL_DEPTH_FUNC, &func);
  1775. glGetBooleanv(GL_DEPTH_WRITEMASK, &mask);
  1776. if (glIsEnabled(GL_DEPTH_TEST) != sDepthEnabled ||
  1777. sWriteEnabled != mask ||
  1778. sDepthFunc != func)
  1779. {
  1780. if (gDebugSession)
  1781. {
  1782. gFailLog << "Unexpected depth testing state." << std::endl;
  1783. }
  1784. else
  1785. {
  1786. LL_GL_ERRS << "Unexpected depth testing state." << LL_ENDL;
  1787. }
  1788. }
  1789. }
  1790. }
  1791. LLGLClampToFarClip::LLGLClampToFarClip(glh::matrix4f P)
  1792. {
  1793. for (U32 i = 0; i < 4; i++)
  1794. {
  1795. P.element(2, i) = P.element(3, i) * 0.99999f;
  1796. }
  1797. glMatrixMode(GL_PROJECTION);
  1798. glPushMatrix();
  1799. glLoadMatrixf(P.m);
  1800. glMatrixMode(GL_MODELVIEW);
  1801. }
  1802. LLGLClampToFarClip::~LLGLClampToFarClip()
  1803. {
  1804. glMatrixMode(GL_PROJECTION);
  1805. glPopMatrix();
  1806. glMatrixMode(GL_MODELVIEW);
  1807. }