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($$$)
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. :-)
......
......@@ -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 ) {
......
......@@ -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;
......
......@@ -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"))
......
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