Module: wine Branch: master Commit: df91c7bc833780169695221b564ee71b76ffe112 URL: http://source.winehq.org/git/wine.git/?a=commit;h=df91c7bc833780169695221b56...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Jul 16 23:56:55 2012 +0200
opengl32: Redirect standard OpenGL functions through the TEB function table.
---
dlls/opengl32/make_opengl | 3 -- dlls/opengl32/opengl_norm.c | 27 ++++++++++++++++++++++ dlls/opengl32/wgl.c | 53 +------------------------------------------ dlls/winex11.drv/opengl.c | 42 +++++++++++++++------------------ 4 files changed, 47 insertions(+), 78 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 9773a4a..af309ec 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -235,9 +235,6 @@ sub GenerateThunk($$$)
return "" if $func_ref->[0] eq "glDebugEntry"; return "" if $func_ref->[0] eq "glGetString"; - return "" if $func_ref->[0] eq "glGetIntegerv"; - return "" if $func_ref->[0] eq "glFinish"; - return "" if $func_ref->[0] eq "glFlush";
# If for opengl_norm.c, generate a nice heading otherwise Patrik won't be happy :-) # Patrik says: Well I would be even happier if a (OPENGL32.@) was added as well. Done. :-) diff --git a/dlls/opengl32/opengl_norm.c b/dlls/opengl32/opengl_norm.c index 66efce7..6d9cf65 100644 --- a/dlls/opengl32/opengl_norm.c +++ b/dlls/opengl32/opengl_norm.c @@ -812,6 +812,24 @@ void WINAPI wine_glFeedbackBuffer( GLsizei size, GLenum type, GLfloat* buffer ) }
/*********************************************************************** + * glFinish (OPENGL32.@) + */ +void WINAPI wine_glFinish( void ) { + const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; + TRACE("()\n"); + funcs->gl.p_glFinish( ); +} + +/*********************************************************************** + * glFlush (OPENGL32.@) + */ +void WINAPI wine_glFlush( void ) { + const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; + TRACE("()\n"); + funcs->gl.p_glFlush( ); +} + +/*********************************************************************** * glFogf (OPENGL32.@) */ void WINAPI wine_glFogf( GLenum pname, GLfloat param ) { @@ -929,6 +947,15 @@ void WINAPI wine_glGetFloatv( GLenum pname, GLfloat* params ) { }
/*********************************************************************** + * glGetIntegerv (OPENGL32.@) + */ +void WINAPI wine_glGetIntegerv( GLenum pname, GLint* params ) { + const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; + TRACE("(%d, %p)\n", pname, params ); + funcs->gl.p_glGetIntegerv( pname, params ); +} + +/*********************************************************************** * glGetLightfv (OPENGL32.@) */ void WINAPI wine_glGetLightfv( GLenum light, GLenum pname, GLfloat* params ) { diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 8acc173..7a1b1d2 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -47,14 +47,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(wgl); WINE_DECLARE_DEBUG_CHANNEL(opengl);
-static struct -{ - /* internal WGL functions */ - void (WINAPI *p_wglFinish)(void); - void (WINAPI *p_wglFlush)(void); - void (WINAPI *p_wglGetIntegerv)(GLenum pname, GLint* params); -} wine_wgl; - #ifdef SONAME_LIBGLU #define MAKE_FUNCPTR(f) static typeof(f) * p##f; MAKE_FUNCPTR(gluNewTess) @@ -1205,24 +1197,6 @@ GLint WINAPI wine_glDebugEntry( GLint unknown1, GLint unknown2 ) return 0; }
-/*********************************************************************** - * glFinish (OPENGL32.@) - */ -void WINAPI wine_glFinish( void ) -{ - TRACE("()\n"); - wine_wgl.p_wglFinish(); -} - -/*********************************************************************** - * glFlush (OPENGL32.@) - */ -void WINAPI wine_glFlush( void ) -{ - TRACE("()\n"); - wine_wgl.p_wglFlush(); -} - /* build the extension string by filtering out the disabled extensions */ static char *build_gl_extensions( const char *extensions ) { @@ -1294,14 +1268,6 @@ const GLubyte * WINAPI wine_glGetString( GLenum name ) }
/*********************************************************************** - * glGetIntegerv (OPENGL32.@) - */ -void WINAPI wine_glGetIntegerv( GLenum pname, GLint* params ) -{ - wine_wgl.p_wglGetIntegerv(pname, params); -} - -/*********************************************************************** * wglSwapBuffers (OPENGL32.@) */ BOOL WINAPI DECLSPEC_HOTPATCH wglSwapBuffers( HDC hdc ) @@ -1309,23 +1275,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH wglSwapBuffers( HDC hdc ) return GdiSwapBuffers(hdc); }
-/* This is for brain-dead applications that use OpenGL functions before even - creating a rendering context.... */ -static BOOL process_attach(void) -{ - HDC hdc = GetDC( 0 ); - const struct wgl_funcs *funcs = get_dc_funcs( hdc ); - - ReleaseDC( 0, hdc ); - - /* internal WGL functions */ - wine_wgl.p_wglFinish = (void *)funcs->p_wglGetProcAddress("wglFinish"); - wine_wgl.p_wglFlush = (void *)funcs->p_wglGetProcAddress("wglFlush"); - wine_wgl.p_wglGetIntegerv = (void *)funcs->p_wglGetProcAddress("wglGetIntegerv"); - return TRUE; -} - - /**********************************************************************/
static void process_detach(void) @@ -1344,7 +1293,7 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) opengl32_handle = hinst; DisableThreadLibraryCalls(hinst); NtCurrentTeb()->glTable = &null_opengl_funcs; - return process_attach(); + break; case DLL_THREAD_ATTACH: NtCurrentTeb()->glTable = &null_opengl_funcs; break; diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index aae4f4b..b36a29c 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -328,6 +328,10 @@ static void (*pglXFreeMemoryNV)(GLvoid *pointer); static void (*pglXCopySubBufferMESA)(Display *dpy, GLXDrawable drawable, int x, int y, int width, int height);
/* Standard OpenGL */ +static void (*pglFinish)(void); +static void (*pglFlush)(void); +static void (*pglGetIntegerv)(GLenum,GLint*); + MAKE_FUNCPTR(glBindTexture) MAKE_FUNCPTR(glBitmap) MAKE_FUNCPTR(glCopyTexSubImage1D) @@ -336,16 +340,17 @@ MAKE_FUNCPTR(glCopyTexSubImage2D) MAKE_FUNCPTR(glDrawBuffer) MAKE_FUNCPTR(glEndList) MAKE_FUNCPTR(glGetError) -MAKE_FUNCPTR(glGetIntegerv) MAKE_FUNCPTR(glGetString) MAKE_FUNCPTR(glNewList) MAKE_FUNCPTR(glPixelStorei) MAKE_FUNCPTR(glReadPixels) MAKE_FUNCPTR(glTexImage2D) -MAKE_FUNCPTR(glFinish) -MAKE_FUNCPTR(glFlush) #undef MAKE_FUNCPTR
+static void wglFinish(void); +static void wglFlush(void); +static void wglGetIntegerv(GLenum pname, GLint* params); + static int GLXErrorHandler(Display *dpy, XErrorEvent *event, void *arg) { /* In the future we might want to find the exact X or GLX error to report back to the app */ @@ -513,6 +518,14 @@ static BOOL has_opengl(void) } }
+ /* redirect some standard OpenGL functions */ +#define REDIRECT(func) \ + do { p##func = opengl_funcs.gl.p_##func; opengl_funcs.gl.p_##func = w##func; } while(0) + REDIRECT( glFinish ); + REDIRECT( glFlush ); + REDIRECT( glGetIntegerv ); +#undef REDIRECT + pglXGetProcAddressARB = wine_dlsym(opengl_handle, "glXGetProcAddressARB", NULL, 0); if (pglXGetProcAddressARB == NULL) { ERR("Could not find glXGetProcAddressARB in libGL, disabling OpenGL.\n"); @@ -563,14 +576,11 @@ static BOOL has_opengl(void) LOAD_FUNCPTR(glDrawBuffer); LOAD_FUNCPTR(glEndList); LOAD_FUNCPTR(glGetError); - LOAD_FUNCPTR(glGetIntegerv); LOAD_FUNCPTR(glGetString); LOAD_FUNCPTR(glNewList); LOAD_FUNCPTR(glPixelStorei); LOAD_FUNCPTR(glReadPixels); LOAD_FUNCPTR(glTexImage2D); - LOAD_FUNCPTR(glFinish); - LOAD_FUNCPTR(glFlush); #undef LOAD_FUNCPTR
/* It doesn't matter if these fail. They'll only be used if the driver reports @@ -1791,7 +1801,7 @@ static HDC glxdrv_wglGetCurrentDC( struct wgl_context *ctx ) }
/* WGL helper function which handles differences in glGetIntegerv from WGL and GLX */ -static void WINAPI X11DRV_wglGetIntegerv(GLenum pname, GLint* params) +static void wglGetIntegerv(GLenum pname, GLint* params) { wine_tsx11_lock(); switch(pname) @@ -1872,7 +1882,7 @@ static void flush_gl_drawable( struct glx_physdev *physdev ) }
-static void WINAPI X11DRV_wglFinish(void) +static void wglFinish(void) { struct wgl_context *ctx = NtCurrentTeb()->glContext; enum x11drv_escape_codes code = X11DRV_FLUSH_GL_DRAWABLE; @@ -1888,7 +1898,7 @@ static void WINAPI X11DRV_wglFinish(void) } }
-static void WINAPI X11DRV_wglFlush(void) +static void wglFlush(void) { struct wgl_context *ctx = NtCurrentTeb()->glContext; enum x11drv_escape_codes code = X11DRV_FLUSH_GL_DRAWABLE; @@ -3052,17 +3062,6 @@ static BOOL register_extension(const WineGLExtension * ext) return TRUE; }
-static const WineGLExtension WGL_internal_functions = -{ - "", - { - { "wglFinish", X11DRV_wglFinish }, - { "wglFlush", X11DRV_wglFlush }, - { "wglGetIntegerv", X11DRV_wglGetIntegerv }, - } -}; - - static const WineGLExtension WGL_ARB_create_context_extension = { "WGL_ARB_create_context", @@ -3166,9 +3165,6 @@ static void X11DRV_WineGL_LoadExtensions(void) { WineGLInfo.wglExtensions[0] = 0;
- /* Load Wine internal functions */ - register_extension(&WGL_internal_functions); - /* ARB Extensions */
if(glxRequireExtension("GLX_ARB_create_context"))