]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/COpenGLExtensionHandler.cpp
1616264042e09b13d5fefd81c9f8465635a8c40c
[irrlicht.git] / source / Irrlicht / COpenGLExtensionHandler.cpp
1 // Copyright (C) 2002-2012 Nikolaus Gebhardt\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h\r
4 \r
5 #include "COpenGLExtensionHandler.h"\r
6 \r
7 #ifdef _IRR_COMPILE_WITH_OPENGL_\r
8 \r
9 #include "irrString.h"\r
10 #include "SMaterial.h"\r
11 #include "fast_atof.h"\r
12 \r
13 namespace irr\r
14 {\r
15 namespace video\r
16 {\r
17 \r
18 bool COpenGLExtensionHandler::needsDSAFramebufferHack = true;\r
19 \r
20 COpenGLExtensionHandler::COpenGLExtensionHandler() :\r
21                 StencilBuffer(false), TextureCompressionExtension(false), MaxLights(1),\r
22                 MaxAnisotropy(1), MaxUserClipPlanes(0), MaxAuxBuffers(0), MaxIndices(65535),\r
23                 MaxTextureSize(1), MaxGeometryVerticesOut(0),\r
24                 MaxTextureLODBias(0.f), Version(0), ShaderLanguageVersion(0),\r
25                 OcclusionQuerySupport(false)\r
26 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
27         ,pGlActiveTexture(0)\r
28         ,pGlActiveTextureARB(0), pGlClientActiveTextureARB(0),\r
29         pGlGenProgramsARB(0), pGlGenProgramsNV(0),\r
30         pGlBindProgramARB(0), pGlBindProgramNV(0),\r
31         pGlDeleteProgramsARB(0), pGlDeleteProgramsNV(0),\r
32         pGlProgramStringARB(0), pGlLoadProgramNV(0),\r
33         pGlProgramLocalParameter4fvARB(0),\r
34         pGlCreateShaderObjectARB(0), pGlShaderSourceARB(0),\r
35         pGlCompileShaderARB(0), pGlCreateProgramObjectARB(0), pGlAttachObjectARB(0),\r
36         pGlLinkProgramARB(0), pGlUseProgramObjectARB(0), pGlDeleteObjectARB(0),\r
37         pGlCreateProgram(0), pGlUseProgram(0),\r
38         pGlDeleteProgram(0), pGlDeleteShader(0),\r
39         pGlGetAttachedObjectsARB(0), pGlGetAttachedShaders(0),\r
40         pGlCreateShader(0), pGlShaderSource(0), pGlCompileShader(0),\r
41         pGlAttachShader(0), pGlLinkProgram(0),\r
42         pGlGetInfoLogARB(0), pGlGetShaderInfoLog(0), pGlGetProgramInfoLog(0),\r
43         pGlGetObjectParameterivARB(0), pGlGetShaderiv(0), pGlGetProgramiv(0),\r
44         pGlGetUniformLocationARB(0), pGlGetUniformLocation(0),\r
45         pGlUniform1fvARB(0), pGlUniform2fvARB(0), pGlUniform3fvARB(0), pGlUniform4fvARB(0),\r
46         pGlUniform1ivARB(0), pGlUniform2ivARB(0), pGlUniform3ivARB(0), pGlUniform4ivARB(0),\r
47         pGlUniformMatrix2fvARB(0), pGlUniformMatrix3fvARB(0), pGlUniformMatrix4fvARB(0),\r
48         pGlGetActiveUniformARB(0), pGlGetActiveUniform(0),\r
49         pGlPointParameterfARB(0), pGlPointParameterfvARB(0),\r
50         pGlStencilFuncSeparate(0), pGlStencilOpSeparate(0),\r
51         pGlStencilFuncSeparateATI(0), pGlStencilOpSeparateATI(0),\r
52         pGlCompressedTexImage2D(0), pGlCompressedTexSubImage2D(0),\r
53         // ARB framebuffer object\r
54         pGlBindFramebuffer(0), pGlDeleteFramebuffers(0), pGlGenFramebuffers(0),\r
55         pGlCheckFramebufferStatus(0), pGlFramebufferTexture2D(0),\r
56         pGlBindRenderbuffer(0), pGlDeleteRenderbuffers(0), pGlGenRenderbuffers(0),\r
57         pGlRenderbufferStorage(0), pGlFramebufferRenderbuffer(0), pGlGenerateMipmap(0),\r
58         // EXT framebuffer object\r
59         pGlBindFramebufferEXT(0), pGlDeleteFramebuffersEXT(0), pGlGenFramebuffersEXT(0),\r
60         pGlCheckFramebufferStatusEXT(0), pGlFramebufferTexture2DEXT(0),\r
61         pGlBindRenderbufferEXT(0), pGlDeleteRenderbuffersEXT(0), pGlGenRenderbuffersEXT(0),\r
62         pGlRenderbufferStorageEXT(0), pGlFramebufferRenderbufferEXT(0), pGlGenerateMipmapEXT(0),\r
63         pGlActiveStencilFaceEXT(0),\r
64         // MRTs\r
65         pGlDrawBuffersARB(0), pGlDrawBuffersATI(0),\r
66         pGlGenBuffersARB(0), pGlBindBufferARB(0), pGlBufferDataARB(0), pGlDeleteBuffersARB(0),\r
67         pGlBufferSubDataARB(0), pGlGetBufferSubDataARB(0), pGlMapBufferARB(0), pGlUnmapBufferARB(0),\r
68         pGlIsBufferARB(0), pGlGetBufferParameterivARB(0), pGlGetBufferPointervARB(0),\r
69         pGlProvokingVertexARB(0), pGlProvokingVertexEXT(0),\r
70         pGlProgramParameteriARB(0), pGlProgramParameteriEXT(0),\r
71         pGlGenQueriesARB(0), pGlDeleteQueriesARB(0), pGlIsQueryARB(0),\r
72         pGlBeginQueryARB(0), pGlEndQueryARB(0), pGlGetQueryivARB(0),\r
73         pGlGetQueryObjectivARB(0), pGlGetQueryObjectuivARB(0),\r
74         pGlGenOcclusionQueriesNV(0), pGlDeleteOcclusionQueriesNV(0),\r
75         pGlIsOcclusionQueryNV(0), pGlBeginOcclusionQueryNV(0),\r
76         pGlEndOcclusionQueryNV(0), pGlGetOcclusionQueryivNV(0),\r
77         pGlGetOcclusionQueryuivNV(0),\r
78         // Blend\r
79         pGlBlendFuncSeparateEXT(0), pGlBlendFuncSeparate(0),\r
80         pGlBlendEquationEXT(0), pGlBlendEquation(0), pGlBlendEquationSeparateEXT(0), pGlBlendEquationSeparate(0),\r
81         // Indexed\r
82         pGlEnableIndexedEXT(0), pGlDisableIndexedEXT(0),\r
83         pGlColorMaskIndexedEXT(0),\r
84         pGlBlendFuncIndexedAMD(0), pGlBlendFunciARB(0), pGlBlendFuncSeparateIndexedAMD(0), pGlBlendFuncSeparateiARB(0),\r
85         pGlBlendEquationIndexedAMD(0), pGlBlendEquationiARB(0), pGlBlendEquationSeparateIndexedAMD(0), pGlBlendEquationSeparateiARB(0),\r
86         // DSA\r
87     pGlTextureStorage2D(0), pGlTextureStorage3D(0), pGlTextureSubImage2D(0), pGlNamedFramebufferTexture(0),\r
88     pGlTextureParameteri(0), pGlCreateTextures(0), pGlCreateFramebuffers(0), pGlBindTextures(0), pGlGenerateTextureMipmap(0),\r
89     // DSA with EXT or functions to simulate it\r
90     pGlTextureSubImage2DEXT(0), pGlTextureStorage2DEXT(0), pGlTexStorage2D(0), pGlTextureStorage3DEXT(0),\r
91     pGlTexStorage3D(0), pGlNamedFramebufferTextureEXT(0), pGlFramebufferTexture(0), pGlGenerateTextureMipmapEXT(0)\r
92 #if defined(GLX_SGI_swap_control)\r
93         ,pGlxSwapIntervalSGI(0)\r
94 #endif\r
95 #if defined(GLX_EXT_swap_control)\r
96         ,pGlxSwapIntervalEXT(0)\r
97 #endif\r
98 #if defined(WGL_EXT_swap_control)\r
99         ,pWglSwapIntervalEXT(0)\r
100 #endif\r
101 #if defined(GLX_MESA_swap_control)\r
102         ,pGlxSwapIntervalMESA(0)\r
103 #endif\r
104 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
105 {\r
106         for (u32 i=0; i<IRR_OpenGL_Feature_Count; ++i)\r
107                 FeatureAvailable[i]=false;\r
108         DimAliasedLine[0]=1.f;\r
109         DimAliasedLine[1]=1.f;\r
110         DimAliasedPoint[0]=1.f;\r
111         DimAliasedPoint[1]=1.f;\r
112         DimSmoothedLine[0]=1.f;\r
113         DimSmoothedLine[1]=1.f;\r
114         DimSmoothedPoint[0]=1.f;\r
115         DimSmoothedPoint[1]=1.f;\r
116 }\r
117 \r
118 \r
119 void COpenGLExtensionHandler::dump(ELOG_LEVEL logLevel) const\r
120 {\r
121         for (u32 i=0; i<IRR_OpenGL_Feature_Count; ++i)\r
122                 os::Printer::log(OpenGLFeatureStrings[i], FeatureAvailable[i]?" true":" false", logLevel);\r
123 }\r
124 \r
125 \r
126 void COpenGLExtensionHandler::dumpFramebufferFormats() const\r
127 {\r
128 #ifdef _IRR_WINDOWS_API_\r
129         HDC hdc=wglGetCurrentDC();\r
130         core::stringc wglExtensions;\r
131 #ifdef WGL_ARB_extensions_string\r
132         PFNWGLGETEXTENSIONSSTRINGARBPROC irrGetExtensionsString = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");\r
133         if (irrGetExtensionsString)\r
134                 wglExtensions = irrGetExtensionsString(hdc);\r
135 #elif defined(WGL_EXT_extensions_string)\r
136         PFNWGLGETEXTENSIONSSTRINGEXTPROC irrGetExtensionsString = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)wglGetProcAddress("wglGetExtensionsStringEXT");\r
137         if (irrGetExtensionsString)\r
138                 wglExtensions = irrGetExtensionsString(hdc);\r
139 #endif\r
140         const bool pixel_format_supported = (wglExtensions.find("WGL_ARB_pixel_format") != -1);\r
141         const bool multi_sample_supported = ((wglExtensions.find("WGL_ARB_multisample") != -1) ||\r
142                 (wglExtensions.find("WGL_EXT_multisample") != -1) || (wglExtensions.find("WGL_3DFX_multisample") != -1) );\r
143 #ifdef _DEBUG\r
144         os::Printer::log("WGL_extensions", wglExtensions);\r
145 #endif\r
146 \r
147 #ifdef WGL_ARB_pixel_format\r
148         PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormat_ARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB");\r
149         if (pixel_format_supported && wglChoosePixelFormat_ARB)\r
150         {\r
151                 // This value determines the number of samples used for antialiasing\r
152                 // My experience is that 8 does not show a big\r
153                 // improvement over 4, but 4 shows a big improvement\r
154                 // over 2.\r
155 \r
156                 PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribiv_ARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)wglGetProcAddress("wglGetPixelFormatAttribivARB");\r
157                 if (wglGetPixelFormatAttribiv_ARB)\r
158                 {\r
159                         int vals[128];\r
160                         int atts[] = {\r
161                                 WGL_NUMBER_PIXEL_FORMATS_ARB,\r
162                                 WGL_DRAW_TO_BITMAP_ARB,\r
163                                 WGL_ACCELERATION_ARB,\r
164                                 WGL_NEED_PALETTE_ARB,\r
165                                 WGL_NEED_SYSTEM_PALETTE_ARB,\r
166                                 WGL_SWAP_LAYER_BUFFERS_ARB,\r
167                                 WGL_SWAP_METHOD_ARB,\r
168                                 WGL_NUMBER_OVERLAYS_ARB,\r
169                                 WGL_NUMBER_UNDERLAYS_ARB,\r
170                                 WGL_TRANSPARENT_ARB,\r
171                                 WGL_TRANSPARENT_RED_VALUE_ARB,\r
172                                 WGL_TRANSPARENT_GREEN_VALUE_ARB,\r
173                                 WGL_TRANSPARENT_BLUE_VALUE_ARB,\r
174                                 WGL_TRANSPARENT_ALPHA_VALUE_ARB,\r
175                                 WGL_TRANSPARENT_INDEX_VALUE_ARB,\r
176                                 WGL_SHARE_DEPTH_ARB,\r
177                                 WGL_SHARE_STENCIL_ARB,\r
178                                 WGL_SHARE_ACCUM_ARB,\r
179                                 WGL_SUPPORT_GDI_ARB,\r
180                                 WGL_SUPPORT_OPENGL_ARB,\r
181                                 WGL_DOUBLE_BUFFER_ARB,\r
182                                 WGL_STEREO_ARB,\r
183                                 WGL_PIXEL_TYPE_ARB,\r
184                                 WGL_COLOR_BITS_ARB,\r
185                                 WGL_RED_BITS_ARB,\r
186                                 WGL_RED_SHIFT_ARB,\r
187                                 WGL_GREEN_BITS_ARB,\r
188                                 WGL_GREEN_SHIFT_ARB,\r
189                                 WGL_BLUE_BITS_ARB,\r
190                                 WGL_BLUE_SHIFT_ARB,\r
191                                 WGL_ALPHA_BITS_ARB,\r
192                                 WGL_ALPHA_SHIFT_ARB,\r
193                                 WGL_ACCUM_BITS_ARB,\r
194                                 WGL_ACCUM_RED_BITS_ARB,\r
195                                 WGL_ACCUM_GREEN_BITS_ARB,\r
196                                 WGL_ACCUM_BLUE_BITS_ARB,\r
197                                 WGL_ACCUM_ALPHA_BITS_ARB,\r
198                                 WGL_DEPTH_BITS_ARB,\r
199                                 WGL_STENCIL_BITS_ARB,\r
200                                 WGL_AUX_BUFFERS_ARB\r
201 #ifdef WGL_ARB_render_texture\r
202                                 ,WGL_BIND_TO_TEXTURE_RGB_ARB //40\r
203                                 ,WGL_BIND_TO_TEXTURE_RGBA_ARB\r
204 #endif\r
205 #ifdef WGL_ARB_pbuffer\r
206                                 ,WGL_DRAW_TO_PBUFFER_ARB //42\r
207                                 ,WGL_MAX_PBUFFER_PIXELS_ARB\r
208                                 ,WGL_MAX_PBUFFER_WIDTH_ARB\r
209                                 ,WGL_MAX_PBUFFER_HEIGHT_ARB\r
210 #endif\r
211 #ifdef WGL_ARB_framebuffer_sRGB\r
212                                 ,WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB //46\r
213 #endif\r
214 #ifdef WGL_ARB_multisample\r
215                                 ,WGL_SAMPLES_ARB //47\r
216                                 ,WGL_SAMPLE_BUFFERS_ARB\r
217 #endif\r
218 #ifdef WGL_EXT_depth_float\r
219                                 ,WGL_DEPTH_FLOAT_EXT //49\r
220 #endif\r
221                                 ,0,0,0,0\r
222                         };\r
223                         size_t nums = sizeof(atts)/sizeof(int);\r
224                         const bool depth_float_supported= (wglExtensions.find("WGL_EXT_depth_float") != -1);\r
225                         if (!depth_float_supported)\r
226                         {\r
227                                 memmove(&atts[49], &atts[50], (nums-50)*sizeof(int));\r
228                                 nums -= 1;\r
229                         }\r
230                         if (!multi_sample_supported)\r
231                         {\r
232                                 memmove(&atts[47], &atts[49], (nums-49)*sizeof(int));\r
233                                 nums -= 2;\r
234                         }\r
235                         const bool framebuffer_sRGB_supported= (wglExtensions.find("WGL_ARB_framebuffer_sRGB") != -1);\r
236                         if (!framebuffer_sRGB_supported)\r
237                         {\r
238                                 memmove(&atts[46], &atts[47], (nums-47)*sizeof(int));\r
239                                 nums -= 1;\r
240                         }\r
241                         const bool pbuffer_supported = (wglExtensions.find("WGL_ARB_pbuffer") != -1);\r
242                         if (!pbuffer_supported)\r
243                         {\r
244                                 memmove(&atts[42], &atts[46], (nums-46)*sizeof(int));\r
245                                 nums -= 4;\r
246                         }\r
247                         const bool render_texture_supported = (wglExtensions.find("WGL_ARB_render_texture") != -1);\r
248                         if (!render_texture_supported)\r
249                         {\r
250                                 memmove(&atts[40], &atts[42], (nums-42)*sizeof(int));\r
251                                 nums -= 2;\r
252                         }\r
253                         wglGetPixelFormatAttribiv_ARB(hdc,0,0,1,atts,vals);\r
254                         const int count = vals[0];\r
255                         atts[0]=WGL_DRAW_TO_WINDOW_ARB;\r
256                         for (int i=1; i<count; ++i)\r
257                         {\r
258                                 memset(vals,0,sizeof(vals));\r
259 #define tmplog(x,y) os::Printer::log(x, core::stringc(y).c_str())\r
260                                 const BOOL res = wglGetPixelFormatAttribiv_ARB(hdc,i,0,(UINT)nums,atts,vals);\r
261                                 if (FALSE==res)\r
262                                         continue;\r
263                                 tmplog("Pixel format ",i);\r
264                                 u32 j=0;\r
265                                 tmplog("Draw to window " , vals[j]);\r
266                                 tmplog("Draw to bitmap " , vals[++j]);\r
267                                 ++j;\r
268                                 tmplog("Acceleration " , (vals[j]==WGL_NO_ACCELERATION_ARB?"No":\r
269                                         vals[j]==WGL_GENERIC_ACCELERATION_ARB?"Generic":vals[j]==WGL_FULL_ACCELERATION_ARB?"Full":"ERROR"));\r
270                                 tmplog("Need palette " , vals[++j]);\r
271                                 tmplog("Need system palette " , vals[++j]);\r
272                                 tmplog("Swap layer buffers " , vals[++j]);\r
273                                 ++j;\r
274                                 tmplog("Swap method " , (vals[j]==WGL_SWAP_EXCHANGE_ARB?"Exchange":\r
275                                         vals[j]==WGL_SWAP_COPY_ARB?"Copy":vals[j]==WGL_SWAP_UNDEFINED_ARB?"Undefined":"ERROR"));\r
276                                 tmplog("Number of overlays " , vals[++j]);\r
277                                 tmplog("Number of underlays " , vals[++j]);\r
278                                 tmplog("Transparent " , vals[++j]);\r
279                                 tmplog("Transparent red value " , vals[++j]);\r
280                                 tmplog("Transparent green value " , vals[++j]);\r
281                                 tmplog("Transparent blue value " , vals[++j]);\r
282                                 tmplog("Transparent alpha value " , vals[++j]);\r
283                                 tmplog("Transparent index value " , vals[++j]);\r
284                                 tmplog("Share depth " , vals[++j]);\r
285                                 tmplog("Share stencil " , vals[++j]);\r
286                                 tmplog("Share accum " , vals[++j]);\r
287                                 tmplog("Support GDI " , vals[++j]);\r
288                                 tmplog("Support OpenGL " , vals[++j]);\r
289                                 tmplog("Double Buffer " , vals[++j]);\r
290                                 tmplog("Stereo Buffer " , vals[++j]);\r
291                                 tmplog("Pixel type " , vals[++j]);\r
292                                 tmplog("Color bits" , vals[++j]);\r
293                                 tmplog("Red bits " , vals[++j]);\r
294                                 tmplog("Red shift " , vals[++j]);\r
295                                 tmplog("Green bits " , vals[++j]);\r
296                                 tmplog("Green shift " , vals[++j]);\r
297                                 tmplog("Blue bits " , vals[++j]);\r
298                                 tmplog("Blue shift " , vals[++j]);\r
299                                 tmplog("Alpha bits " , vals[++j]);\r
300                                 tmplog("Alpha Shift " , vals[++j]);\r
301                                 tmplog("Accum bits " , vals[++j]);\r
302                                 tmplog("Accum red bits " , vals[++j]);\r
303                                 tmplog("Accum green bits " , vals[++j]);\r
304                                 tmplog("Accum blue bits " , vals[++j]);\r
305                                 tmplog("Accum alpha bits " , vals[++j]);\r
306                                 tmplog("Depth bits " , vals[++j]);\r
307                                 tmplog("Stencil bits " , vals[++j]);\r
308                                 tmplog("Aux buffers " , vals[++j]);\r
309                                 if (render_texture_supported)\r
310                                 {\r
311                                         tmplog("Bind to texture RGB" , vals[++j]);\r
312                                         tmplog("Bind to texture RGBA" , vals[++j]);\r
313                                 }\r
314                                 if (pbuffer_supported)\r
315                                 {\r
316                                         tmplog("Draw to pbuffer" , vals[++j]);\r
317                                         tmplog("Max pbuffer pixels " , vals[++j]);\r
318                                         tmplog("Max pbuffer width" , vals[++j]);\r
319                                         tmplog("Max pbuffer height" , vals[++j]);\r
320                                 }\r
321                                 if (framebuffer_sRGB_supported)\r
322                                         tmplog("Framebuffer sRBG capable" , vals[++j]);\r
323                                 if (multi_sample_supported)\r
324                                 {\r
325                                         tmplog("Samples " , vals[++j]);\r
326                                         tmplog("Sample buffers " , vals[++j]);\r
327                                 }\r
328                                 if (depth_float_supported)\r
329                                         tmplog("Depth float" , vals[++j]);\r
330 #undef tmplog\r
331                         }\r
332                 }\r
333         }\r
334 #endif\r
335 #elif defined(IRR_LINUX_DEVICE)\r
336 #endif\r
337 }\r
338 \r
339 \r
340 void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)\r
341 {\r
342         const f32 ogl_ver = core::fast_atof(reinterpret_cast<const c8*>(glGetString(GL_VERSION)));\r
343         Version = static_cast<u16>(core::floor32(ogl_ver)*100+core::round32(core::fract(ogl_ver)*10.0f));\r
344         if ( Version >= 102)\r
345                 os::Printer::log("OpenGL driver version is 1.2 or better.", ELL_INFORMATION);\r
346         else\r
347                 os::Printer::log("OpenGL driver version is not 1.2 or better.", ELL_WARNING);\r
348 \r
349         {\r
350                 const char* t = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));\r
351                 size_t len = 0;\r
352                 c8 *str = 0;\r
353                 if (t)\r
354                 {\r
355                         len = strlen(t);\r
356                         str = new c8[len+1];\r
357                 }\r
358                 c8* p = str;\r
359 \r
360                 for (size_t i=0; i<len; ++i)\r
361                 {\r
362                         str[i] = static_cast<char>(t[i]);\r
363 \r
364                         if (str[i] == ' ')\r
365                         {\r
366                                 str[i] = 0;\r
367                                 for (u32 j=0; j<IRR_OpenGL_Feature_Count; ++j)\r
368                                 {\r
369                                         if (!strcmp(OpenGLFeatureStrings[j], p))\r
370                                         {\r
371                                                 FeatureAvailable[j] = true;\r
372                                                 break;\r
373                                         }\r
374                                 }\r
375 \r
376                                 p = p + strlen(p) + 1;\r
377                         }\r
378                 }\r
379 \r
380                 delete [] str;\r
381         }\r
382 \r
383         TextureCompressionExtension = FeatureAvailable[IRR_ARB_texture_compression];\r
384         StencilBuffer=stencilBuffer;\r
385 \r
386 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
387 #ifdef _IRR_WINDOWS_API_\r
388         #define IRR_OGL_LOAD_EXTENSION(x) wglGetProcAddress(reinterpret_cast<const char*>(x))\r
389 #elif defined(_IRR_COMPILE_WITH_SDL_DEVICE_) && !defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
390         #define IRR_OGL_LOAD_EXTENSION(x) SDL_GL_GetProcAddress(reinterpret_cast<const char*>(x))\r
391 #else\r
392         // Accessing the correct function is quite complex\r
393         // All libraries should support the ARB version, however\r
394         // since GLX 1.4 the non-ARB version is the official one\r
395         // So we have to check the runtime environment and\r
396         // choose the proper symbol\r
397         // In case you still have problems please enable the\r
398         // next line by uncommenting it\r
399         // #define _IRR_GETPROCADDRESS_WORKAROUND_\r
400 \r
401         #ifndef _IRR_GETPROCADDRESS_WORKAROUND_\r
402         __GLXextFuncPtr (*IRR_OGL_LOAD_EXTENSION_FUNCP)(const GLubyte*)=0;\r
403         #ifdef GLX_VERSION_1_4\r
404                 int major=0,minor=0;\r
405                 if (glXGetCurrentDisplay())\r
406                         glXQueryVersion(glXGetCurrentDisplay(), &major, &minor);\r
407                 if ((major>1) || (minor>3))\r
408                         IRR_OGL_LOAD_EXTENSION_FUNCP=glXGetProcAddress;\r
409                 else\r
410         #endif\r
411                         IRR_OGL_LOAD_EXTENSION_FUNCP=glXGetProcAddressARB;\r
412                 #define IRR_OGL_LOAD_EXTENSION(X) IRR_OGL_LOAD_EXTENSION_FUNCP(reinterpret_cast<const GLubyte*>(X))\r
413         #else\r
414                 #define IRR_OGL_LOAD_EXTENSION(X) glXGetProcAddressARB(reinterpret_cast<const GLubyte*>(X))\r
415         #endif // workaround\r
416 #endif // Windows, SDL, or Linux\r
417 \r
418         // get multitexturing function pointers\r
419         pGlActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) IRR_OGL_LOAD_EXTENSION("glActiveTextureARB");\r
420         pGlClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) IRR_OGL_LOAD_EXTENSION("glClientActiveTextureARB");\r
421 \r
422         // get fragment and vertex program function pointers\r
423         pGlGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) IRR_OGL_LOAD_EXTENSION("glGenProgramsARB");\r
424         pGlGenProgramsNV = (PFNGLGENPROGRAMSNVPROC) IRR_OGL_LOAD_EXTENSION("glGenProgramsNV");\r
425         pGlBindProgramARB = (PFNGLBINDPROGRAMARBPROC) IRR_OGL_LOAD_EXTENSION("glBindProgramARB");\r
426         pGlBindProgramNV = (PFNGLBINDPROGRAMNVPROC) IRR_OGL_LOAD_EXTENSION("glBindProgramNV");\r
427         pGlProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) IRR_OGL_LOAD_EXTENSION("glProgramStringARB");\r
428         pGlLoadProgramNV = (PFNGLLOADPROGRAMNVPROC) IRR_OGL_LOAD_EXTENSION("glLoadProgramNV");\r
429         pGlDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) IRR_OGL_LOAD_EXTENSION("glDeleteProgramsARB");\r
430         pGlDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC) IRR_OGL_LOAD_EXTENSION("glDeleteProgramsNV");\r
431         pGlProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) IRR_OGL_LOAD_EXTENSION("glProgramLocalParameter4fvARB");\r
432         pGlCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) IRR_OGL_LOAD_EXTENSION("glCreateShaderObjectARB");\r
433         pGlCreateShader = (PFNGLCREATESHADERPROC) IRR_OGL_LOAD_EXTENSION("glCreateShader");\r
434         pGlShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) IRR_OGL_LOAD_EXTENSION("glShaderSourceARB");\r
435         pGlShaderSource = (PFNGLSHADERSOURCEPROC) IRR_OGL_LOAD_EXTENSION("glShaderSource");\r
436         pGlCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) IRR_OGL_LOAD_EXTENSION("glCompileShaderARB");\r
437         pGlCompileShader = (PFNGLCOMPILESHADERPROC) IRR_OGL_LOAD_EXTENSION("glCompileShader");\r
438         pGlCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) IRR_OGL_LOAD_EXTENSION("glCreateProgramObjectARB");\r
439         pGlCreateProgram = (PFNGLCREATEPROGRAMPROC) IRR_OGL_LOAD_EXTENSION("glCreateProgram");\r
440         pGlAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) IRR_OGL_LOAD_EXTENSION("glAttachObjectARB");\r
441         pGlAttachShader = (PFNGLATTACHSHADERPROC) IRR_OGL_LOAD_EXTENSION("glAttachShader");\r
442         pGlLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) IRR_OGL_LOAD_EXTENSION("glLinkProgramARB");\r
443         pGlLinkProgram = (PFNGLLINKPROGRAMPROC) IRR_OGL_LOAD_EXTENSION("glLinkProgram");\r
444         pGlUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) IRR_OGL_LOAD_EXTENSION("glUseProgramObjectARB");\r
445         pGlUseProgram = (PFNGLUSEPROGRAMPROC) IRR_OGL_LOAD_EXTENSION("glUseProgram");\r
446         pGlDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) IRR_OGL_LOAD_EXTENSION("glDeleteObjectARB");\r
447         pGlDeleteProgram = (PFNGLDELETEPROGRAMPROC) IRR_OGL_LOAD_EXTENSION("glDeleteProgram");\r
448         pGlDeleteShader = (PFNGLDELETESHADERPROC) IRR_OGL_LOAD_EXTENSION("glDeleteShader");\r
449         pGlGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) IRR_OGL_LOAD_EXTENSION("glGetAttachedShaders");\r
450         pGlGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) IRR_OGL_LOAD_EXTENSION("glGetAttachedObjectsARB");\r
451         pGlGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) IRR_OGL_LOAD_EXTENSION("glGetInfoLogARB");\r
452         pGlGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) IRR_OGL_LOAD_EXTENSION("glGetShaderInfoLog");\r
453         pGlGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) IRR_OGL_LOAD_EXTENSION("glGetProgramInfoLog");\r
454         pGlGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) IRR_OGL_LOAD_EXTENSION("glGetObjectParameterivARB");\r
455         pGlGetShaderiv = (PFNGLGETSHADERIVPROC) IRR_OGL_LOAD_EXTENSION("glGetShaderiv");\r
456         pGlGetProgramiv = (PFNGLGETPROGRAMIVPROC) IRR_OGL_LOAD_EXTENSION("glGetProgramiv");\r
457         pGlGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) IRR_OGL_LOAD_EXTENSION("glGetUniformLocationARB");\r
458         pGlGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) IRR_OGL_LOAD_EXTENSION("glGetUniformLocation");\r
459         pGlUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) IRR_OGL_LOAD_EXTENSION("glUniform1fvARB");\r
460         pGlUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) IRR_OGL_LOAD_EXTENSION("glUniform2fvARB");\r
461         pGlUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) IRR_OGL_LOAD_EXTENSION("glUniform3fvARB");\r
462         pGlUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) IRR_OGL_LOAD_EXTENSION("glUniform4fvARB");\r
463         pGlUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) IRR_OGL_LOAD_EXTENSION("glUniform1ivARB");\r
464         pGlUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) IRR_OGL_LOAD_EXTENSION("glUniform2ivARB");\r
465         pGlUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) IRR_OGL_LOAD_EXTENSION("glUniform3ivARB");\r
466         pGlUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) IRR_OGL_LOAD_EXTENSION("glUniform4ivARB");\r
467         pGlUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) IRR_OGL_LOAD_EXTENSION("glUniformMatrix2fvARB");\r
468         pGlUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) IRR_OGL_LOAD_EXTENSION("glUniformMatrix3fvARB");\r
469         pGlUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) IRR_OGL_LOAD_EXTENSION("glUniformMatrix4fvARB");\r
470         pGlGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) IRR_OGL_LOAD_EXTENSION("glGetActiveUniformARB");\r
471         pGlGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) IRR_OGL_LOAD_EXTENSION("glGetActiveUniform");\r
472 \r
473         // get point parameter extension\r
474         pGlPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC) IRR_OGL_LOAD_EXTENSION("glPointParameterfARB");\r
475         pGlPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC) IRR_OGL_LOAD_EXTENSION("glPointParameterfvARB");\r
476 \r
477         // get stencil extension\r
478         pGlStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) IRR_OGL_LOAD_EXTENSION("glStencilFuncSeparate");\r
479         pGlStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) IRR_OGL_LOAD_EXTENSION("glStencilOpSeparate");\r
480         pGlStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC) IRR_OGL_LOAD_EXTENSION("glStencilFuncSeparateATI");\r
481         pGlStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC) IRR_OGL_LOAD_EXTENSION("glStencilOpSeparateATI");\r
482 \r
483         // compressed textures\r
484         pGlCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) IRR_OGL_LOAD_EXTENSION("glCompressedTexImage2D");\r
485         pGlCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) IRR_OGL_LOAD_EXTENSION("glCompressedTexSubImage2D");\r
486 \r
487         // ARB FrameBufferObjects\r
488         pGlBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) IRR_OGL_LOAD_EXTENSION("glBindFramebuffer");\r
489         pGlDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) IRR_OGL_LOAD_EXTENSION("glDeleteFramebuffers");\r
490         pGlGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) IRR_OGL_LOAD_EXTENSION("glGenFramebuffers");\r
491         pGlCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) IRR_OGL_LOAD_EXTENSION("glCheckFramebufferStatus");\r
492         pGlFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) IRR_OGL_LOAD_EXTENSION("glFramebufferTexture2D");\r
493         pGlBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) IRR_OGL_LOAD_EXTENSION("glBindRenderbuffer");\r
494         pGlDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) IRR_OGL_LOAD_EXTENSION("glDeleteRenderbuffers");\r
495         pGlGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) IRR_OGL_LOAD_EXTENSION("glGenRenderbuffers");\r
496         pGlRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) IRR_OGL_LOAD_EXTENSION("glRenderbufferStorage");\r
497         pGlFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) IRR_OGL_LOAD_EXTENSION("glFramebufferRenderbuffer");\r
498         pGlGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) IRR_OGL_LOAD_EXTENSION("glGenerateMipmap");\r
499 \r
500         // EXT FrameBufferObjects\r
501         pGlBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) IRR_OGL_LOAD_EXTENSION("glBindFramebufferEXT");\r
502         pGlDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) IRR_OGL_LOAD_EXTENSION("glDeleteFramebuffersEXT");\r
503         pGlGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) IRR_OGL_LOAD_EXTENSION("glGenFramebuffersEXT");\r
504         pGlCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) IRR_OGL_LOAD_EXTENSION("glCheckFramebufferStatusEXT");\r
505         pGlFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) IRR_OGL_LOAD_EXTENSION("glFramebufferTexture2DEXT");\r
506         pGlBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) IRR_OGL_LOAD_EXTENSION("glBindRenderbufferEXT");\r
507         pGlDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) IRR_OGL_LOAD_EXTENSION("glDeleteRenderbuffersEXT");\r
508         pGlGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) IRR_OGL_LOAD_EXTENSION("glGenRenderbuffersEXT");\r
509         pGlRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) IRR_OGL_LOAD_EXTENSION("glRenderbufferStorageEXT");\r
510         pGlFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) IRR_OGL_LOAD_EXTENSION("glFramebufferRenderbufferEXT");\r
511         pGlGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) IRR_OGL_LOAD_EXTENSION("glGenerateMipmapEXT");\r
512         pGlDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC) IRR_OGL_LOAD_EXTENSION("glDrawBuffersARB");\r
513         pGlDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC) IRR_OGL_LOAD_EXTENSION("glDrawBuffersATI");\r
514 \r
515         // get vertex buffer extension\r
516         pGlGenBuffersARB = (PFNGLGENBUFFERSARBPROC) IRR_OGL_LOAD_EXTENSION("glGenBuffersARB");\r
517         pGlBindBufferARB = (PFNGLBINDBUFFERARBPROC) IRR_OGL_LOAD_EXTENSION("glBindBufferARB");\r
518         pGlBufferDataARB = (PFNGLBUFFERDATAARBPROC) IRR_OGL_LOAD_EXTENSION("glBufferDataARB");\r
519         pGlDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) IRR_OGL_LOAD_EXTENSION("glDeleteBuffersARB");\r
520         pGlBufferSubDataARB= (PFNGLBUFFERSUBDATAARBPROC) IRR_OGL_LOAD_EXTENSION("glBufferSubDataARB");\r
521         pGlGetBufferSubDataARB= (PFNGLGETBUFFERSUBDATAARBPROC)IRR_OGL_LOAD_EXTENSION("glGetBufferSubDataARB");\r
522         pGlMapBufferARB= (PFNGLMAPBUFFERARBPROC) IRR_OGL_LOAD_EXTENSION("glMapBufferARB");\r
523         pGlUnmapBufferARB= (PFNGLUNMAPBUFFERARBPROC) IRR_OGL_LOAD_EXTENSION("glUnmapBufferARB");\r
524         pGlIsBufferARB= (PFNGLISBUFFERARBPROC) IRR_OGL_LOAD_EXTENSION("glIsBufferARB");\r
525         pGlGetBufferParameterivARB= (PFNGLGETBUFFERPARAMETERIVARBPROC) IRR_OGL_LOAD_EXTENSION("glGetBufferParameterivARB");\r
526         pGlGetBufferPointervARB= (PFNGLGETBUFFERPOINTERVARBPROC) IRR_OGL_LOAD_EXTENSION("glGetBufferPointervARB");\r
527         pGlProvokingVertexARB= (PFNGLPROVOKINGVERTEXPROC) IRR_OGL_LOAD_EXTENSION("glProvokingVertex");\r
528         pGlProvokingVertexEXT= (PFNGLPROVOKINGVERTEXEXTPROC) IRR_OGL_LOAD_EXTENSION("glProvokingVertexEXT");\r
529         pGlProgramParameteriARB= (PFNGLPROGRAMPARAMETERIARBPROC) IRR_OGL_LOAD_EXTENSION("glProgramParameteriARB");\r
530         pGlProgramParameteriEXT= (PFNGLPROGRAMPARAMETERIEXTPROC) IRR_OGL_LOAD_EXTENSION("glProgramParameteriEXT");\r
531 \r
532         // occlusion query\r
533         pGlGenQueriesARB = (PFNGLGENQUERIESARBPROC) IRR_OGL_LOAD_EXTENSION("glGenQueriesARB");\r
534         pGlDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC) IRR_OGL_LOAD_EXTENSION("glDeleteQueriesARB");\r
535         pGlIsQueryARB = (PFNGLISQUERYARBPROC) IRR_OGL_LOAD_EXTENSION("glIsQueryARB");\r
536         pGlBeginQueryARB = (PFNGLBEGINQUERYARBPROC) IRR_OGL_LOAD_EXTENSION("glBeginQueryARB");\r
537         pGlEndQueryARB = (PFNGLENDQUERYARBPROC) IRR_OGL_LOAD_EXTENSION("glEndQueryARB");\r
538         pGlGetQueryivARB = (PFNGLGETQUERYIVARBPROC) IRR_OGL_LOAD_EXTENSION("glGetQueryivARB");\r
539         pGlGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC) IRR_OGL_LOAD_EXTENSION("glGetQueryObjectivARB");\r
540         pGlGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC) IRR_OGL_LOAD_EXTENSION("glGetQueryObjectuivARB");\r
541         pGlGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC) IRR_OGL_LOAD_EXTENSION("glGenOcclusionQueriesNV");\r
542         pGlDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC) IRR_OGL_LOAD_EXTENSION("glDeleteOcclusionQueriesNV");\r
543         pGlIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC) IRR_OGL_LOAD_EXTENSION("glIsOcclusionQueryNV");\r
544         pGlBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC) IRR_OGL_LOAD_EXTENSION("glBeginOcclusionQueryNV");\r
545         pGlEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC) IRR_OGL_LOAD_EXTENSION("glEndOcclusionQueryNV");\r
546         pGlGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC) IRR_OGL_LOAD_EXTENSION("glGetOcclusionQueryivNV");\r
547         pGlGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC) IRR_OGL_LOAD_EXTENSION("glGetOcclusionQueryuivNV");\r
548 \r
549         // blend\r
550         pGlBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) IRR_OGL_LOAD_EXTENSION("glBlendFuncSeparateEXT");\r
551         pGlBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) IRR_OGL_LOAD_EXTENSION("glBlendFuncSeparate");\r
552         pGlBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC) IRR_OGL_LOAD_EXTENSION("glBlendEquationEXT");\r
553         pGlBlendEquation = (PFNGLBLENDEQUATIONPROC) IRR_OGL_LOAD_EXTENSION("glBlendEquation");\r
554         pGlBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC) IRR_OGL_LOAD_EXTENSION("glBlendEquationSeparateEXT");\r
555         pGlBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) IRR_OGL_LOAD_EXTENSION("glBlendEquationSeparate");\r
556 \r
557         // indexed\r
558         pGlEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC) IRR_OGL_LOAD_EXTENSION("glEnableIndexedEXT");\r
559         pGlDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC) IRR_OGL_LOAD_EXTENSION("glDisableIndexedEXT");\r
560         pGlColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC) IRR_OGL_LOAD_EXTENSION("glColorMaskIndexedEXT");\r
561         pGlBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC) IRR_OGL_LOAD_EXTENSION("glBlendFuncIndexedAMD");\r
562         pGlBlendFunciARB = (PFNGLBLENDFUNCIPROC) IRR_OGL_LOAD_EXTENSION("glBlendFunciARB");\r
563         pGlBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) IRR_OGL_LOAD_EXTENSION("glBlendFuncSeparateIndexedAMD");\r
564         pGlBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIPROC) IRR_OGL_LOAD_EXTENSION("glBlendFuncSeparateiARB");\r
565         pGlBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC) IRR_OGL_LOAD_EXTENSION("glBlendEquationIndexedAMD");\r
566         pGlBlendEquationiARB = (PFNGLBLENDEQUATIONIPROC) IRR_OGL_LOAD_EXTENSION("glBlendEquationiARB");\r
567         pGlBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) IRR_OGL_LOAD_EXTENSION("glBlendEquationSeparateIndexedAMD");\r
568         pGlBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIPROC) IRR_OGL_LOAD_EXTENSION("glBlendEquationSeparateiARB");\r
569 \r
570     pGlTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC)IRR_OGL_LOAD_EXTENSION("glTextureSubImage2D");\r
571     pGlTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC) IRR_OGL_LOAD_EXTENSION("glTextureStorage2D");\r
572     pGlTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC) IRR_OGL_LOAD_EXTENSION("glTextureStorage3D");\r
573     pGlNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) IRR_OGL_LOAD_EXTENSION("glNamedFramebufferTexture");\r
574     pGlTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC) IRR_OGL_LOAD_EXTENSION("glTextureParameteri");\r
575     pGlCreateTextures = (PFNGLCREATETEXTURESPROC) IRR_OGL_LOAD_EXTENSION("glCreateTextures");\r
576     pGlCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC) IRR_OGL_LOAD_EXTENSION("glCreateFramebuffers");\r
577     pGlBindTextures = (PFNGLBINDTEXTURESPROC) IRR_OGL_LOAD_EXTENSION("glBindTextures");\r
578     pGlGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC) IRR_OGL_LOAD_EXTENSION("glGenerateTextureMipmap");\r
579     //==============================\r
580     pGlTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)IRR_OGL_LOAD_EXTENSION("glTextureSubImage2DEXT");\r
581     pGlTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC)IRR_OGL_LOAD_EXTENSION("glTextureStorage2DEXT");\r
582     pGlTexStorage2D = (PFNGLTEXSTORAGE2DPROC)IRR_OGL_LOAD_EXTENSION("glTexStorage2D");\r
583     pGlTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC)IRR_OGL_LOAD_EXTENSION("glTextureStorage3DEXT");\r
584     pGlTexStorage3D = (PFNGLTEXSTORAGE3DPROC)IRR_OGL_LOAD_EXTENSION("glTexStorage3D");\r
585     pGlNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)IRR_OGL_LOAD_EXTENSION("glNamedFramebufferTextureEXT");\r
586     pGlFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)IRR_OGL_LOAD_EXTENSION("glFramebufferTexture");\r
587     pGlActiveTexture = (PFNGLACTIVETEXTUREPROC)IRR_OGL_LOAD_EXTENSION("glActiveTexture");\r
588     pGlGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC) IRR_OGL_LOAD_EXTENSION("glGenerateTextureMipmapEXT");\r
589 \r
590         // get vsync extension\r
591         #if defined(WGL_EXT_swap_control) && !defined(_IRR_COMPILE_WITH_SDL_DEVICE_)\r
592                 pWglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) IRR_OGL_LOAD_EXTENSION("wglSwapIntervalEXT");\r
593         #endif\r
594         #if defined(GLX_SGI_swap_control) && !defined(_IRR_COMPILE_WITH_SDL_DEVICE_)\r
595                 pGlxSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)IRR_OGL_LOAD_EXTENSION("glXSwapIntervalSGI");\r
596         #endif\r
597         #if defined(GLX_EXT_swap_control) && !defined(_IRR_COMPILE_WITH_SDL_DEVICE_)\r
598                 pGlxSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)IRR_OGL_LOAD_EXTENSION("glXSwapIntervalEXT");\r
599         #endif\r
600         #if defined(GLX_MESA_swap_control) && !defined(_IRR_COMPILE_WITH_SDL_DEVICE_)\r
601                 pGlxSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)IRR_OGL_LOAD_EXTENSION("glXSwapIntervalMESA");\r
602         #endif\r
603 #endif // use extension pointer\r
604 \r
605         GLint num=0;\r
606         // set some properties\r
607 #if defined(GL_ARB_multitexture) || defined(GL_VERSION_1_3)\r
608         if (Version>102 || FeatureAvailable[IRR_ARB_multitexture])\r
609         {\r
610 #if defined(GL_MAX_TEXTURE_UNITS)\r
611                 glGetIntegerv(GL_MAX_TEXTURE_UNITS, &num);\r
612 #elif defined(GL_MAX_TEXTURE_UNITS_ARB)\r
613                 glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &num);\r
614 #endif\r
615                 Feature.MaxTextureUnits=static_cast<u8>(num);   // MULTITEXTURING (fixed function pipeline texture units)\r
616         }\r
617 #endif\r
618 #if defined(GL_ARB_vertex_shader) || defined(GL_VERSION_2_0)\r
619         if (Version>=200 || FeatureAvailable[IRR_ARB_vertex_shader])\r
620         {\r
621                 num=0;\r
622 #if defined(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS)\r
623                 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &num);\r
624 #elif defined(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB)\r
625                 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, &num);\r
626 #endif\r
627                 Feature.MaxTextureUnits =core::max_(Feature.MaxTextureUnits,static_cast<u8>(num));\r
628         }\r
629 #endif\r
630         glGetIntegerv(GL_MAX_LIGHTS, &num);\r
631         MaxLights=static_cast<u8>(num);\r
632 #ifdef GL_EXT_texture_filter_anisotropic\r
633         if (FeatureAvailable[IRR_EXT_texture_filter_anisotropic])\r
634         {\r
635                 glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &num);\r
636                 MaxAnisotropy=static_cast<u8>(num);\r
637         }\r
638 #endif\r
639 #ifdef GL_VERSION_1_2\r
640         if (Version>101)\r
641         {\r
642                 glGetIntegerv(GL_MAX_ELEMENTS_INDICES, &num);\r
643                 MaxIndices=num;\r
644         }\r
645 #endif\r
646         glGetIntegerv(GL_MAX_TEXTURE_SIZE, &num);\r
647         MaxTextureSize=static_cast<u32>(num);\r
648         if (queryFeature(EVDF_GEOMETRY_SHADER))\r
649         {\r
650 #if defined(GL_ARB_geometry_shader4) || defined(GL_EXT_geometry_shader4) || defined(GL_NV_geometry_shader4)\r
651                 glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT, &num);\r
652                 MaxGeometryVerticesOut=static_cast<u32>(num);\r
653 #elif defined(GL_NV_geometry_program4)\r
654                 extGlGetProgramiv(GEOMETRY_PROGRAM_NV, GL_MAX_PROGRAM_OUTPUT_VERTICES_NV, &num);\r
655                 MaxGeometryVerticesOut=static_cast<u32>(num);\r
656 #endif\r
657         }\r
658 #ifdef GL_EXT_texture_lod_bias\r
659         if (FeatureAvailable[IRR_EXT_texture_lod_bias])\r
660                 glGetFloatv(GL_MAX_TEXTURE_LOD_BIAS_EXT, &MaxTextureLODBias);\r
661 #endif\r
662         glGetIntegerv(GL_MAX_CLIP_PLANES, &num);\r
663         MaxUserClipPlanes=static_cast<u8>(num);\r
664         glGetIntegerv(GL_AUX_BUFFERS, &num);\r
665         MaxAuxBuffers=static_cast<u8>(num);\r
666 #ifdef GL_ARB_draw_buffers\r
667         if (FeatureAvailable[IRR_ARB_draw_buffers])\r
668         {\r
669                 glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &num);\r
670                 Feature.MultipleRenderTarget = static_cast<u8>(num);\r
671         }\r
672 #endif\r
673 #if defined(GL_ATI_draw_buffers)\r
674 #ifdef GL_ARB_draw_buffers\r
675         else\r
676 #endif\r
677         if (FeatureAvailable[IRR_ATI_draw_buffers])\r
678         {\r
679                 glGetIntegerv(GL_MAX_DRAW_BUFFERS_ATI, &num);\r
680                 Feature.MultipleRenderTarget = static_cast<u8>(num);\r
681         }\r
682 #endif\r
683 #ifdef GL_ARB_framebuffer_object\r
684         if (FeatureAvailable[IRR_ARB_framebuffer_object])\r
685         {\r
686                 glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &num);\r
687                 Feature.ColorAttachment = static_cast<u8>(num);\r
688         }\r
689 #endif\r
690 #if defined(GL_EXT_framebuffer_object)\r
691 #ifdef GL_ARB_framebuffer_object\r
692         else\r
693 #endif\r
694                 if (FeatureAvailable[IRR_EXT_framebuffer_object])\r
695                 {\r
696                         glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &num);\r
697                         Feature.ColorAttachment = static_cast<u8>(num);\r
698                 }\r
699 #endif\r
700 \r
701         glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, DimAliasedLine);\r
702         glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, DimAliasedPoint);\r
703         glGetFloatv(GL_SMOOTH_LINE_WIDTH_RANGE, DimSmoothedLine);\r
704         glGetFloatv(GL_SMOOTH_POINT_SIZE_RANGE, DimSmoothedPoint);\r
705 #if defined(GL_ARB_shading_language_100) || defined (GL_VERSION_2_0)\r
706         if (FeatureAvailable[IRR_ARB_shading_language_100] || Version>=200)\r
707         {\r
708                 glGetError(); // clean error buffer\r
709 #ifdef GL_SHADING_LANGUAGE_VERSION\r
710                 const GLubyte* shaderVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);\r
711 #else\r
712                 const GLubyte* shaderVersion = glGetString(GL_SHADING_LANGUAGE_VERSION_ARB);\r
713 #endif\r
714                 if (glGetError() == GL_INVALID_ENUM)\r
715                         ShaderLanguageVersion = 100;\r
716                 else\r
717                 {\r
718                         const f32 sl_ver = core::fast_atof(reinterpret_cast<const c8*>(shaderVersion));\r
719                         ShaderLanguageVersion = static_cast<u16>(core::floor32(sl_ver)*100+core::round32(core::fract(sl_ver)*10.0f));\r
720                 }\r
721         }\r
722 #endif\r
723 \r
724 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
725         if (!pGlActiveTextureARB || !pGlClientActiveTextureARB)\r
726         {\r
727                 Feature.MaxTextureUnits = 1;\r
728                 os::Printer::log("Failed to load OpenGL's multitexture extension, proceeding without.", ELL_WARNING);\r
729         }\r
730         else\r
731 #endif\r
732         Feature.MaxTextureUnits = core::min_(Feature.MaxTextureUnits, static_cast<u8>(MATERIAL_MAX_TEXTURES));\r
733         Feature.MaxTextureUnits = core::min_(Feature.MaxTextureUnits, static_cast<u8>(MATERIAL_MAX_TEXTURES_USED));\r
734 \r
735 #ifdef GL_ARB_occlusion_query\r
736         if (FeatureAvailable[IRR_ARB_occlusion_query])\r
737         {\r
738                 extGlGetQueryiv(GL_SAMPLES_PASSED_ARB,GL_QUERY_COUNTER_BITS_ARB,\r
739                                                 &num);\r
740                 OcclusionQuerySupport=(num>0);\r
741         }\r
742         else\r
743 #endif\r
744 #ifdef GL_NV_occlusion_query\r
745         if (FeatureAvailable[IRR_NV_occlusion_query])\r
746         {\r
747                 glGetIntegerv(GL_PIXEL_COUNTER_BITS_NV, &num);\r
748                 OcclusionQuerySupport=(num>0);\r
749         }\r
750         else\r
751 #endif\r
752                 OcclusionQuerySupport=false;\r
753 \r
754     Feature.BlendOperation = (Version >= 140) ||\r
755             FeatureAvailable[IRR_EXT_blend_minmax] ||\r
756             FeatureAvailable[IRR_EXT_blend_subtract] ||\r
757             FeatureAvailable[IRR_EXT_blend_logic_op];\r
758 \r
759 #ifdef _DEBUG\r
760         if (FeatureAvailable[IRR_NVX_gpu_memory_info])\r
761         {\r
762                 // undocumented flags, so use the RAW values\r
763                 GLint val;\r
764                 glGetIntegerv(0x9047, &val);\r
765                 os::Printer::log("Dedicated video memory (kB)", core::stringc(val));\r
766                 glGetIntegerv(0x9048, &val);\r
767                 os::Printer::log("Total video memory (kB)", core::stringc(val));\r
768                 glGetIntegerv(0x9049, &val);\r
769                 os::Printer::log("Available video memory (kB)", core::stringc(val));\r
770         }\r
771 #ifdef GL_ATI_meminfo\r
772         if (FeatureAvailable[IRR_ATI_meminfo])\r
773         {\r
774                 GLint val[4];\r
775                 glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, val);\r
776                 os::Printer::log("Free texture memory (kB)", core::stringc(val[0]));\r
777                 glGetIntegerv(GL_VBO_FREE_MEMORY_ATI, val);\r
778                 os::Printer::log("Free VBO memory (kB)", core::stringc(val[0]));\r
779                 glGetIntegerv(GL_RENDERBUFFER_FREE_MEMORY_ATI, val);\r
780                 os::Printer::log("Free render buffer memory (kB)", core::stringc(val[0]));\r
781         }\r
782 #endif\r
783 \r
784         if (queryFeature(EVDF_TEXTURE_CUBEMAP_SEAMLESS))\r
785                 glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);\r
786 \r
787 #endif\r
788 }\r
789 \r
790 const COpenGLCoreFeature& COpenGLExtensionHandler::getFeature() const\r
791 {\r
792         return Feature;\r
793 }\r
794 \r
795 bool COpenGLExtensionHandler::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const\r
796 {\r
797         switch (feature)\r
798         {\r
799         case EVDF_RENDER_TO_TARGET:\r
800                 return true;\r
801         case EVDF_HARDWARE_TL:\r
802                 return true; // we cannot tell other things\r
803         case EVDF_MULTITEXTURE:\r
804                 return Feature.MaxTextureUnits > 1;\r
805         case EVDF_BILINEAR_FILTER:\r
806                 return true;\r
807         case EVDF_MIP_MAP:\r
808                 return true;\r
809         case EVDF_MIP_MAP_AUTO_UPDATE:\r
810                 return FeatureAvailable[IRR_SGIS_generate_mipmap] || FeatureAvailable[IRR_EXT_framebuffer_object] || FeatureAvailable[IRR_ARB_framebuffer_object];\r
811         case EVDF_STENCIL_BUFFER:\r
812                 return StencilBuffer;\r
813         case EVDF_VERTEX_SHADER_1_1:\r
814         case EVDF_ARB_VERTEX_PROGRAM_1:\r
815                 return FeatureAvailable[IRR_ARB_vertex_program] || FeatureAvailable[IRR_NV_vertex_program1_1];\r
816         case EVDF_PIXEL_SHADER_1_1:\r
817         case EVDF_PIXEL_SHADER_1_2:\r
818         case EVDF_ARB_FRAGMENT_PROGRAM_1:\r
819                 return FeatureAvailable[IRR_ARB_fragment_program] || FeatureAvailable[IRR_NV_fragment_program];\r
820         case EVDF_PIXEL_SHADER_2_0:\r
821         case EVDF_VERTEX_SHADER_2_0:\r
822         case EVDF_ARB_GLSL:\r
823                 return (FeatureAvailable[IRR_ARB_shading_language_100]||Version>=200);\r
824         case EVDF_TEXTURE_NSQUARE:\r
825                 return true; // non-square is always supported\r
826         case EVDF_TEXTURE_NPOT:\r
827                 // Some ATI cards seem to have only SW support in OpenGL 2.0\r
828                 // drivers if the extension is not exposed, so we skip this\r
829                 // extra test for now!\r
830                 // return (FeatureAvailable[IRR_ARB_texture_non_power_of_two]||Version>=200);\r
831                 return (FeatureAvailable[IRR_ARB_texture_non_power_of_two]);\r
832         case EVDF_FRAMEBUFFER_OBJECT:\r
833                 return FeatureAvailable[IRR_EXT_framebuffer_object] || FeatureAvailable[IRR_ARB_framebuffer_object];\r
834         case EVDF_VERTEX_BUFFER_OBJECT:\r
835                 return FeatureAvailable[IRR_ARB_vertex_buffer_object];\r
836         case EVDF_COLOR_MASK:\r
837                 return true;\r
838         case EVDF_ALPHA_TO_COVERAGE:\r
839                 return FeatureAvailable[IRR_ARB_multisample];\r
840         case EVDF_GEOMETRY_SHADER:\r
841                 return FeatureAvailable[IRR_ARB_geometry_shader4] || FeatureAvailable[IRR_EXT_geometry_shader4] || FeatureAvailable[IRR_NV_geometry_program4] || FeatureAvailable[IRR_NV_geometry_shader4];\r
842         case EVDF_MULTIPLE_RENDER_TARGETS:\r
843                 return FeatureAvailable[IRR_ARB_draw_buffers] || FeatureAvailable[IRR_ATI_draw_buffers];\r
844         case EVDF_MRT_BLEND:\r
845         case EVDF_MRT_COLOR_MASK:\r
846                 return FeatureAvailable[IRR_EXT_draw_buffers2];\r
847         case EVDF_MRT_BLEND_FUNC:\r
848                 return FeatureAvailable[IRR_ARB_draw_buffers_blend] || FeatureAvailable[IRR_AMD_draw_buffers_blend];\r
849         case EVDF_OCCLUSION_QUERY:\r
850                 return FeatureAvailable[IRR_ARB_occlusion_query] && OcclusionQuerySupport;\r
851         case EVDF_POLYGON_OFFSET:\r
852                 // both features supported with OpenGL 1.1\r
853                 return Version>=110;\r
854         case EVDF_BLEND_OPERATIONS:\r
855                 return Feature.BlendOperation;\r
856         case EVDF_BLEND_SEPARATE:\r
857                 return (Version>=140) || FeatureAvailable[IRR_EXT_blend_func_separate];\r
858         case EVDF_TEXTURE_MATRIX:\r
859                 return true;\r
860         case EVDF_TEXTURE_COMPRESSED_DXT:\r
861                 return FeatureAvailable[IRR_EXT_texture_compression_s3tc];\r
862         case EVDF_TEXTURE_CUBEMAP:\r
863                 return (Version >= 130) || FeatureAvailable[IRR_ARB_texture_cube_map] || FeatureAvailable[IRR_EXT_texture_cube_map];\r
864         case EVDF_TEXTURE_CUBEMAP_SEAMLESS:\r
865                 return FeatureAvailable[IRR_ARB_seamless_cube_map];\r
866         case EVDF_DEPTH_CLAMP:\r
867                 return FeatureAvailable[IRR_NV_depth_clamp] || FeatureAvailable[IRR_ARB_depth_clamp];\r
868 \r
869         default:\r
870                 return false;\r
871         };\r
872 }\r
873 \r
874 \r
875 }\r
876 }\r
877 \r
878 #endif\r