/* Support for window-specific OpenGL extensions. * * Copyright (c) 2004 Lionel Ulmer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config.h" #include "wine/port.h" #include #include #include #include "windef.h" #include "winbase.h" #include "winuser.h" #include "winerror.h" #include "wgl.h" #include "wgl_ext.h" #include "opengl_ext.h" #include "wine/library.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(opengl); /* Some WGL extensions... */ static const char *WGL_extensions_base = "WGL_ARB_extensions_string WGL_EXT_extensions_string"; static char *WGL_extensions = NULL; /* Extensions-query functions */ BOOL query_function_pbuffers(const char *gl_version, const char *gl_extensions, const char *glx_extensions, const char *server_glx_extensions, const char *client_glx_extensions) { return FALSE; } /*********************************************************************** * wglGetExtensionsStringEXT(OPENGL32.@) */ const char * WINAPI wglGetExtensionsStringEXT(void) { TRACE("() returning \"%s\"\n", WGL_extensions); return WGL_extensions; } /*********************************************************************** * wglGetExtensionsStringARB(OPENGL32.@) */ const char * WINAPI wglGetExtensionsStringARB(HDC hdc) { TRACE("() returning \"%s\"\n", WGL_extensions); return WGL_extensions; } static int swap_interval = 1; /*********************************************************************** * wglSwapIntervalEXT(OPENGL32.@) */ BOOL WINAPI wglSwapIntervalEXT(int interval) { FIXME("(%d),stub!\n", interval); swap_interval = interval; return TRUE; } /*********************************************************************** * wglGetSwapIntervalEXT(OPENGL32.@) */ int WINAPI wglGetSwapIntervalEXT(VOID) { FIXME("(),stub!\n"); return swap_interval; } static const struct { const char *name; BOOL (*query_function)(const char *gl_version, const char *gl_extensions, const char *glx_extensions, const char *server_glx_extensions, const char *client_glx_extensions); } extension_list[] = { { "WGL_ARB_pbuffer", query_function_pbuffers } }; /* Used to initialize the WGL extension string at DLL loading */ void wgl_ext_initialize_extensions(Display *display, int screen) { int size = strlen(WGL_extensions_base); const char *glx_extensions = glXQueryExtensionsString(display, screen); const char *server_glx_extensions = glXQueryServerString(display, screen, GLX_EXTENSIONS); const char *client_glx_extensions = glXGetClientString(display, GLX_EXTENSIONS); const char *gl_extensions = (const char *) glGetString(GL_EXTENSIONS); const char *gl_version = (const char *) glGetString(GL_VERSION); int i; TRACE("GL version : %s.\n", debugstr_a(gl_version)); TRACE("GL exts : %s.\n", debugstr_a(gl_extensions)); TRACE("GLX exts : %s.\n", debugstr_a(glx_extensions)); TRACE("Server GLX exts : %s.\n", debugstr_a(server_glx_extensions)); TRACE("Client GLX exts : %s.\n", debugstr_a(client_glx_extensions)); for (i = 0; i < (sizeof(extension_list) / sizeof(extension_list[0])); i++) { if (extension_list[i].query_function(gl_version, gl_extensions, glx_extensions, server_glx_extensions, client_glx_extensions)) { size += strlen(extension_list[i].name) + 1; } } /* For the moment, only 'base' extensions are supported. */ WGL_extensions = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size + 1); if (WGL_extensions == NULL) { WGL_extensions = (char *) WGL_extensions_base; } else { strcpy(WGL_extensions, WGL_extensions_base); for (i = 0; i < (sizeof(extension_list) / sizeof(extension_list[0])); i++) { if (extension_list[i].query_function(gl_version, gl_extensions, glx_extensions, server_glx_extensions, client_glx_extensions)) { strcat(WGL_extensions, " "); strcat(WGL_extensions, extension_list[i].name); } } } TRACE("Supporting following WGL extensions : %s.\n", debugstr_a(WGL_extensions)); } void wgl_ext_finalize_extensions(void) { if (WGL_extensions != WGL_extensions_base) { HeapFree(GetProcessHeap(), 0, WGL_extensions); } } /* Putting this at the end to prevent having to write the prototypes :-) */ WGL_extension wgl_extension_registry[] = { { "wglGetExtensionsStringARB", (void *) wglGetExtensionsStringARB, NULL, NULL}, { "wglGetExtensionsStringEXT", (void *) wglGetExtensionsStringEXT, NULL, NULL}, { "wglGetSwapIntervalEXT", (void *) wglSwapIntervalEXT, NULL, NULL}, { "wglSwapIntervalEXT", (void *) wglSwapIntervalEXT, NULL, NULL} }; int wgl_extension_registry_size = sizeof(wgl_extension_registry) / sizeof(wgl_extension_registry[0]);