1 /* Support for window-specific OpenGL extensions.
3 * Copyright (c) 2004 Lionel Ulmer
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "wine/port.h"
34 #include "opengl_ext.h"
35 #include "wine/library.h"
36 #include "wine/debug.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(opengl);
40 /* Some WGL extensions... */
41 static const char *WGL_extensions_base = "WGL_ARB_extensions_string WGL_EXT_extensions_string";
42 static char *WGL_extensions = NULL;
44 /* Extensions-query functions */
45 BOOL query_function_pbuffers(const char *gl_version, const char *gl_extensions, const char *glx_extensions,
46 const char *server_glx_extensions, const char *client_glx_extensions)
51 /***********************************************************************
52 * wglGetExtensionsStringEXT(OPENGL32.@)
54 const char * WINAPI wglGetExtensionsStringEXT(void) {
55 TRACE("() returning \"%s\"\n", WGL_extensions);
57 return WGL_extensions;
60 /***********************************************************************
61 * wglGetExtensionsStringARB(OPENGL32.@)
63 const char * WINAPI wglGetExtensionsStringARB(HDC hdc) {
64 TRACE("() returning \"%s\"\n", WGL_extensions);
66 return WGL_extensions;
69 static int swap_interval = 1;
71 /***********************************************************************
72 * wglSwapIntervalEXT(OPENGL32.@)
74 BOOL WINAPI wglSwapIntervalEXT(int interval) {
75 FIXME("(%d),stub!\n", interval);
77 swap_interval = interval;
81 /***********************************************************************
82 * wglGetSwapIntervalEXT(OPENGL32.@)
84 int WINAPI wglGetSwapIntervalEXT(VOID) {
91 BOOL (*query_function)(const char *gl_version, const char *gl_extensions, const char *glx_extensions,
92 const char *server_glx_extensions, const char *client_glx_extensions);
93 } extension_list[] = {
94 { "WGL_ARB_pbuffer", query_function_pbuffers }
97 /* Used to initialize the WGL extension string at DLL loading */
98 void wgl_ext_initialize_extensions(Display *display, int screen)
100 int size = strlen(WGL_extensions_base);
101 const char *glx_extensions = glXQueryExtensionsString(display, screen);
102 const char *server_glx_extensions = glXQueryServerString(display, screen, GLX_EXTENSIONS);
103 const char *client_glx_extensions = glXGetClientString(display, GLX_EXTENSIONS);
104 const char *gl_extensions = (const char *) glGetString(GL_EXTENSIONS);
105 const char *gl_version = (const char *) glGetString(GL_VERSION);
108 TRACE("GL version : %s.\n", debugstr_a(gl_version));
109 TRACE("GL exts : %s.\n", debugstr_a(gl_extensions));
110 TRACE("GLX exts : %s.\n", debugstr_a(glx_extensions));
111 TRACE("Server GLX exts : %s.\n", debugstr_a(server_glx_extensions));
112 TRACE("Client GLX exts : %s.\n", debugstr_a(client_glx_extensions));
114 for (i = 0; i < (sizeof(extension_list) / sizeof(extension_list[0])); i++) {
115 if (extension_list[i].query_function(gl_version, gl_extensions, glx_extensions,
116 server_glx_extensions, client_glx_extensions)) {
117 size += strlen(extension_list[i].name) + 1;
121 /* For the moment, only 'base' extensions are supported. */
122 WGL_extensions = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size + 1);
123 if (WGL_extensions == NULL) {
124 WGL_extensions = (char *) WGL_extensions_base;
126 strcpy(WGL_extensions, WGL_extensions_base);
127 for (i = 0; i < (sizeof(extension_list) / sizeof(extension_list[0])); i++) {
128 if (extension_list[i].query_function(gl_version, gl_extensions, glx_extensions,
129 server_glx_extensions, client_glx_extensions)) {
130 strcat(WGL_extensions, " ");
131 strcat(WGL_extensions, extension_list[i].name);
136 TRACE("Supporting following WGL extensions : %s.\n", debugstr_a(WGL_extensions));
139 void wgl_ext_finalize_extensions(void)
141 if (WGL_extensions != WGL_extensions_base) {
142 HeapFree(GetProcessHeap(), 0, WGL_extensions);
146 /* Putting this at the end to prevent having to write the prototypes :-) */
147 WGL_extension wgl_extension_registry[] = {
148 { "wglGetExtensionsStringARB", (void *) wglGetExtensionsStringARB, NULL, NULL},
149 { "wglGetExtensionsStringEXT", (void *) wglGetExtensionsStringEXT, NULL, NULL},
150 { "wglGetSwapIntervalEXT", (void *) wglSwapIntervalEXT, NULL, NULL},
151 { "wglSwapIntervalEXT", (void *) wglSwapIntervalEXT, NULL, NULL}
153 int wgl_extension_registry_size = sizeof(wgl_extension_registry) / sizeof(wgl_extension_registry[0]);