opengl_extension.c 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025
  1. /*
  2. Copyright (C) 2004 Michael Liebscher
  3. This program is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU General Public License
  5. as published by the Free Software Foundation; either version 2
  6. of the License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  14. */
  15. /*
  16. * myopengl_extension.c: Interface to OpenGL extensions.
  17. *
  18. * Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
  19. * Date: 2004
  20. *
  21. */
  22. /*
  23. This module implements the binding of OpenGL extensions
  24. to our function pointers.
  25. To use this module call the function GL_ConfigExtensions().
  26. */
  27. #include <string.h>
  28. #include "myopengl.h"
  29. #include "opengl_local.h"
  30. #include "myopengl_extension.h"
  31. #include "../../common/common_utils.h"
  32. #include "../../common/common.h"
  33. /* Implemented here */
  34. // Define what you require here.
  35. // If hardware does not meet these defines, then extension load will fail.
  36. #define MY_MAX_ARB_TEXTURESTAGES 4
  37. #define MY_GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTR 128
  38. #define MY_GL_MAX_VERTEX_SHADER_LOCALS_EXT 68
  39. #define MY_GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 2
  40. #define MY_GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 97
  41. #define MY_GL_MAX_VERTEX_SHADER_VARIANTS_EXT 4
  42. GL_Extensions gl_ext;
  43. //////////////////////////////
  44. //
  45. // ARB Functions
  46. //
  47. //////////////////////////////
  48. PRIVATE W8 ConfigARBMultiTexture( const char *glext )
  49. {
  50. if( strstr( glext, "GL_ARB_multitexture" ) == NULL )
  51. {
  52. Com_Printf( "...GL_ARB_multitexture not found\n" );
  53. return 0;
  54. }
  55. if( ! (pfglActiveTextureARB = ( void * )pfwglGetProcAddress( "glActiveTextureARB" )) ) return 0;
  56. if( ! (pfglClientActiveTextureARB = ( void * )pfwglGetProcAddress("glClientActiveTextureARB")))return 0;
  57. if( ! (pfglMultiTexCoord1sARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1sARB" ))) return 0;
  58. if( ! (pfglMultiTexCoord1iARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1iARB" ))) return 0;
  59. if( ! (pfglMultiTexCoord1fARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1fARB" ))) return 0;
  60. if( ! (pfglMultiTexCoord1dARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1dARB" ))) return 0;
  61. if( ! (pfglMultiTexCoord2sARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2sARB" ))) return 0;
  62. if( ! (pfglMultiTexCoord2iARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2iARB" ))) return 0;
  63. if( ! (pfglMultiTexCoord2fARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2fARB" ))) return 0;
  64. if( ! (pfglMultiTexCoord2dARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2dARB" ))) return 0;
  65. if( ! (pfglMultiTexCoord3sARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3sARB" ))) return 0;
  66. if( ! (pfglMultiTexCoord3iARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3iARB" ))) return 0;
  67. if( ! (pfglMultiTexCoord3fARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3fARB" ))) return 0;
  68. if( ! (pfglMultiTexCoord3dARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3dARB" ))) return 0;
  69. if( ! (pfglMultiTexCoord4sARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4sARB" ))) return 0;
  70. if( ! (pfglMultiTexCoord4iARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4iARB" ))) return 0;
  71. if( ! (pfglMultiTexCoord4fARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4fARB" ))) return 0;
  72. if( ! (pfglMultiTexCoord4dARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4dARB" ))) return 0;
  73. if( ! (pfglMultiTexCoord1svARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1svARB" ))) return 0;
  74. if( ! (pfglMultiTexCoord1ivARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1ivARB" ))) return 0;
  75. if( ! (pfglMultiTexCoord1fvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1fvARB" ))) return 0;
  76. if( ! (pfglMultiTexCoord1dvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1dvARB" ))) return 0;
  77. if( ! (pfglMultiTexCoord2svARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2svARB" ))) return 0;
  78. if( ! (pfglMultiTexCoord2ivARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2ivARB" ))) return 0;
  79. if( ! (pfglMultiTexCoord2fvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2fvARB" ))) return 0;
  80. if( ! (pfglMultiTexCoord2dvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2dvARB" ))) return 0;
  81. if( ! (pfglMultiTexCoord3svARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3svARB" ))) return 0;
  82. if( ! (pfglMultiTexCoord3ivARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3ivARB" ))) return 0;
  83. if( ! (pfglMultiTexCoord3fvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3fvARB" ))) return 0;
  84. if( ! (pfglMultiTexCoord3dvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3dvARB" ))) return 0;
  85. if( ! (pfglMultiTexCoord4svARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4svARB" ))) return 0;
  86. if( ! (pfglMultiTexCoord4ivARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4ivARB" ))) return 0;
  87. if( ! (pfglMultiTexCoord4fvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4fvARB" ))) return 0;
  88. if( ! (pfglMultiTexCoord4dvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4dvARB" ))) return 0;
  89. Com_Printf( "...enabling GL_ARB_multitexture\n" );
  90. return 1;
  91. }
  92. PRIVATE W8 ConfigARBTextureCompression( const char *glext )
  93. {
  94. if( strstr( glext, "GL_ARB_texture_compression" ) == NULL )
  95. {
  96. Com_Printf( "...GL_ARB_texture_compression not found\n" );
  97. return 0;
  98. }
  99. if( ! (pfglCompressedTexImage3DARB = ( void * )pfwglGetProcAddress( "glCompressedTexImage3DARB" ))) return 0;
  100. if( ! (pfglCompressedTexImage2DARB = ( void * )pfwglGetProcAddress( "glCompressedTexImage2DARB" ))) return 0;
  101. if( ! (pfglCompressedTexImage1DARB = ( void * )pfwglGetProcAddress( "glCompressedTexImage1DARB" ))) return 0;
  102. if( ! (pfglCompressedTexSubImage3DARB = ( void * )pfwglGetProcAddress( "glCompressedTexSubImage3DARB" ))) return 0;
  103. if( ! (pfglCompressedTexSubImage2DARB = ( void * )pfwglGetProcAddress( "glCompressedTexSubImage2DARB" ))) return 0;
  104. if( ! (pfglCompressedTexSubImage1DARB = ( void * )pfwglGetProcAddress( "glCompressedTexSubImage1DARB" ))) return 0;
  105. if( ! (pfglGetCompressedTexImageARB = ( void * )pfwglGetProcAddress( "glGetCompressedTexImageARB" ))) return 0;
  106. Com_Printf( "...enabling GL_ARB_texture_compression\n" );
  107. return 1;
  108. }
  109. PRIVATE W8 CheckARBTextureCubeMap( const char *glext )
  110. {
  111. if( strstr( glext, "GL_ARB_texture_cube_map" ) == NULL )
  112. {
  113. Com_Printf( "...GL_ARB_texture_cube_map not found\n" );
  114. return 0;
  115. }
  116. Com_Printf( "...enabling GL_ARB_texture_cube_map\n" );
  117. return 1;
  118. }
  119. PRIVATE W8 ConfigARBVertexProgram( const char *glext )
  120. {
  121. if( strstr( glext, "GL_ARB_vertex_program" ) == NULL )
  122. {
  123. return 0;
  124. }
  125. if( ! (pfglVertexAttrib1sARB = ( void * )pfwglGetProcAddress("glVertexAttrib1sARB"))) return 0;
  126. if( ! (pfglVertexAttrib1fARB = ( void * )pfwglGetProcAddress("glVertexAttrib1fARB"))) return 0;
  127. if( ! (pfglVertexAttrib1dARB = ( void * )pfwglGetProcAddress("glVertexAttrib1dARB"))) return 0;
  128. if( ! (pfglVertexAttrib2sARB = ( void * )pfwglGetProcAddress("glVertexAttrib2sARB"))) return 0;
  129. if( ! (pfglVertexAttrib2fARB = ( void * )pfwglGetProcAddress("glVertexAttrib2fARB"))) return 0;
  130. if( ! (pfglVertexAttrib2dARB = ( void * )pfwglGetProcAddress("glVertexAttrib2dARB"))) return 0;
  131. if( ! (pfglVertexAttrib3sARB = ( void * )pfwglGetProcAddress("glVertexAttrib3sARB"))) return 0;
  132. if( ! (pfglVertexAttrib3fARB = ( void * )pfwglGetProcAddress("glVertexAttrib3fARB"))) return 0;
  133. if( ! (pfglVertexAttrib3dARB = ( void * )pfwglGetProcAddress("glVertexAttrib3dARB"))) return 0;
  134. if( ! (pfglVertexAttrib4sARB = ( void * )pfwglGetProcAddress("glVertexAttrib4sARB"))) return 0;
  135. if( ! (pfglVertexAttrib4fARB = ( void * )pfwglGetProcAddress("glVertexAttrib4fARB"))) return 0;
  136. if( ! (pfglVertexAttrib4dARB = ( void * )pfwglGetProcAddress("glVertexAttrib4dARB"))) return 0;
  137. if( ! (pfglVertexAttrib4NubARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NubARB"))) return 0;
  138. if( ! (pfglVertexAttrib1svARB = ( void * )pfwglGetProcAddress("glVertexAttrib1svARB"))) return 0;
  139. if( ! (pfglVertexAttrib1fvARB = ( void * )pfwglGetProcAddress("glVertexAttrib1fvARB"))) return 0;
  140. if( ! (pfglVertexAttrib1dvARB = ( void * )pfwglGetProcAddress("glVertexAttrib1dvARB"))) return 0;
  141. if( ! (pfglVertexAttrib2svARB = ( void * )pfwglGetProcAddress("glVertexAttrib2svARB"))) return 0;
  142. if( ! (pfglVertexAttrib2fvARB = ( void * )pfwglGetProcAddress("glVertexAttrib2fvARB"))) return 0;
  143. if( ! (pfglVertexAttrib2dvARB = ( void * )pfwglGetProcAddress("glVertexAttrib2dvARB"))) return 0;
  144. if( ! (pfglVertexAttrib3svARB = ( void * )pfwglGetProcAddress("glVertexAttrib3svARB"))) return 0;
  145. if( ! (pfglVertexAttrib3fvARB = ( void * )pfwglGetProcAddress("glVertexAttrib3fvARB"))) return 0;
  146. if( ! (pfglVertexAttrib3dvARB = ( void * )pfwglGetProcAddress("glVertexAttrib3dvARB"))) return 0;
  147. if( ! (pfglVertexAttrib4bvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4bvARB"))) return 0;
  148. if( ! (pfglVertexAttrib4svARB = ( void * )pfwglGetProcAddress("glVertexAttrib4svARB"))) return 0;
  149. if( ! (pfglVertexAttrib4ivARB = ( void * )pfwglGetProcAddress("glVertexAttrib4ivARB"))) return 0;
  150. if( ! (pfglVertexAttrib4ubvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4ubvARB"))) return 0;
  151. if( ! (pfglVertexAttrib4usvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4usvARB"))) return 0;
  152. if( ! (pfglVertexAttrib4uivARB = ( void * )pfwglGetProcAddress("glVertexAttrib4uivARB"))) return 0;
  153. if( ! (pfglVertexAttrib4fvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4fvARB"))) return 0;
  154. if( ! (pfglVertexAttrib4dvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4dvARB"))) return 0;
  155. if( ! (pfglVertexAttrib4NbvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NbvARB"))) return 0;
  156. if( ! (pfglVertexAttrib4NsvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NsvARB"))) return 0;
  157. if( ! (pfglVertexAttrib4NivARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NivARB"))) return 0;
  158. if( ! (pfglVertexAttrib4NubvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NubvARB"))) return 0;
  159. if( ! (pfglVertexAttrib4NusvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NusvARB"))) return 0;
  160. if( ! (pfglVertexAttrib4NuivARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NuivARB"))) return 0;
  161. if( ! (pfglVertexAttribPointerARB = ( void * )pfwglGetProcAddress("glVertexAttribPointerARB"))) return 0;
  162. if( ! (pfglEnableVertexAttribArrayARB = ( void * )pfwglGetProcAddress("glEnableVertexAttribArrayARB"))) return 0;
  163. if( ! (pfglDisableVertexAttribArrayARB = ( void * )pfwglGetProcAddress("glDisableVertexAttribArrayARB"))) return 0;
  164. if( ! (pfglProgramStringARB = ( void * )pfwglGetProcAddress("glProgramStringARB"))) return 0;
  165. if( ! (pfglBindProgramARB = ( void * )pfwglGetProcAddress("glBindProgramARB"))) return 0;
  166. if( ! (pfglDeleteProgramsARB = ( void * )pfwglGetProcAddress("glDeleteProgramsARB"))) return 0;
  167. if( ! (pfglGenProgramsARB = ( void * )pfwglGetProcAddress("glGenProgramsARB"))) return 0;
  168. if( ! (pfglProgramEnvParameter4fARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4fARB"))) return 0;
  169. if( ! (pfglProgramEnvParameter4dARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4dARB"))) return 0;
  170. if( ! (pfglProgramEnvParameter4fvARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4fvARB"))) return 0;
  171. if( ! (pfglProgramEnvParameter4dvARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4dvARB"))) return 0;
  172. if( ! (pfglProgramLocalParameter4fARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4fARB"))) return 0;
  173. if( ! (pfglProgramLocalParameter4dARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4dARB"))) return 0;
  174. if( ! (pfglProgramLocalParameter4fvARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4fvARB"))) return 0;
  175. if( ! (pfglProgramLocalParameter4dvARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4dvARB"))) return 0;
  176. if( ! (pfglGetProgramEnvParameterfvARB = ( void * )pfwglGetProcAddress("glGetProgramEnvParameterfvARB"))) return 0;
  177. if( ! (pfglGetProgramEnvParameterdvARB = ( void * )pfwglGetProcAddress("glGetProgramEnvParameterdvARB"))) return 0;
  178. if( ! (pfglGetProgramLocalParameterfvARB = ( void * )pfwglGetProcAddress("glGetProgramLocalParameterfvARB"))) return 0;
  179. if( ! (pfglGetProgramLocalParameterdvARB = ( void * )pfwglGetProcAddress("glGetProgramLocalParameterdvARB"))) return 0;
  180. if( ! (pfglGetProgramivARB = ( void * )pfwglGetProcAddress("glGetProgramivARB"))) return 0;
  181. if( ! (pfglGetProgramStringARB = ( void * )pfwglGetProcAddress("glGetProgramStringARB"))) return 0;
  182. if( ! (pfglGetVertexAttribdvARB = ( void * )pfwglGetProcAddress("glGetVertexAttribdvARB"))) return 0;
  183. if( ! (pfglGetVertexAttribfvARB = ( void * )pfwglGetProcAddress("glGetVertexAttribfvARB"))) return 0;
  184. if( ! (pfglGetVertexAttribivARB = ( void * )pfwglGetProcAddress("glGetVertexAttribivARB"))) return 0;
  185. if( ! (pfglGetVertexAttribPointervARB = ( void * )pfwglGetProcAddress("glGetVertexAttribPointervARB"))) return 0;
  186. if( ! (pfglIsProgramARB = ( void * )pfwglGetProcAddress("glIsProgramARB"))) return 0;
  187. Com_Printf( "...enabling GL_ARB_vertex_program\n" );
  188. return 1;
  189. }
  190. ////////////////////////////////////////////////////////////
  191. //////////////////////////////
  192. //
  193. // EXT Functions
  194. //
  195. //////////////////////////////
  196. PRIVATE W8 CheckEXTTextureCompressionS3TC( const char *glext )
  197. {
  198. if( strstr( glext, "GL_EXT_texture_compression_s3tc" ) == NULL )
  199. {
  200. Com_Printf( "...GL_EXT_texture_compression_s3tc not found\n" );
  201. return 0;
  202. }
  203. Com_Printf( "...enabling GL_EXT_texture_compression_s3tc\n" );
  204. return 1;
  205. }
  206. PRIVATE W8 CheckEXTTextureEnvCombine( const char *glext )
  207. {
  208. if( strstr( glext, "GL_EXT_texture_env_combine" ) == NULL )
  209. {
  210. Com_Printf( "...GL_EXT_texture_env_combine not found\n" );
  211. return 0;
  212. }
  213. Com_Printf( "...enabling GL_EXT_texture_env_combine\n" );
  214. return 1;
  215. }
  216. PRIVATE W8 ConfigEXTSecondaryColor( const char *glext )
  217. {
  218. if( strstr( glext, "GL_EXT_secondary_color" ) == NULL )
  219. {
  220. Com_Printf( "...GL_EXT_secondary_color not found\n" );
  221. return 0;
  222. }
  223. if( ! (pfglSecondaryColor3bEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3bEXT"))) return 0;
  224. if( ! (pfglSecondaryColor3bvEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3bvEXT"))) return 0;
  225. if( ! (pfglSecondaryColor3dEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3dEXT"))) return 0;
  226. if( ! (pfglSecondaryColor3dvEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3dvEXT"))) return 0;
  227. if( ! (pfglSecondaryColor3fEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3fEXT"))) return 0;
  228. if( ! (pfglSecondaryColor3fvEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3fvEXT"))) return 0;
  229. if( ! (pfglSecondaryColor3iEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3iEXT"))) return 0;
  230. if( ! (pfglSecondaryColor3ivEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3ivEXT"))) return 0;
  231. if( ! (pfglSecondaryColor3sEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3sEXT"))) return 0;
  232. if( ! (pfglSecondaryColor3svEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3svEXT"))) return 0;
  233. if( ! (pfglSecondaryColor3ubEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3ubEXT"))) return 0;
  234. if( ! (pfglSecondaryColor3ubvEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3ubvEXT"))) return 0;
  235. if( ! (pfglSecondaryColor3uiEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3uiEXT"))) return 0;
  236. if( ! (pfglSecondaryColor3uivEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3uivEXT"))) return 0;
  237. if( ! (pfglSecondaryColor3usEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3usEXT"))) return 0;
  238. if( ! (pfglSecondaryColor3usvEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3usvEXT"))) return 0;
  239. if( ! (pfglSecondaryColorPointerEXT = ( void * )pfwglGetProcAddress("glSecondaryColorPointerEXT"))) return 0;
  240. Com_Printf( "...enabling GL_EXT_secondary_color\n" );
  241. return 1;
  242. }
  243. PRIVATE W8 ConfigEXTBlendColor( const char *glext )
  244. {
  245. if( strstr( glext, "GL_EXT_blend_color" ) == NULL )
  246. {
  247. Com_Printf( "...GL_EXT_blend_color not found\n" );
  248. return 0;
  249. }
  250. if( ! (pfglBlendColorEXT = (void *)pfwglGetProcAddress( "glBlendColorEXT" ))) return 0;
  251. Com_Printf( "...enabling GL_EXT_blend_color\n" );
  252. return 1;
  253. }
  254. PRIVATE W8 ConfigEXTVertexShader( const char *glext )
  255. {
  256. GLint glnum;
  257. if( strstr( glext, "GL_EXT_vertex_shader" ) == NULL )
  258. {
  259. return 0;
  260. }
  261. if( ! (pfglBeginVertexShaderEXT = ( void * )pfwglGetProcAddress("glBeginVertexShaderEXT"))) return 0;
  262. if( ! (pfglEndVertexShaderEXT = ( void * )pfwglGetProcAddress("glEndVertexShaderEXT"))) return 0;
  263. if( ! (pfglBindVertexShaderEXT = ( void * )pfwglGetProcAddress("glBindVertexShaderEXT"))) return 0;
  264. if( ! (pfglGenVertexShadersEXT = ( void * )pfwglGetProcAddress("glGenVertexShadersEXT"))) return 0;
  265. if( ! (pfglDeleteVertexShaderEXT = ( void * )pfwglGetProcAddress("glDeleteVertexShaderEXT"))) return 0;
  266. if( ! (pfglShaderOp1EXT = ( void * )pfwglGetProcAddress("glShaderOp1EXT"))) return 0;
  267. if( ! (pfglShaderOp2EXT = ( void * )pfwglGetProcAddress("glShaderOp2EXT"))) return 0;
  268. if( ! (pfglShaderOp3EXT = ( void * )pfwglGetProcAddress("glShaderOp3EXT"))) return 0;
  269. if( ! (pfglSwizzleEXT = ( void * )pfwglGetProcAddress("glSwizzleEXT"))) return 0;
  270. if( ! (pfglWriteMaskEXT = ( void * )pfwglGetProcAddress("glWriteMaskEXT"))) return 0;
  271. if( ! (pfglInsertComponentEXT = ( void * )pfwglGetProcAddress("glInsertComponentEXT"))) return 0;
  272. if( ! (pfglExtractComponentEXT = ( void * )pfwglGetProcAddress("glExtractComponentEXT"))) return 0;
  273. if( ! (pfglGenSymbolsEXT = ( void * )pfwglGetProcAddress("glGenSymbolsEXT"))) return 0;
  274. if( ! (pfglSetInvariantEXT = ( void * )pfwglGetProcAddress("glSetInvariantEXT"))) return 0;
  275. if( ! (pfglSetLocalConstantEXT = ( void * )pfwglGetProcAddress("glSetLocalConstantEXT"))) return 0;
  276. if( ! (pfglVariantPointerEXT = ( void * )pfwglGetProcAddress("glVariantPointerEXT"))) return 0;
  277. if( ! (pfglEnableVariantClientStateEXT = ( void * )pfwglGetProcAddress("glEnableVariantClientStateEXT"))) return 0;
  278. if( ! (pfglDisableVariantClientStateEXT = ( void * )pfwglGetProcAddress("glDisableVariantClientStateEXT"))) return 0;
  279. if( ! (pfglBindLightParameterEXT = ( void * )pfwglGetProcAddress("glBindLightParameterEXT"))) return 0;
  280. if( ! (pfglBindMaterialParameterEXT = ( void * )pfwglGetProcAddress("glBindMaterialParameterEXT"))) return 0;
  281. if( ! (pfglBindTexGenParameterEXT = ( void * )pfwglGetProcAddress("glBindTexGenParameterEXT"))) return 0;
  282. if( ! (pfglBindTextureUnitParameterEXT = ( void * )pfwglGetProcAddress("glBindTextureUnitParameterEXT"))) return 0;
  283. if( ! (pfglBindParameterEXT = ( void * )pfwglGetProcAddress("glBindParameterEXT"))) return 0;
  284. if( ! (pfglIsVariantEnabledEXT = ( void * )pfwglGetProcAddress("glIsVariantEnabledEXT"))) return 0;
  285. if( ! (pfglGetVariantBooleanvEXT = ( void * )pfwglGetProcAddress("glGetVariantBooleanvEXT"))) return 0;
  286. if( ! (pfglGetVariantIntegervEXT = ( void * )pfwglGetProcAddress("glGetVariantIntegervEXT"))) return 0;
  287. if( ! (pfglGetVariantFloatvEXT = ( void * )pfwglGetProcAddress("glGetVariantFloatvEXT"))) return 0;
  288. if( ! (pfglGetVariantPointervEXT = ( void * )pfwglGetProcAddress("glGetVariantPointervEXT"))) return 0;
  289. if( ! (pfglGetInvariantBooleanvEXT = ( void * )pfwglGetProcAddress("glGetInvariantBooleanvEXT"))) return 0;
  290. if( ! (pfglGetInvariantIntegervEXT = ( void * )pfwglGetProcAddress("glGetInvariantIntegervEXT"))) return 0;
  291. if( ! (pfglGetInvariantFloatvEXT = ( void * )pfwglGetProcAddress("glGetInvariantFloatvEXT"))) return 0;
  292. if( ! (pfglGetLocalConstantBooleanvEXT = ( void * )pfwglGetProcAddress("glGetLocalConstantBooleanvEXT"))) return 0;
  293. if( ! (pfglGetLocalConstantIntegervEXT = ( void * )pfwglGetProcAddress("glGetLocalConstantIntegervEXT"))) return 0;
  294. if( ! (pfglGetLocalConstantFloatvEXT = ( void * )pfwglGetProcAddress("glGetLocalConstantFloatvEXT"))) return 0;
  295. //
  296. // Checks to see if hardware is able to run our stuff
  297. //
  298. pfglGetIntegerv( GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT, &glnum );
  299. if( glnum < MY_GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTR )
  300. {
  301. return 0;
  302. }
  303. pfglGetIntegerv( GL_MAX_VERTEX_SHADER_LOCALS_EXT, &glnum );
  304. if( glnum < MY_GL_MAX_VERTEX_SHADER_LOCALS_EXT )
  305. {
  306. Com_Printf( "...Some vertex programs may fail to load" );
  307. return 0;
  308. }
  309. pfglGetIntegerv( GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT, &glnum );
  310. if( glnum < MY_GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT )
  311. {
  312. return 0;
  313. }
  314. pfglGetIntegerv( GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT, &glnum );
  315. if( glnum < MY_GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT )
  316. {
  317. return 0;
  318. }
  319. pfglGetIntegerv( GL_MAX_VERTEX_SHADER_VARIANTS_EXT, &glnum );
  320. if( glnum < MY_GL_MAX_VERTEX_SHADER_VARIANTS_EXT )
  321. {
  322. return 0;
  323. }
  324. Com_Printf( "...enabling GL_EXT_vertex_shader\n" );
  325. return 1;
  326. }
  327. PRIVATE W8 ConfigEXTVertexWeighting( const char *glext )
  328. {
  329. if( strstr( glext, "GL_EXT_vertex_weighting" ) == NULL )
  330. {
  331. Com_Printf( "...GL_EXT_vertex_weighting not found\n" );
  332. return 0;
  333. }
  334. if( ! (pfglVertexWeightfEXT = ( void * )pfwglGetProcAddress( "glVertexWeightfEXT" ))) return 0;
  335. if( ! (pfglVertexWeightfvEXT = ( void * )pfwglGetProcAddress( "glVertexWeightfvEXT" ))) return 0;
  336. if( ! (pfglVertexWeightPointerEXT = ( void * )pfwglGetProcAddress( "glVertexWeightPointerEXT" ))) return 0;
  337. Com_Printf( "...enabling GL_EXT_vertex_weighting\n" );
  338. return 1;
  339. }
  340. PRIVATE W8 CheckEXTTextureFilterAnisotropic( const char *glext )
  341. {
  342. if( strstr( glext, "GL_EXT_texture_filter_anisotropic" ) == NULL )
  343. {
  344. Com_Printf( "...GL_EXT_texture_filter_anisotropic not found\n" );
  345. return 0;
  346. }
  347. Com_Printf( "...enabling GL_EXT_texture_filter_anisotropic\n" );
  348. return 1;
  349. }
  350. ////////////////////////////////////////////////////////////
  351. //////////////////////////////
  352. //
  353. // Nvidia Functions
  354. //
  355. //////////////////////////////
  356. PRIVATE W8 ConfigNVVertexArrayRange( const char *glext )
  357. {
  358. // Test if VAR is present.
  359. if( strstr( glext, "GL_NV_vertex_array_range" ) == NULL )
  360. {
  361. return 0;
  362. }
  363. // Test if Fence
  364. if( strstr( glext, "GL_NV_fence" ) == NULL )
  365. {
  366. return 0;
  367. }
  368. // Setup Vertex Array Range
  369. if( ! (pfglFlushVertexArrayRangeNV = ( void * )pfwglGetProcAddress("glFlushVertexArrayRangeNV")))return 0;
  370. if( ! (pfglVertexArrayRangeNV = ( void * )pfwglGetProcAddress("glVertexArrayRangeNV")))return 0;
  371. #ifdef _WIN32
  372. if( ! (pfwglAllocateMemoryNV = ( void * )pfwglGetProcAddress("wglAllocateMemoryNV"))) return 0;
  373. if( ! (pfwglFreeMemoryNV = ( void * )pfwglGetProcAddress("wglFreeMemoryNV"))) return 0;
  374. #elif __unix__
  375. if( ! (pfwglAllocateMemoryNV = ( void * )pfwglGetProcAddress( "glXAllocateMemoryNV" ))) return 0;
  376. if( ! (pfwglFreeMemoryNV = ( void * )pfwglGetProcAddress( "glXFreeMemoryNV" ))) return 0;
  377. #else
  378. #error "Please define OS interface to GL_NV_vertex_array_range"
  379. #endif
  380. // Setup fence
  381. if( ! (pfglDeleteFencesNV = ( void * )pfwglGetProcAddress( "glDeleteFencesNV" ))) return 0;
  382. if( ! (pfglGenFencesNV = ( void * )pfwglGetProcAddress( "glGenFencesNV" ))) return 0;
  383. if( ! (pfglIsFenceNV = ( void * )pfwglGetProcAddress( "glIsFenceNV" ))) return 0;
  384. if( ! (pfglTestFenceNV = ( void * )pfwglGetProcAddress( "glTestFenceNV" ))) return 0;
  385. if( ! (pfglGetFenceivNV = ( void * )pfwglGetProcAddress( "glGetFenceivNV" ))) return 0;
  386. if( ! (pfglFinishFenceNV = ( void * )pfwglGetProcAddress( "glFinishFenceNV" ))) return 0;
  387. if( ! (pfglSetFenceNV = ( void * )pfwglGetProcAddress( "glSetFenceNV" ))) return 0;
  388. Com_Printf( "...enabling GL_NV_vertex_array_range & GL_NV_fence\n" );
  389. return 1;
  390. }
  391. PRIVATE W8 CheckNVVertexArrayRange2( const char *glext )
  392. {
  393. if( strstr( glext, "GL_NV_vertex_array_range2" ) == NULL )
  394. {
  395. Com_Printf( "...GL_NV_vertex_array_range2 not found\n" );
  396. return 0;
  397. }
  398. Com_Printf( "...enabling GL_NV_vertex_array_range2\n" );
  399. return 1;
  400. }
  401. PRIVATE W8 CheckNVTextureEnvCombine4( const char *glext )
  402. {
  403. if( strstr( glext, "GL_NV_texture_env_combine4") == NULL )
  404. {
  405. Com_Printf( "...GL_NV_texture_env_combine4 not found\n" );
  406. return 0;
  407. }
  408. Com_Printf( "...enabling GL_NV_texture_env_combine4\n" );
  409. return 1;
  410. }
  411. PRIVATE W8 ConfigNVVertexProgram( const char *glext )
  412. {
  413. if( strstr( glext, "GL_NV_vertex_program" ) == NULL )
  414. return 0;
  415. if( ! (pfglAreProgramsResidentNV = ( void * )pfwglGetProcAddress("glAreProgramsResidentNV"))) return 0;
  416. if( ! (pfglBindProgramNV = ( void * )pfwglGetProcAddress("glBindProgramNV"))) return 0;
  417. if( ! (pfglDeleteProgramsNV = ( void * )pfwglGetProcAddress("glDeleteProgramsNV"))) return 0;
  418. if( ! (pfglExecuteProgramNV = ( void * )pfwglGetProcAddress("glExecuteProgramNV"))) return 0;
  419. if( ! (pfglGenProgramsNV = ( void * )pfwglGetProcAddress("glGenProgramsNV"))) return 0;
  420. if( ! (pfglGetProgramParameterdvNV = ( void * )pfwglGetProcAddress("glGetProgramParameterdvNV"))) return 0;
  421. if( ! (pfglGetProgramParameterfvNV = ( void * )pfwglGetProcAddress("glGetProgramParameterfvNV"))) return 0;
  422. if( ! (pfglGetProgramivNV = ( void * )pfwglGetProcAddress("glGetProgramivNV"))) return 0;
  423. if( ! (pfglGetProgramStringNV = ( void * )pfwglGetProcAddress("glGetProgramStringNV"))) return 0;
  424. if( ! (pfglGetTrackMatrixivNV = ( void * )pfwglGetProcAddress("glGetTrackMatrixivNV"))) return 0;
  425. if( ! (pfglGetVertexAttribdvNV = ( void * )pfwglGetProcAddress("glGetVertexAttribdvNV"))) return 0;
  426. if( ! (pfglGetVertexAttribfvNV = ( void * )pfwglGetProcAddress("glGetVertexAttribfvNV"))) return 0;
  427. if( ! (pfglGetVertexAttribivNV = ( void * )pfwglGetProcAddress("glGetVertexAttribivNV"))) return 0;
  428. if( ! (pfglGetVertexAttribPointervNV = ( void * )pfwglGetProcAddress("glGetVertexAttribPointervNV"))) return 0;
  429. if( ! (pfglIsProgramNV = ( void * )pfwglGetProcAddress("glIsProgramNV"))) return 0;
  430. if( ! (pfglLoadProgramNV = ( void * )pfwglGetProcAddress("glLoadProgramNV"))) return 0;
  431. if( ! (pfglProgramParameter4dNV = ( void * )pfwglGetProcAddress("glProgramParameter4dNV"))) return 0;
  432. if( ! (pfglProgramParameter4dvNV = ( void * )pfwglGetProcAddress("glProgramParameter4dvNV"))) return 0;
  433. if( ! (pfglProgramParameter4fNV = ( void * )pfwglGetProcAddress("glProgramParameter4fNV"))) return 0;
  434. if( ! (pfglProgramParameter4fvNV = ( void * )pfwglGetProcAddress("glProgramParameter4fvNV"))) return 0;
  435. if( ! (pfglProgramParameters4dvNV = ( void * )pfwglGetProcAddress("glProgramParameters4dvNV"))) return 0;
  436. if( ! (pfglProgramParameters4fvNV = ( void * )pfwglGetProcAddress("glProgramParameters4fvNV"))) return 0;
  437. if( ! (pfglRequestResidentProgramsNV = ( void * )pfwglGetProcAddress("glRequestResidentProgramsNV"))) return 0;
  438. if( ! (pfglTrackMatrixNV = ( void * )pfwglGetProcAddress("glTrackMatrixNV"))) return 0;
  439. if( ! (pfglVertexAttribPointerNV = ( void * )pfwglGetProcAddress("glVertexAttribPointerNV"))) return 0;
  440. if( ! (pfglVertexAttrib1dNV = ( void * )pfwglGetProcAddress("glVertexAttrib1dNV"))) return 0;
  441. if( ! (pfglVertexAttrib1dvNV = ( void * )pfwglGetProcAddress("glVertexAttrib1dvNV"))) return 0;
  442. if( ! (pfglVertexAttrib1fNV = ( void * )pfwglGetProcAddress("glVertexAttrib1fNV"))) return 0;
  443. if( ! (pfglVertexAttrib1fvNV = ( void * )pfwglGetProcAddress("glVertexAttrib1fvNV"))) return 0;
  444. if( ! (pfglVertexAttrib1sNV = ( void * )pfwglGetProcAddress("glVertexAttrib1sNV"))) return 0;
  445. if( ! (pfglVertexAttrib1svNV = ( void * )pfwglGetProcAddress("glVertexAttrib1svNV"))) return 0;
  446. if( ! (pfglVertexAttrib2dNV = ( void * )pfwglGetProcAddress("glVertexAttrib2dNV"))) return 0;
  447. if( ! (pfglVertexAttrib2dvNV = ( void * )pfwglGetProcAddress("glVertexAttrib2dvNV"))) return 0;
  448. if( ! (pfglVertexAttrib2fNV = ( void * )pfwglGetProcAddress("glVertexAttrib2fNV"))) return 0;
  449. if( ! (pfglVertexAttrib2fvNV = ( void * )pfwglGetProcAddress("glVertexAttrib2fvNV"))) return 0;
  450. if( ! (pfglVertexAttrib2sNV = ( void * )pfwglGetProcAddress("glVertexAttrib2sNV"))) return 0;
  451. if( ! (pfglVertexAttrib2svNV = ( void * )pfwglGetProcAddress("glVertexAttrib2svNV"))) return 0;
  452. if( ! (pfglVertexAttrib3dNV = ( void * )pfwglGetProcAddress("glVertexAttrib3dNV"))) return 0;
  453. if( ! (pfglVertexAttrib3dvNV = ( void * )pfwglGetProcAddress("glVertexAttrib3dvNV"))) return 0;
  454. if( ! (pfglVertexAttrib3fNV = ( void * )pfwglGetProcAddress("glVertexAttrib3fNV"))) return 0;
  455. if( ! (pfglVertexAttrib3fvNV = ( void * )pfwglGetProcAddress("glVertexAttrib3fvNV"))) return 0;
  456. if( ! (pfglVertexAttrib3sNV = ( void * )pfwglGetProcAddress("glVertexAttrib3sNV"))) return 0;
  457. if( ! (pfglVertexAttrib3svNV = ( void * )pfwglGetProcAddress("glVertexAttrib3svNV"))) return 0;
  458. if( ! (pfglVertexAttrib4dNV = ( void * )pfwglGetProcAddress("glVertexAttrib4dNV"))) return 0;
  459. if( ! (pfglVertexAttrib4dvNV = ( void * )pfwglGetProcAddress("glVertexAttrib4dvNV"))) return 0;
  460. if( ! (pfglVertexAttrib4fNV = ( void * )pfwglGetProcAddress("glVertexAttrib4fNV"))) return 0;
  461. if( ! (pfglVertexAttrib4fvNV = ( void * )pfwglGetProcAddress("glVertexAttrib4fvNV"))) return 0;
  462. if( ! (pfglVertexAttrib4sNV = ( void * )pfwglGetProcAddress("glVertexAttrib4sNV"))) return 0;
  463. if( ! (pfglVertexAttrib4svNV = ( void * )pfwglGetProcAddress("glVertexAttrib4svNV"))) return 0;
  464. if( ! (pfglVertexAttrib4ubvNV = ( void * )pfwglGetProcAddress("glVertexAttrib4ubvNV"))) return 0;
  465. if( ! (pfglVertexAttribs1dvNV = ( void * )pfwglGetProcAddress("glVertexAttribs1dvNV"))) return 0;
  466. if( ! (pfglVertexAttribs1fvNV = ( void * )pfwglGetProcAddress("glVertexAttribs1fvNV"))) return 0;
  467. if( ! (pfglVertexAttribs1svNV = ( void * )pfwglGetProcAddress("glVertexAttribs1svNV"))) return 0;
  468. if( ! (pfglVertexAttribs2dvNV = ( void * )pfwglGetProcAddress("glVertexAttribs2dvNV"))) return 0;
  469. if( ! (pfglVertexAttribs2fvNV = ( void * )pfwglGetProcAddress("glVertexAttribs2fvNV"))) return 0;
  470. if( ! (pfglVertexAttribs2svNV = ( void * )pfwglGetProcAddress("glVertexAttribs2svNV"))) return 0;
  471. if( ! (pfglVertexAttribs3dvNV = ( void * )pfwglGetProcAddress("glVertexAttribs3dvNV"))) return 0;
  472. if( ! (pfglVertexAttribs3fvNV = ( void * )pfwglGetProcAddress("glVertexAttribs3fvNV"))) return 0;
  473. if( ! (pfglVertexAttribs3svNV = ( void * )pfwglGetProcAddress("glVertexAttribs3svNV"))) return 0;
  474. if( ! (pfglVertexAttribs4dvNV = ( void * )pfwglGetProcAddress("glVertexAttribs4dvNV"))) return 0;
  475. if( ! (pfglVertexAttribs4fvNV = ( void * )pfwglGetProcAddress("glVertexAttribs4fvNV"))) return 0;
  476. if( ! (pfglVertexAttribs4svNV = ( void * )pfwglGetProcAddress("glVertexAttribs4svNV"))) return 0;
  477. if( ! (pfglVertexAttribs4ubvNV = ( void * )pfwglGetProcAddress("glVertexAttribs4ubvNV"))) return 0;
  478. Com_Printf( "...enabling GL_NV_vertex_program\n" );
  479. return 1;
  480. }
  481. PRIVATE W8 CheckNVTextureShader( const char *glext )
  482. {
  483. if( strstr( glext, "GL_NV_texture_shader" ) == NULL )
  484. {
  485. return 0;
  486. }
  487. Com_Printf( "...enabling GL_NV_texture_shader\n" );
  488. return 1;
  489. }
  490. ////////////////////////////////////////////////////////////
  491. //////////////////////////////
  492. //
  493. // ATI Functions
  494. //
  495. //////////////////////////////
  496. PRIVATE W8 ConfigATIVertexArrayObject( const char *glext )
  497. {
  498. if( strstr( glext, "GL_ATI_vertex_array_object" ) == NULL )
  499. {
  500. return 0;
  501. }
  502. if( ! (pfglBlendColorEXT = ( void * )pfwglGetProcAddress("glBlendColorEXT"))) return 0;
  503. if( ! (pfglNewObjectBufferATI = ( void * )pfwglGetProcAddress("glNewObjectBufferATI"))) return 0;
  504. if( ! (pfglIsObjectBufferATI = ( void * )pfwglGetProcAddress("glIsObjectBufferATI"))) return 0;
  505. if( ! (pfglUpdateObjectBufferATI = ( void * )pfwglGetProcAddress("glUpdateObjectBufferATI"))) return 0;
  506. if( ! (pfglGetObjectBufferfvATI = ( void * )pfwglGetProcAddress("glGetObjectBufferfvATI"))) return 0;
  507. if( ! (pfglGetObjectBufferivATI = ( void * )pfwglGetProcAddress("glGetObjectBufferivATI"))) return 0;
  508. if( ! (pfglFreeObjectBufferATI = ( void * )pfwglGetProcAddress("glFreeObjectBufferATI"))) return 0;
  509. if( ! (pfglArrayObjectATI = ( void * )pfwglGetProcAddress("glArrayObjectATI"))) return 0;
  510. if( ! (pfglGetArrayObjectfvATI = ( void * )pfwglGetProcAddress("glGetArrayObjectfvATI"))) return 0;
  511. if( ! (pfglGetArrayObjectivATI = ( void * )pfwglGetProcAddress("glGetArrayObjectivATI"))) return 0;
  512. if( ! (pfglVariantArrayObjectATI = ( void * )pfwglGetProcAddress("glVariantArrayObjectATI"))) return 0;
  513. if( ! (pfglGetVariantArrayObjectfvATI = ( void * )pfwglGetProcAddress("glGetVariantArrayObjectfvATI"))) return 0;
  514. if( ! (pfglGetVariantArrayObjectivATI = ( void * )pfwglGetProcAddress("glGetVariantArrayObjectivATI"))) return 0;
  515. Com_Printf( "...enabling GL_ATI_vertex_array_object\n" );
  516. return 1;
  517. }
  518. PRIVATE W8 ConfigATIMapObjectBuffer( const char *glext )
  519. {
  520. if( strstr( glext, "GL_ATI_map_object_buffer" ) == NULL )
  521. {
  522. return 0;
  523. }
  524. if( ! (pfglMapObjectBufferATI = ( void * )pfwglGetProcAddress("glMapObjectBufferATI"))) return 0;
  525. if( ! (pfglUnmapObjectBufferATI = ( void * )pfwglGetProcAddress("glUnmapObjectBufferATI"))) return 0;
  526. Com_Printf( "...enabling GL_ATI_map_object_buffer\n" );
  527. return 1;
  528. }
  529. PRIVATE W8 ConfigATIFragmentShader( const char *glext )
  530. {
  531. if( strstr( glext, "GL_ATI_fragment_shader" ) == NULL )
  532. {
  533. return 0;
  534. }
  535. if( ! (pfglGenFragmentShadersATI = ( void * )pfwglGetProcAddress("glGenFragmentShadersATI"))) return 0;
  536. if( ! (pfglBindFragmentShaderATI = ( void * )pfwglGetProcAddress("glBindFragmentShaderATI"))) return 0;
  537. if( ! (pfglDeleteFragmentShaderATI = ( void * )pfwglGetProcAddress("glDeleteFragmentShaderATI"))) return 0;
  538. if( ! (pfglBeginFragmentShaderATI = ( void * )pfwglGetProcAddress("glBeginFragmentShaderATI"))) return 0;
  539. if( ! (pfglEndFragmentShaderATI = ( void * )pfwglGetProcAddress("glEndFragmentShaderATI"))) return 0;
  540. if( ! (pfglPassTexCoordATI = ( void * )pfwglGetProcAddress("glPassTexCoordATI"))) return 0;
  541. if( ! (pfglSampleMapATI = ( void * )pfwglGetProcAddress("glSampleMapATI"))) return 0;
  542. if( ! (pfglColorFragmentOp1ATI = ( void * )pfwglGetProcAddress("glColorFragmentOp1ATI"))) return 0;
  543. if( ! (pfglColorFragmentOp2ATI = ( void * )pfwglGetProcAddress("glColorFragmentOp2ATI"))) return 0;
  544. if( ! (pfglColorFragmentOp3ATI = ( void * )pfwglGetProcAddress("glColorFragmentOp3ATI"))) return 0;
  545. if( ! (pfglAlphaFragmentOp1ATI = ( void * )pfwglGetProcAddress("glAlphaFragmentOp1ATI"))) return 0;
  546. if( ! (pfglAlphaFragmentOp2ATI = ( void * )pfwglGetProcAddress("glAlphaFragmentOp2ATI"))) return 0;
  547. if( ! (pfglAlphaFragmentOp3ATI = ( void * )pfwglGetProcAddress("glAlphaFragmentOp3ATI"))) return 0;
  548. if( ! (pfglSetFragmentShaderConstantATI = ( void * )pfwglGetProcAddress("glSetFragmentShaderConstantATI"))) return 0;
  549. Com_Printf( "...enabling GL_ATI_fragment_shader\n" );
  550. return 1;
  551. }
  552. PRIVATE W8 CheckATITextureEnvCombine3( const char *glext )
  553. {
  554. if( strstr( glext, "GL_ATI_texture_env_combine3" ) == NULL )
  555. {
  556. return 0;
  557. }
  558. Com_Printf( "...enabling GL_ATI_texture_env_combine3\n" );
  559. return 1;
  560. }
  561. PRIVATE W8 CheckATIXTextureEnvRoute(const char *glext)
  562. {
  563. if( strstr( glext, "GL_ATIX_texture_env_route" ) == NULL )
  564. {
  565. return 0;
  566. }
  567. Com_Printf( "...enabling GL_ATIX_texture_env_route\n" );
  568. return 1;
  569. }
  570. PRIVATE W8 ConfigATIEnvMapBumpMap( const char *glext )
  571. {
  572. if( strstr( glext, "GL_ATI_envmap_bumpmap" ) == NULL )
  573. {
  574. return 0;
  575. }
  576. if( ! (pfglTexBumpParameterivATI = ( void * ) pfwglGetProcAddress("glTexBumpParameterivATI"))) return 0;
  577. if( ! (pfglTexBumpParameterfvATI = ( void * ) pfwglGetProcAddress("glTexBumpParameterfvATI"))) return 0;
  578. if( ! (pfglGetTexBumpParameterivATI = ( void * ) pfwglGetProcAddress("glGetTexBumpParameterivATI"))) return 0;
  579. if( ! (pfglGetTexBumpParameterfvATI = ( void * ) pfwglGetProcAddress("glGetTexBumpParameterfvATI"))) return 0;
  580. Com_Printf( "...enabling GL_ATI_envmap_bumpmap\n" );
  581. return 1;
  582. }
  583. /*
  584. PRIVATE W8 ConfigARBFragmentProgram( const char *glext )
  585. {
  586. if( strstr( glext, "GL_ARB_fragment_program" ) == NULL )
  587. {
  588. return 0;
  589. }
  590. if( ! (pfglProgramStringARB = ( void * )pfwglGetProcAddress("glProgramStringARB"))) return 0;
  591. if( ! (pfglBindProgramARB = ( void * )pfwglGetProcAddress("glBindProgramARB"))) return 0;
  592. if( ! (pfglDeleteProgramsARB = ( void * )pfwglGetProcAddress("glDeleteProgramsARB"))) return 0;
  593. if( ! (pfglGenProgramsARB = ( void * )pfwglGetProcAddress("glGenProgramsARB"))) return 0;
  594. if( ! (pfglProgramEnvParameter4dARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4dARB"))) return 0;
  595. if( ! (pfglProgramEnvParameter4dvARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4dvARB"))) return 0;
  596. if( ! (pfglProgramEnvParameter4fARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4fARB"))) return 0;
  597. if( ! (pfglProgramEnvParameter4fvARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4fvARB"))) return 0;
  598. if( ! (pfglGetProgramLocalParameter4dARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4dARB"))) return 0;
  599. if( ! (pfglGetProgramLocalParameter4dvARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4dvARB"))) return 0;
  600. if( ! (pfglGetProgramLocalParameter4fARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4fARB"))) return 0;
  601. if( ! (pfglGetProgramLocalParameter4fvARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4fvARB"))) return 0;
  602. if( ! (pfglGetProgramEnvParameterdvARB = ( void * )pfwglGetProcAddress("glGetProgramEnvParameterdvARB"))) return 0;
  603. if( ! (pfglGetProgramEnvParameterfvARB = ( void * )pfwglGetProcAddress("glGetProgramEnvParameterfvARB"))) return 0;
  604. if( ! (pfglGetProgramLocalParameterdvARB = ( void * )pfwglGetProcAddress("glGetProgramLocalParameterdvARB"))) return 0;
  605. if( ! (pfglGetProgramLocalParameterfvARB = ( void * )pfwglGetProcAddress("glGetProgramLocalParameterfvARB"))) return 0;
  606. if( ! (pfglGetProgramivARB = ( void * )pfwglGetProcAddress("glGetProgramivARB"))) return 0;
  607. if( ! (pfglGetProgramStringARB = ( void * )pfwglGetProcAddress("glGetProgramStringARB"))) return 0;
  608. if( ! (pfglIsProgramARB = ( void * )pfwglGetProcAddress("glIsProgramARB"))) return 0;
  609. return 1;
  610. }
  611. PRIVATE W8 ConfigARBVertexBufferObject( const char *glext )
  612. {
  613. if( strstr( glext, "GL_ARB_vertex_buffer_object" ) == NULL )
  614. return 0;
  615. if( ! (pfglBindBufferARB = ( void * )pfwglGetProcAddress("glBindBufferARB"))) return 0;
  616. if( ! (pfglDeleteBuffersARB = ( void * )pfwglGetProcAddress("glDeleteBuffersARB"))) return 0;
  617. if( ! (pfglGenBuffersARB = ( void * )pfwglGetProcAddress("glGenBuffersARB"))) return 0;
  618. if( ! (pfglIsBufferARB = ( void * )pfwglGetProcAddress("glIsBufferARB"))) return 0;
  619. if( ! (pfglBufferDataARB = ( void * )pfwglGetProcAddress("glBufferDataARB"))) return 0;
  620. if( ! (pfglBufferSubDataARB = ( void * )pfwglGetProcAddress("glBufferSubDataARB"))) return 0;
  621. if( ! (pfglGetBufferSubDataARB = ( void * )pfwglGetProcAddress("glGetBufferSubDataARB"))) return 0;
  622. if( ! (pfglMapBufferARB = ( void * )pfwglGetProcAddress("glMapBufferARB"))) return 0;
  623. if( ! (pfglUnmapBufferARB = ( void * )pfwglGetProcAddress("glUnmapBufferARB"))) return 0;
  624. if( ! (pfglGetBufferParameterivARB = ( void * )pfwglGetProcAddress("glGetBufferParameterivARB"))) return 0;
  625. if( ! (pfglGetBufferPointervARB = ( void * )pfwglGetProcAddress("glGetBufferPointervARB"))) return 0;
  626. return 1;
  627. }*/
  628. #ifdef _WIN32
  629. PRIVATE W8 ConfigWGLARBPBuffer( const char *glext )
  630. {
  631. if( strstr( glext, "WGL_ARB_pbuffer" ) == NULL )
  632. {
  633. Com_Printf( "...WGL_ARB_pbuffer not found\n" );
  634. return 0;
  635. }
  636. if( ! (pfwglCreatePbufferARB = ( void * )pfwglGetProcAddress( "wglCreatePbufferARB" ))) return 0;
  637. if( ! (pfwglGetPbufferDCARB = ( void * )pfwglGetProcAddress( "wglGetPbufferDCARB" ))) return 0;
  638. if( ! (pfwglReleasePbufferDCARB = ( void * )pfwglGetProcAddress( "wglReleasePbufferDCARB" ))) return 0;
  639. if( ! (pfwglDestroyPbufferARB = ( void * )pfwglGetProcAddress( "wglDestroyPbufferARB" ))) return 0;
  640. if( ! (pfwglQueryPbufferARB = ( void * )pfwglGetProcAddress( "wglQueryPbufferARB" ))) return 0;
  641. Com_Printf( "...enabling WGL_ARB_pbuffer\n" );
  642. return 1;
  643. }
  644. PRIVATE W8 ConfigWGLARBPixelFormat ( const char *glext )
  645. {
  646. if( strstr( glext, "WGL_ARB_pixel_format" ) == NULL )
  647. {
  648. Com_Printf( "...WGL_ARB_pixel_format not found\n" );
  649. return 0;
  650. }
  651. if( ! (pfwglGetPixelFormatAttribivARB = ( void * )pfwglGetProcAddress( "wglGetPixelFormatAttribivARB" ))) return 0;
  652. if( ! (pfwglGetPixelFormatAttribfvARB = ( void * )pfwglGetProcAddress( "wglGetPixelFormatAttribfvARB" ))) return 0;
  653. if( ! (pfwglChoosePixelFormatARB = ( void * )pfwglGetProcAddress( "wglChoosePixelFormatARB" ))) return 0;
  654. Com_Printf( "...enabling WGL_ARB_pixel_format\n" );
  655. return 1;
  656. }
  657. PRIVATE W8 ConfigWGLEXTSwapControl( const char *glext )
  658. {
  659. if( strstr( glext, "WGL_EXT_swap_control" ) == NULL )
  660. {
  661. Com_Printf( "...WGL_EXT_swap_control not found\n" );
  662. return 0;
  663. }
  664. if( ! (pfwglSwapIntervalEXT = (WGLSWAPINTERVALEXT)pfwglGetProcAddress( "wglSwapIntervalEXT" ) ) ) return 0;
  665. if( ! (pfwglGetSwapIntervalEXT = (WGLGETSWAPINTERVALEXT)pfwglGetProcAddress( "wglGetSwapIntervalEXT" ) ) ) return 0;
  666. Com_Printf( "...enabling WGL_EXT_swap_control\n" );
  667. return 1;
  668. }
  669. #endif /* _WIN32 */
  670. /*
  671. -----------------------------------------------------------------------------
  672. Function: GL_ConfigExtensions -
  673. Parameters: glext -[in] Pointer to string containing the gl extension names.
  674. Returns: Nothing.
  675. Notes:
  676. -----------------------------------------------------------------------------
  677. */
  678. PUBLIC void GL_ConfigExtensions( const char *glext )
  679. {
  680. GLint ntext;
  681. memset( &gl_ext, 0, sizeof( GL_Extensions ) );
  682. gl_ext.ARBMultiTexture = ConfigARBMultiTexture( glext );
  683. if( gl_ext.ARBMultiTexture )
  684. {
  685. pfglGetIntegerv( GL_MAX_TEXTURE_UNITS_ARB, &ntext );
  686. // There could be more than MY_MAX_ARB_TEXTURESTAGES, but we only
  687. // require MY_MAX_ARB_TEXTURESTAGES texture stages so take min.
  688. gl_ext.nTextureStages = ( ntext < ( (GLint)MY_MAX_ARB_TEXTURESTAGES) ? ntext : MY_MAX_ARB_TEXTURESTAGES );
  689. }
  690. gl_ext.EXTTextureFilterAnisotropic = CheckEXTTextureFilterAnisotropic( glext );
  691. if( gl_ext.EXTTextureFilterAnisotropic )
  692. {
  693. pfglGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_ext.nMaxAnisotropy );
  694. if( gl_ext.nMaxAnisotropy < 2.0f )
  695. {
  696. gl_ext.nMaxAnisotropy = 0;
  697. }
  698. }
  699. gl_ext.EXTTextureEnvCombine = CheckEXTTextureEnvCombine( glext );
  700. gl_ext.ARBTextureCompression = ConfigARBTextureCompression( glext );
  701. gl_ext.EXTTextureCompressionS3TC = (gl_ext.ARBTextureCompression && CheckEXTTextureCompressionS3TC( glext ) );
  702. gl_ext.ARBTextureCubeMap = CheckARBTextureCubeMap( glext );
  703. gl_ext.EXTSecondaryColor = ConfigEXTSecondaryColor( glext );
  704. gl_ext.EXTBlendColor = ConfigEXTBlendColor( glext );
  705. // nVidia extensions
  706. // -----------------
  707. gl_ext.NVVertexArrayRange = ConfigNVVertexArrayRange( glext );
  708. if( gl_ext.NVVertexArrayRange )
  709. {
  710. GLint nverts;
  711. pfglGetIntegerv( (GLenum)GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV, &nverts );
  712. gl_ext.NVVertexArrayRangeMaxVertex = nverts;
  713. }
  714. gl_ext.EXTVertexWeighting = ConfigEXTVertexWeighting( glext );
  715. gl_ext.NVVertexArrayRange2 = CheckNVVertexArrayRange2( glext );
  716. if( gl_ext.NVVertexArrayRange2 )
  717. {
  718. // VBHard swap without flush of the VAR.
  719. gl_ext.NVStateVARWithoutFlush = GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV;
  720. }
  721. else
  722. {
  723. // VBHard with unusefull flush of the VAR.
  724. gl_ext.NVStateVARWithoutFlush = GL_VERTEX_ARRAY_RANGE_NV;
  725. }
  726. gl_ext.NVTextureEnvCombine4 = CheckNVTextureEnvCombine4( glext );
  727. if( ! gl_ext.DisableHardwareVertexProgram )
  728. {
  729. gl_ext.NVVertexProgram = ConfigNVVertexProgram( glext );
  730. gl_ext.EXTVertexShader = ConfigEXTVertexShader( glext );
  731. gl_ext.ARBVertexProgram= ConfigARBVertexProgram( glext );
  732. }
  733. else
  734. {
  735. gl_ext.NVVertexProgram = false;
  736. gl_ext.EXTVertexShader = false;
  737. gl_ext.ARBVertexProgram = false;
  738. }
  739. gl_ext.NVTextureShader = CheckNVTextureShader( glext );
  740. if( gl_ext.NVVertexProgram && ! gl_ext.NVTextureShader )
  741. {
  742. // if GL_NV_texture_shader is not here,
  743. // then we are not on a GeForce3.
  744. gl_ext.NVVertexProgramEmulated = true;
  745. }
  746. // ATI extensions
  747. // --------------
  748. gl_ext.ATIVertexArrayObject = ConfigATIVertexArrayObject( glext );
  749. gl_ext.ATIMapObjectBuffer = ConfigATIMapObjectBuffer( glext );
  750. gl_ext.ATITextureEnvCombine3 = CheckATITextureEnvCombine3( glext );
  751. gl_ext.ATIXTextureEnvRoute = CheckATIXTextureEnvRoute( glext );
  752. gl_ext.ATIEnvMapBumpMap = ConfigATIEnvMapBumpMap( glext );
  753. // gl_ext.ATIFragmentShader = setupATIFragmentShader( glext );
  754. #ifdef _WIN32
  755. ConfigWGLARBPBuffer( glext );
  756. ConfigWGLARBPixelFormat( glext );
  757. ConfigWGLEXTSwapControl( glext );
  758. #endif
  759. }