Alexandre Julliard : opengl32: Add a helper function to build the extension list, and do it only when requested.
Alexandre Julliard
julliard at winehq.org
Tue Jun 26 13:34:14 CDT 2012
Module: wine
Branch: master
Commit: 370a8c10d239375c737d59cf15c96079f1115ec1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=370a8c10d239375c737d59cf15c96079f1115ec1
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jun 26 16:49:43 2012 +0200
opengl32: Add a helper function to build the extension list, and do it only when requested.
---
dlls/opengl32/wgl.c | 99 ++++++++++++++++++++++++++-------------------------
1 files changed, 50 insertions(+), 49 deletions(-)
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c
index 6d94716..f3b4405 100644
--- a/dlls/opengl32/wgl.c
+++ b/dlls/opengl32/wgl.c
@@ -82,9 +82,6 @@ void (*wine_tsx11_unlock_ptr)(void) = NULL;
static HMODULE opengl32_handle;
static void* libglu_handle = NULL;
-static char* internal_gl_disabled_extensions = NULL;
-static char* internal_gl_extensions = NULL;
-
const GLubyte * WINAPI wine_glGetString( GLenum name );
/* internal GDI functions */
@@ -1000,11 +997,58 @@ void WINAPI wine_glFlush( void )
wine_wgl.p_wglFlush();
}
+/* build the extension string by filtering out the disabled extensions */
+static char *build_gl_extensions( const char *extensions )
+{
+ char *p, *str, *disabled = NULL;
+ const char *end;
+ HKEY hkey;
+
+ TRACE( "GL_EXTENSIONS:\n" );
+
+ if (!extensions) extensions = "";
+
+ /* @@ Wine registry key: HKCU\Software\Wine\OpenGL */
+ if (!RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\OpenGL", &hkey ))
+ {
+ DWORD size, ret = RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, NULL, &size );
+ if (!ret && (disabled = HeapAlloc( GetProcessHeap(), 0, size )))
+ ret = RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, (BYTE *)disabled, &size );
+ RegCloseKey( hkey );
+ if (ret) *disabled = 0;
+ }
+
+ if ((str = HeapAlloc( GetProcessHeap(), 0, strlen(extensions) + 2 )))
+ {
+ p = str;
+ for (;;)
+ {
+ while (*extensions == ' ') extensions++;
+ if (!*extensions) break;
+ if (!(end = strchr( extensions, ' ' ))) end = extensions + strlen( extensions );
+ memcpy( p, extensions, end - extensions );
+ p[end - extensions] = 0;
+ if (!has_extension( disabled, p ))
+ {
+ TRACE("++ %s\n", p );
+ p += end - extensions;
+ *p++ = ' ';
+ }
+ else TRACE("-- %s (disabled by config)\n", p );
+ extensions = end;
+ }
+ *p = 0;
+ }
+ HeapFree( GetProcessHeap(), 0, disabled );
+ return str;
+}
+
/***********************************************************************
* glGetString (OPENGL32.@)
*/
const GLubyte * WINAPI wine_glGetString( GLenum name )
{
+ static const char *gl_extensions;
const GLubyte *ret;
const char* GL_Extensions = NULL;
@@ -1020,42 +1064,13 @@ const GLubyte * WINAPI wine_glGetString( GLenum name )
return ret;
}
- if (NULL == internal_gl_extensions) {
+ if (!gl_extensions) {
ENTER_GL();
GL_Extensions = (const char *) glGetString(GL_EXTENSIONS);
-
- if (GL_Extensions)
- {
- size_t len = strlen(GL_Extensions);
- internal_gl_extensions = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len + 2);
-
- TRACE("GL_EXTENSIONS reported:\n");
- while (*GL_Extensions != 0x00) {
- const char* Start = GL_Extensions;
- char ThisExtn[256];
-
- while (*GL_Extensions != ' ' && *GL_Extensions != 0x00) {
- GL_Extensions++;
- }
- memcpy(ThisExtn, Start, (GL_Extensions - Start));
- ThisExtn[GL_Extensions - Start] = 0;
- TRACE("- %s:", ThisExtn);
-
- /* test if supported API is disabled by config */
- if (!has_extension(internal_gl_disabled_extensions, ThisExtn)) {
- strcat(internal_gl_extensions, " ");
- strcat(internal_gl_extensions, ThisExtn);
- TRACE(" active\n");
- } else {
- TRACE(" deactived (by config)\n");
- }
-
- if (*GL_Extensions == ' ') GL_Extensions++;
- }
- }
+ gl_extensions = build_gl_extensions( GL_Extensions );
LEAVE_GL();
}
- return (const GLubyte *) internal_gl_extensions;
+ return (const GLubyte *)gl_extensions;
}
/***********************************************************************
@@ -1079,8 +1094,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH wglSwapBuffers( HDC hdc )
static BOOL process_attach(void)
{
HMODULE mod_x11, mod_gdi32;
- DWORD size;
- HKEY hkey = 0;
GetDesktopWindow(); /* make sure winex11 is loaded (FIXME) */
mod_x11 = GetModuleHandleA( "winex11.drv" );
@@ -1109,16 +1122,6 @@ static BOOL process_attach(void)
wine_wgl.p_wglGetCurrentDC = (void *)wine_wgl.p_wglGetProcAddress("wglGetCurrentDC");
wine_wgl.p_wglGetIntegerv = (void *)wine_wgl.p_wglGetProcAddress("wglGetIntegerv");
wine_wgl.p_wglShareLists = (void *)wine_wgl.p_wglGetProcAddress("wglShareLists");
-
- if (!RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\OpenGL", &hkey)) {
- if (!RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, NULL, &size)) {
- internal_gl_disabled_extensions = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
- RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, (LPBYTE)internal_gl_disabled_extensions, &size);
- TRACE("found DisabledExtensions=%s\n", debugstr_a(internal_gl_disabled_extensions));
- }
- RegCloseKey(hkey);
- }
-
return TRUE;
}
@@ -1128,8 +1131,6 @@ static BOOL process_attach(void)
static void process_detach(void)
{
if (libglu_handle) wine_dlclose(libglu_handle, NULL, 0);
- HeapFree(GetProcessHeap(), 0, internal_gl_extensions);
- HeapFree(GetProcessHeap(), 0, internal_gl_disabled_extensions);
}
/***********************************************************************
More information about the wine-cvs
mailing list