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