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