Commit df91c7bc authored by Alexandre Julliard's avatar Alexandre Julliard

opengl32: Redirect standard OpenGL functions through the TEB function table.

parent d66fa61e
...@@ -235,9 +235,6 @@ sub GenerateThunk($$$) ...@@ -235,9 +235,6 @@ sub GenerateThunk($$$)
return "" if $func_ref->[0] eq "glDebugEntry"; return "" if $func_ref->[0] eq "glDebugEntry";
return "" if $func_ref->[0] eq "glGetString"; 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 :-) # 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. :-) # Patrik says: Well I would be even happier if a (OPENGL32.@) was added as well. Done. :-)
......
...@@ -812,6 +812,24 @@ void WINAPI wine_glFeedbackBuffer( GLsizei size, GLenum type, GLfloat* buffer ) ...@@ -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.@) * glFogf (OPENGL32.@)
*/ */
void WINAPI wine_glFogf( GLenum pname, GLfloat param ) { void WINAPI wine_glFogf( GLenum pname, GLfloat param ) {
...@@ -929,6 +947,15 @@ void WINAPI wine_glGetFloatv( GLenum pname, GLfloat* params ) { ...@@ -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.@) * glGetLightfv (OPENGL32.@)
*/ */
void WINAPI wine_glGetLightfv( GLenum light, GLenum pname, GLfloat* params ) { void WINAPI wine_glGetLightfv( GLenum light, GLenum pname, GLfloat* params ) {
......
...@@ -47,14 +47,6 @@ ...@@ -47,14 +47,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(wgl); WINE_DEFAULT_DEBUG_CHANNEL(wgl);
WINE_DECLARE_DEBUG_CHANNEL(opengl); 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 #ifdef SONAME_LIBGLU
#define MAKE_FUNCPTR(f) static typeof(f) * p##f; #define MAKE_FUNCPTR(f) static typeof(f) * p##f;
MAKE_FUNCPTR(gluNewTess) MAKE_FUNCPTR(gluNewTess)
...@@ -1205,24 +1197,6 @@ GLint WINAPI wine_glDebugEntry( GLint unknown1, GLint unknown2 ) ...@@ -1205,24 +1197,6 @@ GLint WINAPI wine_glDebugEntry( GLint unknown1, GLint unknown2 )
return 0; 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 */ /* build the extension string by filtering out the disabled extensions */
static char *build_gl_extensions( const char *extensions ) static char *build_gl_extensions( const char *extensions )
{ {
...@@ -1294,14 +1268,6 @@ const GLubyte * WINAPI wine_glGetString( GLenum name ) ...@@ -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.@) * wglSwapBuffers (OPENGL32.@)
*/ */
BOOL WINAPI DECLSPEC_HOTPATCH wglSwapBuffers( HDC hdc ) BOOL WINAPI DECLSPEC_HOTPATCH wglSwapBuffers( HDC hdc )
...@@ -1309,23 +1275,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH wglSwapBuffers( HDC hdc ) ...@@ -1309,23 +1275,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH wglSwapBuffers( HDC hdc )
return GdiSwapBuffers(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) static void process_detach(void)
...@@ -1344,7 +1293,7 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) ...@@ -1344,7 +1293,7 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
opengl32_handle = hinst; opengl32_handle = hinst;
DisableThreadLibraryCalls(hinst); DisableThreadLibraryCalls(hinst);
NtCurrentTeb()->glTable = &null_opengl_funcs; NtCurrentTeb()->glTable = &null_opengl_funcs;
return process_attach(); break;
case DLL_THREAD_ATTACH: case DLL_THREAD_ATTACH:
NtCurrentTeb()->glTable = &null_opengl_funcs; NtCurrentTeb()->glTable = &null_opengl_funcs;
break; break;
......
...@@ -328,6 +328,10 @@ static void (*pglXFreeMemoryNV)(GLvoid *pointer); ...@@ -328,6 +328,10 @@ static void (*pglXFreeMemoryNV)(GLvoid *pointer);
static void (*pglXCopySubBufferMESA)(Display *dpy, GLXDrawable drawable, int x, int y, int width, int height); static void (*pglXCopySubBufferMESA)(Display *dpy, GLXDrawable drawable, int x, int y, int width, int height);
/* Standard OpenGL */ /* Standard OpenGL */
static void (*pglFinish)(void);
static void (*pglFlush)(void);
static void (*pglGetIntegerv)(GLenum,GLint*);
MAKE_FUNCPTR(glBindTexture) MAKE_FUNCPTR(glBindTexture)
MAKE_FUNCPTR(glBitmap) MAKE_FUNCPTR(glBitmap)
MAKE_FUNCPTR(glCopyTexSubImage1D) MAKE_FUNCPTR(glCopyTexSubImage1D)
...@@ -336,16 +340,17 @@ MAKE_FUNCPTR(glCopyTexSubImage2D) ...@@ -336,16 +340,17 @@ MAKE_FUNCPTR(glCopyTexSubImage2D)
MAKE_FUNCPTR(glDrawBuffer) MAKE_FUNCPTR(glDrawBuffer)
MAKE_FUNCPTR(glEndList) MAKE_FUNCPTR(glEndList)
MAKE_FUNCPTR(glGetError) MAKE_FUNCPTR(glGetError)
MAKE_FUNCPTR(glGetIntegerv)
MAKE_FUNCPTR(glGetString) MAKE_FUNCPTR(glGetString)
MAKE_FUNCPTR(glNewList) MAKE_FUNCPTR(glNewList)
MAKE_FUNCPTR(glPixelStorei) MAKE_FUNCPTR(glPixelStorei)
MAKE_FUNCPTR(glReadPixels) MAKE_FUNCPTR(glReadPixels)
MAKE_FUNCPTR(glTexImage2D) MAKE_FUNCPTR(glTexImage2D)
MAKE_FUNCPTR(glFinish)
MAKE_FUNCPTR(glFlush)
#undef MAKE_FUNCPTR #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) 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 */ /* 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) ...@@ -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); pglXGetProcAddressARB = wine_dlsym(opengl_handle, "glXGetProcAddressARB", NULL, 0);
if (pglXGetProcAddressARB == NULL) { if (pglXGetProcAddressARB == NULL) {
ERR("Could not find glXGetProcAddressARB in libGL, disabling OpenGL.\n"); ERR("Could not find glXGetProcAddressARB in libGL, disabling OpenGL.\n");
...@@ -563,14 +576,11 @@ static BOOL has_opengl(void) ...@@ -563,14 +576,11 @@ static BOOL has_opengl(void)
LOAD_FUNCPTR(glDrawBuffer); LOAD_FUNCPTR(glDrawBuffer);
LOAD_FUNCPTR(glEndList); LOAD_FUNCPTR(glEndList);
LOAD_FUNCPTR(glGetError); LOAD_FUNCPTR(glGetError);
LOAD_FUNCPTR(glGetIntegerv);
LOAD_FUNCPTR(glGetString); LOAD_FUNCPTR(glGetString);
LOAD_FUNCPTR(glNewList); LOAD_FUNCPTR(glNewList);
LOAD_FUNCPTR(glPixelStorei); LOAD_FUNCPTR(glPixelStorei);
LOAD_FUNCPTR(glReadPixels); LOAD_FUNCPTR(glReadPixels);
LOAD_FUNCPTR(glTexImage2D); LOAD_FUNCPTR(glTexImage2D);
LOAD_FUNCPTR(glFinish);
LOAD_FUNCPTR(glFlush);
#undef LOAD_FUNCPTR #undef LOAD_FUNCPTR
/* It doesn't matter if these fail. They'll only be used if the driver reports /* 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 ) ...@@ -1791,7 +1801,7 @@ static HDC glxdrv_wglGetCurrentDC( struct wgl_context *ctx )
} }
/* WGL helper function which handles differences in glGetIntegerv from WGL and GLX */ /* 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(); wine_tsx11_lock();
switch(pname) switch(pname)
...@@ -1872,7 +1882,7 @@ static void flush_gl_drawable( struct glx_physdev *physdev ) ...@@ -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; struct wgl_context *ctx = NtCurrentTeb()->glContext;
enum x11drv_escape_codes code = X11DRV_FLUSH_GL_DRAWABLE; enum x11drv_escape_codes code = X11DRV_FLUSH_GL_DRAWABLE;
...@@ -1888,7 +1898,7 @@ static void WINAPI X11DRV_wglFinish(void) ...@@ -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; struct wgl_context *ctx = NtCurrentTeb()->glContext;
enum x11drv_escape_codes code = X11DRV_FLUSH_GL_DRAWABLE; enum x11drv_escape_codes code = X11DRV_FLUSH_GL_DRAWABLE;
...@@ -3052,17 +3062,6 @@ static BOOL register_extension(const WineGLExtension * ext) ...@@ -3052,17 +3062,6 @@ static BOOL register_extension(const WineGLExtension * ext)
return TRUE; 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 = static const WineGLExtension WGL_ARB_create_context_extension =
{ {
"WGL_ARB_create_context", "WGL_ARB_create_context",
...@@ -3166,9 +3165,6 @@ static void X11DRV_WineGL_LoadExtensions(void) ...@@ -3166,9 +3165,6 @@ static void X11DRV_WineGL_LoadExtensions(void)
{ {
WineGLInfo.wglExtensions[0] = 0; WineGLInfo.wglExtensions[0] = 0;
/* Load Wine internal functions */
register_extension(&WGL_internal_functions);
/* ARB Extensions */ /* ARB Extensions */
if(glxRequireExtension("GLX_ARB_create_context")) if(glxRequireExtension("GLX_ARB_create_context"))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment