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