Alexandre Julliard : opengl32: Get rid of the extension removal hack in wglGetProcAddress and clean up the tracing .

Alexandre Julliard julliard at winehq.org
Thu Nov 8 15:39:54 CST 2012


Module: wine
Branch: master
Commit: a3d896897cd4b8966b3b3fa4ba7aa1c1c60cbe02
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a3d896897cd4b8966b3b3fa4ba7aa1c1c60cbe02

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Nov  8 12:51:42 2012 +0100

opengl32: Get rid of the extension removal hack in wglGetProcAddress and clean up the tracing.

---

 dlls/opengl32/wgl.c |   97 ++++++++++++++++++---------------------------------
 1 files changed, 34 insertions(+), 63 deletions(-)

diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c
index fdb94e4..8fdbf29 100644
--- a/dlls/opengl32/wgl.c
+++ b/dlls/opengl32/wgl.c
@@ -738,79 +738,50 @@ static BOOL is_extension_supported(const char* extension)
 /***********************************************************************
  *		wglGetProcAddress (OPENGL32.@)
  */
-PROC WINAPI wglGetProcAddress(LPCSTR lpszProc)
+PROC WINAPI wglGetProcAddress( LPCSTR name )
 {
-  struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
-  void **func_ptr;
-  void *local_func;
-  OpenGL_extension  ext;
-  const OpenGL_extension *ext_ret;
-  struct wgl_handle *context = get_current_context_ptr();
+    struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
+    void **func_ptr;
+    OpenGL_extension  ext;
+    const OpenGL_extension *ext_ret;
 
-  TRACE("(%s)\n", lpszProc);
+    if (!name) return NULL;
 
-  if (lpszProc == NULL)
-    return NULL;
-
-  /* Without an active context opengl32 doesn't know to what
-   * driver it has to dispatch wglGetProcAddress.
-   */
-  if (!context)
-  {
-    WARN("No active WGL context found\n");
-    return NULL;
-  }
-
-  /* Search in the thunks to find the real name of the extension */
-  ext.name = lpszProc;
-  ext_ret = bsearch(&ext, extension_registry, extension_registry_size,
-                    sizeof(OpenGL_extension), compar);
-  if (!ext_ret)
-  {
-      WARN("Extension '%s' not defined in opengl32.dll's function table!\n", lpszProc);
-      return NULL;
-  }
-
-  func_ptr = (void **)&funcs->ext + (ext_ret - extension_registry);
-  if (!*func_ptr)
-  {
-    /* Check if the GL extension required by the function is available */
-    if(!is_extension_supported(ext_ret->extension)) {
-        WARN("Extension '%s' required by function '%s' not supported!\n", ext_ret->extension, lpszProc);
+    /* Without an active context opengl32 doesn't know to what
+     * driver it has to dispatch wglGetProcAddress.
+     */
+    if (!get_current_context_ptr())
+    {
+        WARN("No active WGL context found\n");
+        return NULL;
     }
 
-    local_func = context->funcs->wgl.p_wglGetProcAddress( ext_ret->name );
-
-    /* After that, look at the extensions defined in the Linux OpenGL library */
-    if (local_func == NULL) {
-      char buf[256];
-      void *ret = NULL;
-
-      /* Remove the last 3 letters (EXT, ARB, ...).
+    ext.name = name;
+    ext_ret = bsearch(&ext, extension_registry, extension_registry_size, sizeof(ext), compar);
+    if (!ext_ret)
+    {
+        WARN("Function %s unknown\n", name);
+        return NULL;
+    }
 
-	 I know that some extensions have more than 3 letters (MESA, NV,
-	 INTEL, ...), but this is only a stop-gap measure to fix buggy
-	 OpenGL drivers (moreover, it is only useful for old 1.0 apps
-	 that query the glBindTextureEXT extension).
-      */
-      memcpy(buf, ext_ret->name, strlen(ext_ret->name) - 3);
-      buf[strlen(ext_ret->name) - 3] = '\0';
-      TRACE("Extension not found in the Linux OpenGL library, checking against libGL bug with %s..\n", buf);
+    func_ptr = (void **)&funcs->ext + (ext_ret - extension_registry);
+    if (!*func_ptr)
+    {
+        void *driver_func = funcs->wgl.p_wglGetProcAddress( name );
 
-      ret = GetProcAddress(opengl32_handle, buf);
-      if (ret != NULL) {
-        TRACE("Found function in main OpenGL library (%p)!\n", ret);
-      } else {
-        WARN("Did not find function %s (%s) in your OpenGL library!\n", lpszProc, ext_ret->name);
-      }
+        if (!is_extension_supported(ext_ret->extension))
+            WARN("Extension %s required for %s not supported\n", ext_ret->extension, name);
 
-      return ret;
+        if (driver_func == NULL)
+        {
+            WARN("Function %s not supported by driver\n", name);
+            return NULL;
+        }
+        *func_ptr = driver_func;
     }
-    *func_ptr = local_func;
-  }
 
-  TRACE("returning function (%p)\n", ext_ret->func);
-  return ext_ret->func;
+    TRACE("returning %s -> %p\n", name, ext_ret->func);
+    return ext_ret->func;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list