opengl32: Store driver function when looking up alternative function. (resend)

Sebastian Lackner sebastian at fds-team.de
Mon Dec 21 10:01:33 CST 2015


Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
 dlls/opengl32/wgl.c |   65 ++++++++++++++++++++++++++++++++--------------------
 1 file changed, 40 insertions(+), 25 deletions(-)

diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c
index f3f78ef..465602b 100644
--- a/dlls/opengl32/wgl.c
+++ b/dlls/opengl32/wgl.c
@@ -842,6 +842,44 @@ static BOOL is_extension_supported(const char* extension)
     return FALSE;
 }
 
+/* Lookup extension registry by name */
+static const OpenGL_extension *lookup_extension_registry( const char *name )
+{
+    OpenGL_extension ext;
+    ext.name = name;
+    return bsearch( &ext, extension_registry, extension_registry_size, sizeof(ext), compar );
+}
+
+/* Lookup driver function by name */
+static void *get_driver_proc_address( const char *name, const OpenGL_extension *ext_ret )
+{
+    struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
+    void *driver_func = funcs->wgl.p_wglGetProcAddress( name );
+
+    if (!is_extension_supported( ext_ret->extension ))
+    {
+        unsigned int i;
+        static const struct { const char *name, *alt; } alternatives[] =
+        {
+            { "glCopyTexSubImage3DEXT", "glCopyTexSubImage3D" },     /* needed by RuneScape */
+            { "glVertexAttribDivisor", "glVertexAttribDivisorARB"},  /* needed by Caffeine */
+        };
+
+        WARN("Extension %s required for %s not supported\n", ext_ret->extension, name);
+        driver_func = NULL;
+
+        for (i = 0; i < sizeof(alternatives)/sizeof(alternatives[0]) && !driver_func; i++)
+        {
+            if (strcmp( name, alternatives[i].name )) continue;
+            WARN("Trying alternative %s for %s\n", alternatives[i].alt, name );
+            if (!(ext_ret = lookup_extension_registry( alternatives[i].alt ))) continue;
+            driver_func = get_driver_proc_address( alternatives[i].alt, ext_ret );
+        }
+    }
+
+    return driver_func;
+}
+
 /***********************************************************************
  *		wglGetProcAddress (OPENGL32.@)
  */
@@ -849,7 +887,6 @@ PROC WINAPI wglGetProcAddress( LPCSTR name )
 {
     struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
     void **func_ptr;
-    OpenGL_extension  ext;
     const OpenGL_extension *ext_ret;
 
     if (!name) return NULL;
@@ -863,8 +900,7 @@ PROC WINAPI wglGetProcAddress( LPCSTR name )
         return NULL;
     }
 
-    ext.name = name;
-    ext_ret = bsearch(&ext, extension_registry, extension_registry_size, sizeof(ext), compar);
+    ext_ret = lookup_extension_registry( name );
     if (!ext_ret)
     {
         WARN("Function %s unknown\n", name);
@@ -874,28 +910,7 @@ PROC WINAPI wglGetProcAddress( LPCSTR name )
     func_ptr = (void **)&funcs->ext + (ext_ret - extension_registry);
     if (!*func_ptr)
     {
-        void *driver_func = funcs->wgl.p_wglGetProcAddress( name );
-
-        if (!is_extension_supported(ext_ret->extension))
-        {
-            unsigned int i;
-            static const struct { const char *name, *alt; } alternatives[] =
-            {
-                { "glCopyTexSubImage3DEXT", "glCopyTexSubImage3D" },     /* needed by RuneScape */
-                { "glVertexAttribDivisor", "glVertexAttribDivisorARB"},  /* needed by Caffeine */
-            };
-
-            for (i = 0; i < sizeof(alternatives)/sizeof(alternatives[0]); i++)
-            {
-                if (strcmp( name, alternatives[i].name )) continue;
-                WARN("Extension %s required for %s not supported, trying %s\n",
-                    ext_ret->extension, name, alternatives[i].alt );
-                return wglGetProcAddress( alternatives[i].alt );
-            }
-            WARN("Extension %s required for %s not supported\n", ext_ret->extension, name);
-            return NULL;
-        }
-
+        void *driver_func = get_driver_proc_address( name, ext_ret );
         if (driver_func == NULL)
         {
             WARN("Function %s not supported by driver\n", name);
-- 
2.6.4



More information about the wine-patches mailing list