Roderick Colenbrander : wgl: Move part of wglGetProcAddress to gdi32.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Oct 27 05:49:26 CDT 2006
Module: wine
Branch: master
Commit: 88ad69f9bdf60a5ad0f0f9db9da43a41f78cd1d9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=88ad69f9bdf60a5ad0f0f9db9da43a41f78cd1d9
Author: Roderick Colenbrander <thunderbird2k at gmx.net>
Date: Thu Oct 26 23:11:07 2006 +0200
wgl: Move part of wglGetProcAddress to gdi32.
---
dlls/gdi32/driver.c | 1 +
dlls/gdi32/gdi32.spec | 1 +
dlls/gdi32/gdi_private.h | 1 +
dlls/gdi32/opengl.c | 25 ++++++++++++++++++++++
dlls/opengl32/wgl.c | 42 ++++++++++--------------------------
dlls/winex11.drv/opengl.c | 38 ++++++++++++++++++++++-----------
dlls/winex11.drv/winex11.drv.spec | 1 -
7 files changed, 65 insertions(+), 44 deletions(-)
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 5b959e7..a751c72 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -198,6 +198,7 @@ #define GET_FUNC(name) driver->funcs.p##
/* OpenGL32 */
GET_FUNC(wglCreateContext);
GET_FUNC(wglDeleteContext);
+ GET_FUNC(wglGetProcAddress);
GET_FUNC(wglMakeCurrent);
GET_FUNC(wglShareLists);
GET_FUNC(wglUseFontBitmapsA);
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index cf08bdf..cea9a5c 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -502,6 +502,7 @@ #
@ stdcall wglDeleteContext(long)
@ stdcall wglGetCurrentContext()
@ stdcall wglGetCurrentDC()
+@ stdcall -private wglGetProcAddress(str)
@ stdcall wglMakeCurrent(long long)
@ stdcall wglShareLists(long long)
@ stdcall wglUseFontBitmapsA(long long long long)
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 725ed8c..d173151 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -186,6 +186,7 @@ typedef struct tagDC_FUNCS
/* OpenGL32 */
HGLRC (*pwglCreateContext)(PHYSDEV);
BOOL (*pwglDeleteContext)(HGLRC);
+ PROC (*pwglGetProcAddress)(LPCSTR);
BOOL (*pwglMakeCurrent)(PHYSDEV, HGLRC);
BOOL (*pwglShareLists)(HGLRC hglrc1, HGLRC hglrc2);
BOOL (*pwglUseFontBitmapsA)(PHYSDEV, DWORD, DWORD, DWORD);
diff --git a/dlls/gdi32/opengl.c b/dlls/gdi32/opengl.c
index 6d97025..2be485e 100644
--- a/dlls/gdi32/opengl.c
+++ b/dlls/gdi32/opengl.c
@@ -221,3 +221,28 @@ BOOL WINAPI wglUseFontBitmapsW(HDC hdc,
GDI_ReleaseObj( hdc);
return ret;
}
+
+/***********************************************************************
+ * Internal wglGetProcAddress for retrieving WGL extensions
+ */
+PROC WINAPI wglGetProcAddress(LPCSTR func)
+{
+ PROC ret = NULL;
+ DC * dc = NULL;
+
+ if(!func)
+ return NULL;
+
+ TRACE("func: '%p'\n", func);
+
+ /* Retrieve the global hDC to get access to the driver. */
+ dc = OPENGL_GetDefaultDC();
+ if (!dc) return FALSE;
+
+ if (!dc->funcs->pwglGetProcAddress) FIXME(" :stub\n");
+ else ret = dc->funcs->pwglGetProcAddress(func);
+
+ GDI_ReleaseObj(default_hdc);
+
+ return ret;
+}
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c
index 3a4f549..5912adf 100644
--- a/dlls/opengl32/wgl.c
+++ b/dlls/opengl32/wgl.c
@@ -79,8 +79,6 @@ static Display *default_display; /* dis
static HMODULE opengl32_handle;
-static void* (*p_glXGetProcAddressARB)(const GLubyte *);
-
static char internal_gl_disabled_extensions[512];
static char* internal_gl_extensions = NULL;
@@ -193,11 +191,6 @@ PROC WINAPI wglGetProcAddress(LPCSTR lp
return local_func;
}
- if (p_glXGetProcAddressARB == NULL) {
- ERR("Warning : dynamic GL extension loading not supported by native GL library.\n");
- return NULL;
- }
-
/* After that, search in the thunks to find the real name of the extension */
ext.name = lpszProc;
ext_ret = (const OpenGL_extension *) bsearch(&ext, extension_registry,
@@ -205,13 +198,11 @@ PROC WINAPI wglGetProcAddress(LPCSTR lp
/* If nothing was found, we are looking for a WGL extension */
if (ext_ret == NULL) {
+ WARN("Extension '%s' not defined in opengl32.dll's function table!\n", lpszProc);
return wine_wgl.p_wglGetProcAddress(lpszProc);
} else { /* We are looking for an OpenGL extension */
- const char *glx_name = ext_ret->glx_name ? ext_ret->glx_name : ext_ret->name;
- ENTER_GL();
- local_func = p_glXGetProcAddressARB( (const GLubyte*)glx_name);
- LEAVE_GL();
-
+ local_func = wine_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];
@@ -224,15 +215,15 @@ PROC WINAPI wglGetProcAddress(LPCSTR lp
OpenGL drivers (moreover, it is only useful for old 1.0 apps
that query the glBindTextureEXT extension).
*/
- memcpy(buf, glx_name, strlen(glx_name) - 3);
- buf[strlen(glx_name) - 3] = '\0';
+ 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);
+ TRACE(" found function in main OpenGL library (%p) !\n", ret);
} else {
- WARN("Did not find function %s (%s) in your OpenGL library !\n", lpszProc, glx_name);
+ WARN("Did not find function %s (%s) in your OpenGL library !\n", lpszProc, ext_ret->name);
}
return ret;
@@ -598,24 +589,23 @@ static BOOL process_attach(void)
XVisualInfo *vis = NULL;
Window root = (Window)GetPropA( GetDesktopWindow(), "__wine_x11_whole_window" );
HMODULE mod = GetModuleHandleA( "winex11.drv" );
- void *opengl_handle;
+ HMODULE mod_gdi32 = GetModuleHandleA( "gdi32.dll" );
DWORD size = sizeof(internal_gl_disabled_extensions);
HKEY hkey = 0;
- if (!root || !mod)
+ if (!root || !mod || !mod_gdi32)
{
- ERR("X11DRV not loaded. Cannot create default context.\n");
+ ERR("X11DRV or GDI32 not loaded. Cannot create default context.\n");
return FALSE;
}
wine_tsx11_lock_ptr = (void *)GetProcAddress( mod, "wine_tsx11_lock" );
wine_tsx11_unlock_ptr = (void *)GetProcAddress( mod, "wine_tsx11_unlock" );
- /* Load WGL function pointers from winex11.drv */
- wine_wgl.p_wglGetProcAddress = (void *)GetProcAddress(mod, "wglGetProcAddress");
+ wine_wgl.p_wglGetProcAddress = (void *)GetProcAddress(mod_gdi32, "wglGetProcAddress");
/* Interal WGL function */
- wine_wgl.p_wglGetIntegerv = (void *)GetProcAddress(mod, "wglGetIntegerv");
+ wine_wgl.p_wglGetIntegerv = (void *)wine_wgl.p_wglGetProcAddress("wglGetIntegerv");
hdc = GetDC(0);
default_display = get_display( hdc );
@@ -651,14 +641,6 @@ static BOOL process_attach(void)
XFree(vis);
LEAVE_GL();
- opengl_handle = wine_dlopen(SONAME_LIBGL, RTLD_NOW|RTLD_GLOBAL, NULL, 0);
- if (opengl_handle != NULL) {
- p_glXGetProcAddressARB = wine_dlsym(opengl_handle, "glXGetProcAddressARB", NULL, 0);
- wine_dlclose(opengl_handle, NULL, 0);
- if (p_glXGetProcAddressARB == NULL)
- TRACE("could not find glXGetProcAddressARB in libGL.\n");
- }
-
internal_gl_disabled_extensions[0] = 0;
if (!RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Wine\\OpenGL", &hkey)) {
if (!RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, (LPBYTE)internal_gl_disabled_extensions, &size)) {
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index bdd08c4..046c57b 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -1299,19 +1299,24 @@ PROC X11DRV_wglGetProcAddress(LPCSTR lps
if (padding < 0)
padding = 0;
- TRACE("('%s'):%*s", lpszProc, padding, " ");
- for (i = 0; i < WineGLExtensionListSize; ++i) {
- ext = WineGLExtensionList[i];
- for (j = 0; ext->extEntryPoints[j].funcName; ++j) {
- if (strcmp(ext->extEntryPoints[j].funcName, lpszProc) == 0) {
- TRACE("(%p) - WineGL\n", ext->extEntryPoints[j].funcAddress);
- return ext->extEntryPoints[j].funcAddress;
+ /* Check the table of WGL extensions to see if we need to return a WGL extension
+ * or a function pointer to a native OpenGL function. */
+ if(strncmp(lpszProc, "wgl", 3) != 0) {
+ return pglXGetProcAddressARB((GLubyte*)lpszProc);
+ } else {
+ TRACE("('%s'):%*s", lpszProc, padding, " ");
+ for (i = 0; i < WineGLExtensionListSize; ++i) {
+ ext = WineGLExtensionList[i];
+ for (j = 0; ext->extEntryPoints[j].funcName; ++j) {
+ if (strcmp(ext->extEntryPoints[j].funcName, lpszProc) == 0) {
+ TRACE("(%p) - WineGL\n", ext->extEntryPoints[j].funcAddress);
+ return ext->extEntryPoints[j].funcAddress;
+ }
}
}
}
ERR("(%s) - not found\n", lpszProc);
-
return NULL;
}
@@ -2457,6 +2462,15 @@ static BOOL register_extension(const Win
return TRUE;
}
+static const WineGLExtension WGL_internal_functions =
+{
+ "",
+ {
+ { "wglGetIntegerv", X11DRV_wglGetIntegerv },
+ }
+};
+
+
static const WineGLExtension WGL_ARB_extensions_string =
{
"WGL_ARB_extensions_string",
@@ -2536,6 +2550,9 @@ static void X11DRV_WineGL_LoadExtensions
{
WineGLInfo.wglExtensions[0] = 0;
+ /* Load Wine internal functions */
+ register_extension(&WGL_internal_functions);
+
/* ARB Extensions */
register_extension(&WGL_ARB_extensions_string);
@@ -2795,11 +2812,6 @@ BOOL WINAPI X11DRV_wglUseFontBitmapsW(HD
return FALSE;
}
-/* WGL helper function which handles differences in glGetIntegerv from WGL and GLX */
-void X11DRV_wglGetIntegerv(int pname, int* params) {
- ERR_(opengl)("No OpenGL support compiled in.\n");
-}
-
XVisualInfo *X11DRV_setup_opengl_visual( Display *display )
{
return NULL;
diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec
index a0fef44..56c2c1a 100644
--- a/dlls/winex11.drv/winex11.drv.spec
+++ b/dlls/winex11.drv/winex11.drv.spec
@@ -133,7 +133,6 @@ # XIM
# OpenGL
@ cdecl wglCreateContext(long) X11DRV_wglCreateContext
@ cdecl wglDeleteContext(long) X11DRV_wglDeleteContext
-@ cdecl wglGetIntegerv(long ptr) X11DRV_wglGetIntegerv
@ cdecl wglGetProcAddress(ptr) X11DRV_wglGetProcAddress
@ cdecl wglMakeCurrent(long long) X11DRV_wglMakeCurrent
@ cdecl wglShareLists(long long) X11DRV_wglShareLists
More information about the wine-cvs
mailing list