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

This commit is contained in:
Alexandre Julliard 2012-11-08 12:51:42 +01:00
parent 449deda62f
commit a3d896897c
1 changed files with 37 additions and 66 deletions

View File

@ -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, ...).
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);
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);
}
return ret;
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;
}
*func_ptr = local_func;
}
TRACE("returning function (%p)\n", ext_ret->func);
return ext_ret->func;
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))
WARN("Extension %s required for %s not supported\n", ext_ret->extension, name);
if (driver_func == NULL)
{
WARN("Function %s not supported by driver\n", name);
return NULL;
}
*func_ptr = driver_func;
}
TRACE("returning %s -> %p\n", name, ext_ret->func);
return ext_ret->func;
}
/***********************************************************************