12 #include <OpenGL/glu.h> 17 #include <allegro/internal/aintern.h> 21 #define AGL_API(type, name, args) AGL_##name##_t name; 22 typedef struct AGL_EXT {
23 # include "allegrogl/GLext/gl_ext_api.h" 24 #ifdef ALLEGRO_WINDOWS 25 # include "allegrogl/GLext/wgl_ext_api.h" 26 #elif defined ALLEGRO_UNIX 27 # include "allegrogl/GLext/glx_ext_api.h" 32 #define PREFIX_I "agl-ext INFO: " 33 #define PREFIX_W "agl-ext WARNING: " 34 #define PREFIX_E "agl-ext ERROR: " 38 struct allegro_gl_info allegro_gl_info;
65 struct AGL_EXTENSION_LIST_GLX allegro_gl_extensions_GLX;
75 #ifdef ALLEGRO_WINDOWS 76 struct AGL_EXTENSION_LIST_WGL allegro_gl_extensions_WGL;
85 #ifdef ALLEGROGL_GENERIC_DRIVER 90 #ifdef ALLEGROGL_HAVE_DYNAMIC_LINK 94 static void* __agl_handle = NULL;
96 typedef void* (*GLXGETPROCADDRESSARBPROC) (
const GLubyte*);
97 static GLXGETPROCADDRESSARBPROC aglXGetProcAddress;
100 #ifdef ALLEGROGL_GLXGETPROCADDRESSARB 101 #define aglXGetProcAddress glXGetProcAddressARB 103 #define aglXGetProcAddress glXGetProcAddress 108 #ifdef ALLEGRO_MACOSX 111 #include <Carbon/Carbon.h> 117 static CFBundleRef opengl_bundle_ref;
123 #define AGL_API(type, name, args) AGL_##name##_t __agl##name = NULL; 124 # include "allegrogl/GLext/gl_ext_api.h" 126 #ifdef ALLEGRO_WINDOWS 127 #define AGL_API(type, name, args) AGL_##name##_t __awgl##name = NULL; 128 # include "allegrogl/GLext/wgl_ext_api.h" 130 #elif defined ALLEGRO_UNIX 131 #define AGL_API(type, name, args) AGL_##name##_t __aglX##name = NULL; 132 # include "allegrogl/GLext/glx_ext_api.h" 139 AGL_EXT* __allegro_gl_create_extensions() {
141 AGL_EXT *ret = malloc(
sizeof(AGL_EXT));
147 memset(ret, 0,
sizeof(AGL_EXT));
157 void __allegro_gl_load_extensions(AGL_EXT *ext) {
159 #ifdef ALLEGRO_MACOSX 160 CFStringRef
function;
167 if (!aglXGetProcAddress) {
172 # ifdef ALLEGRO_WINDOWS 173 # define AGL_API(type, name, args) \ 174 ext->name = (AGL_##name##_t)wglGetProcAddress("gl" #name); \ 175 if (ext->name) { AGL_LOG(2,"gl" #name " successfully loaded\n"); } 176 # include "allegrogl/GLext/gl_ext_api.h" 178 # define AGL_API(type, name, args) \ 179 ext->name = (AGL_##name##_t)wglGetProcAddress("wgl" #name); \ 180 if (ext->name) { AGL_LOG(2,"wgl" #name " successfully loaded\n"); } 181 # include "allegrogl/GLext/wgl_ext_api.h" 183 # elif defined ALLEGRO_UNIX 184 # define AGL_API(type, name, args) \ 185 ext->name = (AGL_##name##_t)aglXGetProcAddress((const GLubyte*)"gl" #name); \ 186 if (ext->name) { AGL_LOG(2,"gl" #name " successfully loaded\n"); } 187 # include "allegrogl/GLext/gl_ext_api.h" 189 # define AGL_API(type, name, args) \ 190 ext->name = (AGL_##name##_t)aglXGetProcAddress((const GLubyte*)"glX" #name); \ 191 if (ext->name) { AGL_LOG(2,"glX" #name " successfully loaded\n"); } 192 # include "allegrogl/GLext/glx_ext_api.h" 194 # elif defined ALLEGRO_MACOSX 195 # define AGL_API(type, name, args) \ 196 function = CFStringCreateWithCString(kCFAllocatorDefault, "gl" #name, \ 197 kCFStringEncodingASCII); \ 199 ext->name = (AGL_##name##_t)CFBundleGetFunctionPointerForName( \ 200 opengl_bundle_ref, function); \ 201 CFRelease(function); \ 203 if (ext->name) { AGL_LOG(2,"gl" #name " successfully loaded\n"); } 204 # include "allegrogl/GLext/gl_ext_api.h" 214 void __allegro_gl_set_extensions(AGL_EXT *ext) {
220 #define AGL_API(type, name, args) __agl##name = ext->name; 221 # include "allegrogl/GLext/gl_ext_api.h" 223 #ifdef ALLEGRO_WINDOWS 224 #define AGL_API(type, name, args) __awgl##name = ext->name; 225 # include "allegrogl/GLext/wgl_ext_api.h" 227 #elif defined ALLEGRO_UNIX 228 #define AGL_API(type, name, args) __aglX##name = ext->name; 229 # include "allegrogl/GLext/glx_ext_api.h" 237 void __allegro_gl_destroy_extensions(AGL_EXT *ext) {
240 if (ext == agl_extension_table) {
241 agl_extension_table = NULL;
253 int __allegro_gl_look_for_an_extension(AL_CONST
char *name,
254 AL_CONST GLubyte * extensions)
256 AL_CONST GLubyte *start;
257 GLubyte *where, *terminator;
260 where = (GLubyte *) strchr(name,
' ');
261 if (where || *name ==
'\0')
268 where = (GLubyte *) strstr((AL_CONST
char *) start, name);
271 terminator = where + strlen(name);
272 if (where == start || *(where - 1) ==
' ')
273 if (*terminator ==
' ' || *terminator ==
'\0')
282 #ifdef ALLEGRO_WINDOWS 283 static AGL_GetExtensionsStringARB_t __wglGetExtensionsStringARB = NULL;
284 static HDC __hdc = NULL;
285 #elif defined ALLEGRO_UNIX 310 if (!__allegro_gl_valid_context)
313 if (!glGetString(GL_EXTENSIONS))
316 ret = __allegro_gl_look_for_an_extension(extension,
317 glGetString(GL_EXTENSIONS));
319 #ifdef ALLEGRO_WINDOWS 320 if (!ret && strncmp(extension,
"WGL", 3) == 0) {
321 if (!__wglGetExtensionsStringARB || __hdc != __allegro_gl_hdc) {
322 __wglGetExtensionsStringARB = (AGL_GetExtensionsStringARB_t)
323 wglGetProcAddress(
"wglGetExtensionsStringARB");
324 __hdc = __allegro_gl_hdc;
326 if (__wglGetExtensionsStringARB) {
327 ret = __allegro_gl_look_for_an_extension(extension,
328 (AL_CONST GLubyte*)__wglGetExtensionsStringARB(__allegro_gl_hdc));
331 #elif defined ALLEGRO_UNIX 332 if (!ret && strncmp(extension,
"GLX", 3) == 0) {
334 ret = __allegro_gl_look_for_an_extension(extension,
335 (
const GLubyte*)glXQueryExtensionsString(_xwin.display,
375 #ifdef ALLEGRO_MACOSX 376 CFStringRef
function;
379 if (!__allegro_gl_valid_context)
382 #ifdef ALLEGROGL_GENERIC_DRIVER 386 symbol = AMesaGetProcAddress(name);
388 #elif defined ALLEGRO_WINDOWS 394 symbol = wglGetProcAddress(name);
395 #elif defined ALLEGRO_UNIX 396 if (aglXGetProcAddress) {
401 symbol = aglXGetProcAddress((
const GLubyte*)name);
403 #elif defined ALLEGROGL_HAVE_DYNAMIC_LINK 409 symbol = dlsym(__agl_handle, name);
412 #elif defined ALLEGRO_MACOSX 413 function = CFStringCreateWithCString(kCFAllocatorDefault, name,
414 kCFStringEncodingASCII);
416 symbol = CFBundleGetFunctionPointerForName(opengl_bundle_ref,
function);
428 #if defined ALLEGROGL_HAVE_DYNAMIC_LINK 429 if (!aglXGetProcAddress) {
430 TRACE(PREFIX_W
"get_proc_address: libdl::dlsym: %s\n",
435 TRACE(PREFIX_W
"get_proc_address : Unable to load symbol %s\n",
439 TRACE(PREFIX_I
"get_proc_address : Symbol %s successfully loaded\n",
449 static void __fill_in_info_struct(
const GLubyte *rendereru,
450 struct allegro_gl_info *info) {
451 const char *renderer = (
const char*)rendereru;
454 if (strstr(renderer,
"3Dfx/Voodoo")) {
457 else if (strstr(renderer,
"Matrox G200")) {
458 info->is_matrox_g200 = 1;
460 else if (strstr(renderer,
"RagePRO")) {
461 info->is_ati_rage_pro = 1;
463 else if (strstr(renderer,
"RADEON 7000")) {
464 info->is_ati_radeon_7000 = 1;
466 else if (strstr(renderer,
"Mesa DRI R200")) {
467 info->is_ati_r200_chip = 1;
470 if ((strncmp(renderer,
"3Dfx/Voodoo3 ", 13) == 0)
471 || (strncmp(renderer,
"3Dfx/Voodoo2 ", 13) == 0)
472 || (strncmp(renderer,
"3Dfx/Voodoo ", 12) == 0)) {
473 info->is_voodoo3_and_under = 1;
488 void __allegro_gl_manage_extensions(
void)
490 AL_CONST GLubyte *buf;
493 #ifdef ALLEGRO_MACOSX 499 AGL_LOG(1,
"OpenGL Extensions:\n");
500 __allegro_gl_print_extensions((AL_CONST
char*)
501 glGetString(GL_EXTENSIONS));
505 buf = gluGetString(GLU_VERSION);
506 TRACE(PREFIX_I
"GLU Version : %s\n", buf);
508 #ifdef ALLEGROGL_HAVE_DYNAMIC_LINK 510 __agl_handle = dlopen(
"libGL.so", RTLD_LAZY);
512 aglXGetProcAddress = (GLXGETPROCADDRESSARBPROC) dlsym(__agl_handle,
513 "glXGetProcAddressARB");
514 if (!aglXGetProcAddress) {
515 aglXGetProcAddress = (GLXGETPROCADDRESSARBPROC) dlsym(__agl_handle,
516 "glXGetProcAddress");
520 TRACE(PREFIX_W
"Failed to dlopen libGL.so : %s\n", dlerror());
522 TRACE(PREFIX_I
"glXGetProcAddress Extension: %s\n",
523 aglXGetProcAddress ?
"Supported" :
"Unsupported");
524 #elif defined ALLEGRO_UNIX 525 #ifdef ALLEGROGL_GLXGETPROCADDRESSARB 526 TRACE(PREFIX_I
"glXGetProcAddressARB Extension: supported\n");
528 TRACE(PREFIX_I
"glXGetProcAddress Extension: supported\n");
532 #ifdef ALLEGRO_MACOSX 533 bundle_url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
534 CFSTR(
"/System/Library/Frameworks/OpenGL.framework"),
535 kCFURLPOSIXPathStyle,
true);
536 opengl_bundle_ref = CFBundleCreate(kCFAllocatorDefault, bundle_url);
537 CFRelease(bundle_url);
540 __fill_in_info_struct(glGetString(GL_RENDERER), &allegro_gl_info);
543 agl_extension_table = __allegro_gl_create_extensions();
544 __allegro_gl_load_extensions(agl_extension_table);
545 __allegro_gl_set_extensions(agl_extension_table);
547 for (i = 0; i < 5; i++) {
548 __allegro_gl_texture_read_format[i] = -1;
549 __allegro_gl_texture_components[i] = GL_RGB;
551 __allegro_gl_texture_read_format[3] = GL_UNSIGNED_BYTE;
552 __allegro_gl_texture_read_format[4] = GL_UNSIGNED_BYTE;
553 __allegro_gl_texture_components[4] = GL_RGBA;
557 # define AGL_EXT(name, ver) { \ 558 allegro_gl_extensions_GL.name = \ 559 allegro_gl_is_extension_supported("GL_" #name) \ 560 || (allegro_gl_info.version >= ver && ver > 0); \ 562 # include "allegrogl/GLext/gl_ext_list.h" 566 # define AGL_EXT(name, ver) { \ 567 allegro_gl_extensions_GLX.name = \ 568 allegro_gl_is_extension_supported("GLX_" #name) \ 569 || (allegro_gl_info.version >= ver && ver > 0); \ 571 # include "allegrogl/GLext/glx_ext_list.h" 573 #elif defined ALLEGRO_WINDOWS 574 # define AGL_EXT(name, ver) { \ 575 allegro_gl_extensions_WGL.name = \ 576 allegro_gl_is_extension_supported("WGL_" #name) \ 577 || (allegro_gl_info.version >= ver && ver > 0); \ 579 # include "allegrogl/GLext/wgl_ext_list.h" 585 glGetIntegerv(GL_MAX_TEXTURE_UNITS,
586 (GLint*)&allegro_gl_info.num_texture_units);
589 allegro_gl_info.num_texture_units = 1;
593 glGetIntegerv(GL_MAX_TEXTURE_SIZE,
594 (GLint*)&allegro_gl_info.max_texture_size);
604 AGL_LOG(1,
"Packed Pixels formats available\n");
608 __allegro_gl_texture_read_format[0] = GL_UNSIGNED_BYTE_3_3_2;
609 __allegro_gl_texture_read_format[1] = GL_UNSIGNED_SHORT_5_5_5_1;
610 __allegro_gl_texture_read_format[2] = GL_UNSIGNED_SHORT_5_6_5;
618 {
const char *vendor = (
const char*)glGetString(GL_VENDOR);
619 if (strstr(vendor,
"NVIDIA Corporation")) {
625 else if (strstr(vendor,
"ATI Technologies")) {
626 if (!strstr((
const char*)glGetString(GL_EXTENSIONS),
627 "GL_ARB_texture_non_power_of_two")
628 && allegro_gl_info.version >= 2.0f) {
642 void __allegro_gl_print_extensions(AL_CONST
char * extension)
647 while (*extension !=
'\0') {
649 strncpy(buf, extension, 80);
650 while ((*start !=
' ') && (*start !=
'\0')) {
656 TRACE(PREFIX_I
"%s\n", buf);
662 void __allegro_gl_unmanage_extensions() {
663 __allegro_gl_destroy_extensions(agl_extension_table);
664 #ifdef ALLEGRO_MACOSX 665 CFRelease(opengl_bundle_ref);
667 #ifdef ALLEGROGL_HAVE_DYNAMIC_LINK 669 dlclose(__agl_handle);
float allegro_gl_opengl_version(void)
Returns the OpenGL version number of the client (the computer the program is running on)...
void * allegro_gl_get_proc_address(AL_CONST char *name)
Helper to get the address of an OpenGL symbol.
struct AGL_EXTENSION_LIST_GL allegro_gl_extensions_GL
List of OpenGL extensions supported by AllegroGL.
AGL_EXT * agl_extension_table
List of GLX extensions supported by AllegroGL.
int allegro_gl_is_extension_supported(AL_CONST char *extension)
This function is an helper to determine whether an OpenGL extension is available or not...
Main header file for AllegroGL.