From 56ab2b3e9177d159d2b1bc2748cdab270d208b2e Mon Sep 17 00:00:00 2001 From: Lionel Ulmer Date: Fri, 15 Nov 2002 04:16:38 +0000 Subject: [PATCH] Load OpenGL library dynamically from x11drv. --- configure | 71 +++++++++++++++++++++++++-- configure.ac | 9 ++-- dlls/d3d8/Makefile.in | 2 +- dlls/ddraw/Makefile.in | 2 +- dlls/glu32/Makefile.in | 2 +- dlls/opengl32/Makefile.in | 2 +- dlls/x11drv/x11drv_main.c | 17 +++---- graphics/x11drv/opengl.c | 101 +++++++++++++++++++++++++++++--------- include/config.h.in | 3 ++ include/x11drv.h | 4 +- 10 files changed, 170 insertions(+), 43 deletions(-) diff --git a/configure b/configure index 65ab0dd68b3..881f855136a 100755 --- a/configure +++ b/configure @@ -305,7 +305,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS LIBEXT OPTIONS WIN16_FILES WIN16_INSTALL build build_cpu build_vendor build_os host host_cpu host_vendor host_os SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP TOOLSDIR X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS YACC LEX LEXLIB LEX_OUTPUT_ROOT XYACC XLEX LD ac_ct_LD AR ac_ct_AR RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP WINDRES ac_ct_WINDRES INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S LN C2MAN LDCONFIG LINT LINTFLAGS JPEGLIB EGREP XLIB XFILES OPENGLFILES GLU32FILES NASLIBS CURSESLIBS sane_devel SANELIBS SANEINCL ft_devel ft_devel2 FREETYPEINCL ARTSCCONFIG ARTSLIBS ARTSINCL ALSALIBS AUDIOIOLIBS DLLEXT DLLFLAGS DLLIBS LDDLLFLAGS LDSHARED DLLWRAP ac_ct_DLLWRAP CROSSTEST CROSSCC DLLTOOL LDPATH CRTLIBS LDD ALLOCA LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS LIBEXT OPTIONS WIN16_FILES WIN16_INSTALL build build_cpu build_vendor build_os host host_cpu host_vendor host_os SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP TOOLSDIR X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS YACC LEX LEXLIB LEX_OUTPUT_ROOT XYACC XLEX LD ac_ct_LD AR ac_ct_AR RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP WINDRES ac_ct_WINDRES INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S LN C2MAN LDCONFIG LINT LINTFLAGS JPEGLIB EGREP XLIB XFILES OPENGLFILES GLU32FILES OPENGL_LIBS NASLIBS CURSESLIBS sane_devel SANELIBS SANEINCL ft_devel ft_devel2 FREETYPEINCL ARTSCCONFIG ARTSLIBS ARTSINCL ALSALIBS AUDIOIOLIBS DLLEXT DLLFLAGS DLLIBS LDDLLFLAGS LDSHARED DLLWRAP ac_ct_DLLWRAP CROSSTEST CROSSCC DLLTOOL LDPATH CRTLIBS LDD ALLOCA LIBOBJS LTLIBOBJS' ac_subst_files='MAKE_RULES MAKE_DLL_RULES MAKE_TEST_RULES MAKE_PROG_RULES' # Initialize some variables set by options. @@ -5761,6 +5761,8 @@ XFILES="" OPENGLFILES="" GLU32FILES="" + +OPENGL_LIBS="" if test "$have_x" = "yes" then XLIB="-lXext -lX11" @@ -7013,7 +7015,7 @@ fi echo "$as_me:$LINENO: result: $ac_cv_lib_GL_glXCreateContext" >&5 echo "${ECHO_T}$ac_cv_lib_GL_glXCreateContext" >&6 if test $ac_cv_lib_GL_glXCreateContext = yes; then - X_PRE_LIBS="$X_PRE_LIBS -lGL" + OPENGL_LIBS="-lGL" fi @@ -7149,7 +7151,7 @@ if test "${ac_cv_lib_GLU_gluLookAt+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lGLU $X_LIBS $X_PRE_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS +LIBS="-lGLU $OPENGL_LIBS $X_LIBS $X_PRE_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" @@ -7194,7 +7196,7 @@ fi echo "$as_me:$LINENO: result: $ac_cv_lib_GLU_gluLookAt" >&5 echo "${ECHO_T}$ac_cv_lib_GLU_gluLookAt" >&6 if test $ac_cv_lib_GLU_gluLookAt = yes; then - X_PRE_LIBS="$X_PRE_LIBS -lGLU" + OPENGL_LIBS="$OPENGL_LIBS -lGLU" GLU32FILES='$(GLU32FILES)' fi @@ -10689,6 +10691,66 @@ cat >>confdefs.h <<_ACEOF _ACEOF fi +echo "$as_me:$LINENO: checking for -lGL soname" >&5 +echo $ECHO_N "checking for -lGL soname... $ECHO_C" >&6 +if test "${ac_cv_lib_soname_GL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_get_soname_save_LIBS=$LIBS +LIBS="-lGL $X_LIBS $X_EXTRA_LIBS $LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char glXQueryExtension (); +int +main () +{ +glXQueryExtension (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_soname_GL=`$ac_cv_path_LDD conftest$ac_exeext | grep libGL\\.so | sed 's/^[ ]*\([^ ]*\)[ ]*=>.*$/\1/'` + if test "x$ac_cv_lib_soname_GL" = "x" + then + ac_cv_lib_soname_GL="libGL.so" + fi +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_soname_GL="libGL.so" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_get_soname_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_soname_GL" >&5 +echo "${ECHO_T}$ac_cv_lib_soname_GL" >&6 +if test "x$ac_cv_lib_soname_GL" != xNONE +then +cat >>confdefs.h <<_ACEOF +#define SONAME_LIBGL "$ac_cv_lib_soname_GL" +_ACEOF +fi + echo "$as_me:$LINENO: checking for -lcups soname" >&5 echo $ECHO_N "checking for -lcups soname... $ECHO_C" >&6 if test "${ac_cv_lib_soname_cups+set}" = set; then @@ -14433,6 +14495,7 @@ s,@XLIB@,$XLIB,;t t s,@XFILES@,$XFILES,;t t s,@OPENGLFILES@,$OPENGLFILES,;t t s,@GLU32FILES@,$GLU32FILES,;t t +s,@OPENGL_LIBS@,$OPENGL_LIBS,;t t s,@NASLIBS@,$NASLIBS,;t t s,@CURSESLIBS@,$CURSESLIBS,;t t s,@sane_devel@,$sane_devel,;t t diff --git a/configure.ac b/configure.ac index ad4cbde80a3..f36a3017640 100644 --- a/configure.ac +++ b/configure.ac @@ -139,6 +139,8 @@ AC_SUBST(OPENGLFILES) OPENGLFILES="" AC_SUBST(GLU32FILES) GLU32FILES="" +AC_SUBST(OPENGL_LIBS) +OPENGL_LIBS="" if test "$have_x" = "yes" then XLIB="-lXext -lX11" @@ -280,7 +282,7 @@ This prevents linking to OpenGL. Delete the file and restart configure.]) then dnl Check for the presence of the library AC_CHECK_LIB(GL,glXCreateContext, - X_PRE_LIBS="$X_PRE_LIBS -lGL" + OPENGL_LIBS="-lGL" ,, $X_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS) @@ -317,10 +319,10 @@ This prevents linking to OpenGL. Delete the file and restart configure.]) fi dnl Check for GLU32 library. AC_CHECK_LIB(GLU,gluLookAt, - [X_PRE_LIBS="$X_PRE_LIBS -lGLU" + [OPENGL_LIBS="$OPENGL_LIBS -lGLU" GLU32FILES='$(GLU32FILES)'] ,, - $X_LIBS $X_PRE_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS + $OPENGL_LIBS $X_LIBS $X_PRE_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS ) fi fi @@ -845,6 +847,7 @@ then WINE_GET_SONAME(Xext,XextCreateExtension,[$X_LIBS -lX11 $X_EXTRA_LIBS]) WINE_GET_SONAME(Xrender,XRenderQueryExtension,[$X_LIBS -lXext -lX11 $X_EXTRA_LIBS]) WINE_GET_SONAME(freetype,FT_Init_FreeType,[$X_LIBS]) + WINE_GET_SONAME(GL,glXQueryExtension,[$X_LIBS $X_EXTRA_LIBS]) WINE_GET_SONAME(cups,cupsGetDefault) fi diff --git a/dlls/d3d8/Makefile.in b/dlls/d3d8/Makefile.in index bac604e61a6..e0faaef014a 100644 --- a/dlls/d3d8/Makefile.in +++ b/dlls/d3d8/Makefile.in @@ -5,7 +5,7 @@ VPATH = @srcdir@ MODULE = d3d8.dll IMPORTS = user32 gdi32 kernel32 EXTRAINCL = @X_CFLAGS@ -EXTRALIBS = $(LIBUUID) @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ +EXTRALIBS = $(LIBUUID) @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ @OPENGL_LIBS@ LDDLLFLAGS = @LDDLLFLAGS@ SYMBOLFILE = $(MODULE).tmp.o diff --git a/dlls/ddraw/Makefile.in b/dlls/ddraw/Makefile.in index 508b8f04b18..3c5e88b6016 100644 --- a/dlls/ddraw/Makefile.in +++ b/dlls/ddraw/Makefile.in @@ -5,7 +5,7 @@ VPATH = @srcdir@ MODULE = ddraw.dll IMPORTS = user32 gdi32 kernel32 EXTRAINCL = @X_CFLAGS@ -EXTRALIBS = $(LIBUUID) @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ +EXTRALIBS = $(LIBUUID) @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ @OPENGL_LIBS@ LDDLLFLAGS = @LDDLLFLAGS@ SYMBOLFILE = $(MODULE).tmp.o diff --git a/dlls/glu32/Makefile.in b/dlls/glu32/Makefile.in index e7ac2ff9c61..4e03e9ab3cf 100644 --- a/dlls/glu32/Makefile.in +++ b/dlls/glu32/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = glu32.dll EXTRAINCL = @X_CFLAGS@ -EXTRALIBS = @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ +EXTRALIBS = @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ @OPENGL_LIBS@ LDDLLFLAGS = @LDDLLFLAGS@ SYMBOLFILE = $(MODULE).tmp.o diff --git a/dlls/opengl32/Makefile.in b/dlls/opengl32/Makefile.in index 84537dd1a26..94699cd6220 100644 --- a/dlls/opengl32/Makefile.in +++ b/dlls/opengl32/Makefile.in @@ -5,7 +5,7 @@ VPATH = @srcdir@ MODULE = opengl32.dll IMPORTS = user32 gdi32 kernel32 EXTRAINCL = @X_CFLAGS@ -EXTRALIBS = @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ +EXTRALIBS = @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ @OPENGL_LIBS@ LDDLLFLAGS = @LDDLLFLAGS@ SYMBOLFILE = $(MODULE).tmp.o diff --git a/dlls/x11drv/x11drv_main.c b/dlls/x11drv/x11drv_main.c index c8cc1021b86..0dcc6ddc026 100644 --- a/dlls/x11drv/x11drv_main.c +++ b/dlls/x11drv/x11drv_main.c @@ -68,6 +68,7 @@ int client_side_antialias_with_render = 1; unsigned int X11DRV_server_startticks; static BOOL synchronous; /* run in synchronous mode? */ +static BOOL desktop_dbl_buf; static char *desktop_geometry; static XVisualInfo *desktop_vi; @@ -268,6 +269,9 @@ static void setup_options(void) if (!get_config_key( hkey, appkey, "ClientSideAntiAliasWithRender", buffer, sizeof(buffer) )) client_side_antialias_with_render = IS_OPTION_TRUE( buffer[0] ); + if (!get_config_key( hkey, appkey, "DesktopDoubleBuffered", buffer, sizeof(buffer) )) + desktop_dbl_buf = IS_OPTION_TRUE( buffer[0] ); + if (appkey) RegCloseKey( appkey ); RegCloseKey( hkey ); } @@ -313,8 +317,11 @@ static void process_attach(void) } else screen_depth = DefaultDepthOfScreen( screen ); + /* Initialize OpenGL */ + X11DRV_OpenGL_Init(display); + /* If OpenGL is available, change the default visual, etc as necessary */ - if ((desktop_vi = X11DRV_setup_opengl_visual( display ))) + if (desktop_dbl_buf && (desktop_vi = X11DRV_setup_opengl_visual( display ))) { visual = desktop_vi->visual; screen = ScreenOfDisplay(display, desktop_vi->screen); @@ -352,10 +359,6 @@ static void process_attach(void) /* initialize DGA2 */ X11DRV_XF86DGA2_Init(); #endif -#ifdef HAVE_OPENGL - /* initialize GLX */ - /*X11DRV_GLX_Init();*/ -#endif /* load display.dll */ LoadLibrary16( "display" ); @@ -385,10 +388,6 @@ static void thread_detach(void) */ static void process_detach(void) { -#ifdef HAVE_OPENGL - /* cleanup GLX */ - /*X11DRV_GLX_Cleanup();*/ -#endif #ifdef HAVE_LIBXXF86DGA2 /* cleanup DGA2 */ X11DRV_XF86DGA2_Cleanup(); diff --git a/graphics/x11drv/opengl.c b/graphics/x11drv/opengl.c index 2142d589776..10865cf80ed 100644 --- a/graphics/x11drv/opengl.c +++ b/graphics/x11drv/opengl.c @@ -19,6 +19,7 @@ */ #include "config.h" +#include "wine/port.h" #include "ts_xlib.h" @@ -31,7 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(opengl); -#ifdef HAVE_OPENGL +#if defined(HAVE_GL_GL_H) && defined(HAVE_GL_GLX_H) #undef APIENTRY #undef CALLBACK @@ -105,6 +106,50 @@ static void dump_PIXELFORMATDESCRIPTOR(PIXELFORMATDESCRIPTOR *ppfd) { DPRINTF("\n"); } +/* No need to load any other libraries as according to the ABI, libGL should be self-sufficient and + include all dependencies +*/ +#ifndef SONAME_LIBGL +#define SONAME_LIBGL "libGL.so" +#endif + +static void *opengl_handle; + +#define MAKE_FUNCPTR(f) static typeof(f) * p##f; +MAKE_FUNCPTR(glXChooseVisual) +MAKE_FUNCPTR(glXGetConfig) +MAKE_FUNCPTR(glXSwapBuffers) +MAKE_FUNCPTR(glXQueryExtension) +#undef MAKE_FUNCPTR + +void X11DRV_OpenGL_Init(Display *display) { + int error_base, event_base; + + opengl_handle = wine_dlopen(SONAME_LIBGL, RTLD_NOW|RTLD_GLOBAL, NULL, 0); + if (opengl_handle == NULL) return; + +#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(opengl_handle, #f, NULL, 0)) == NULL) goto sym_not_found; +LOAD_FUNCPTR(glXChooseVisual) +LOAD_FUNCPTR(glXGetConfig) +LOAD_FUNCPTR(glXSwapBuffers) +LOAD_FUNCPTR(glXQueryExtension) +#undef LOAD_FUNCPTR + + wine_tsx11_lock(); + if (pglXQueryExtension(display, &event_base, &error_base) == True) { + TRACE("GLX is up and running error_base = %d\n", error_base); + } else { + wine_dlclose(opengl_handle, NULL, 0); + opengl_handle = NULL; + } + wine_tsx11_unlock(); + return; + +sym_not_found: + wine_dlclose(opengl_handle, NULL, 0); + opengl_handle = NULL; +} + /* X11DRV_ChoosePixelFormat Equivalent of glXChooseVisual @@ -121,6 +166,11 @@ int X11DRV_ChoosePixelFormat(X11DRV_PDEVICE *physDev, XVisualInfo *vis; int i; + if (opengl_handle == NULL) { + ERR("No libGL on this box - disabling OpenGL support !\n"); + return 0; + } + if (TRACE_ON(opengl)) { TRACE("(%p,%p)\n", physDev, ppfd); @@ -200,6 +250,11 @@ int X11DRV_DescribePixelFormat(X11DRV_PDEVICE *physDev, int value; int rb,gb,bb,ab; + if (opengl_handle == NULL) { + ERR("No libGL on this box - disabling OpenGL support !\n"); + return 0; + } + TRACE("(%p,%d,%d,%p)\n", physDev, iPixelFormat, nBytes, ppfd); if (ppfd == NULL) { @@ -225,7 +280,7 @@ int X11DRV_DescribePixelFormat(X11DRV_PDEVICE *physDev, /* Create a 'standard' X Visual */ wine_tsx11_lock(); - vis = glXChooseVisual(gdi_display, DefaultScreen(gdi_display), dblBuf); + vis = pglXChooseVisual(gdi_display, DefaultScreen(gdi_display), dblBuf); wine_tsx11_unlock(); WARN("Uninitialized Visual. Creating standard (%p) !\n", vis); @@ -248,26 +303,26 @@ int X11DRV_DescribePixelFormat(X11DRV_PDEVICE *physDev, ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_GENERIC_ACCELERATED; /* Now the flags extraced from the Visual */ wine_tsx11_lock(); - glXGetConfig(gdi_display, vis, GLX_DOUBLEBUFFER, &value); if (value) ppfd->dwFlags |= PFD_DOUBLEBUFFER; - glXGetConfig(gdi_display, vis, GLX_STEREO, &value); if (value) ppfd->dwFlags |= PFD_STEREO; + pglXGetConfig(gdi_display, vis, GLX_DOUBLEBUFFER, &value); if (value) ppfd->dwFlags |= PFD_DOUBLEBUFFER; + pglXGetConfig(gdi_display, vis, GLX_STEREO, &value); if (value) ppfd->dwFlags |= PFD_STEREO; /* Pixel type */ - glXGetConfig(gdi_display, vis, GLX_RGBA, &value); + pglXGetConfig(gdi_display, vis, GLX_RGBA, &value); if (value) ppfd->iPixelType = PFD_TYPE_RGBA; else ppfd->iPixelType = PFD_TYPE_COLORINDEX; /* Color bits */ - glXGetConfig(gdi_display, vis, GLX_BUFFER_SIZE, &value); + pglXGetConfig(gdi_display, vis, GLX_BUFFER_SIZE, &value); ppfd->cColorBits = value; /* Red, green, blue and alpha bits / shifts */ if (ppfd->iPixelType == PFD_TYPE_RGBA) { - glXGetConfig(gdi_display, vis, GLX_RED_SIZE, &rb); - glXGetConfig(gdi_display, vis, GLX_GREEN_SIZE, &gb); - glXGetConfig(gdi_display, vis, GLX_BLUE_SIZE, &bb); - glXGetConfig(gdi_display, vis, GLX_ALPHA_SIZE, &ab); + pglXGetConfig(gdi_display, vis, GLX_RED_SIZE, &rb); + pglXGetConfig(gdi_display, vis, GLX_GREEN_SIZE, &gb); + pglXGetConfig(gdi_display, vis, GLX_BLUE_SIZE, &bb); + pglXGetConfig(gdi_display, vis, GLX_ALPHA_SIZE, &ab); ppfd->cRedBits = rb; ppfd->cRedShift = gb + bb + ab; @@ -290,11 +345,11 @@ int X11DRV_DescribePixelFormat(X11DRV_PDEVICE *physDev, /* Accums : to do ... */ /* Depth bits */ - glXGetConfig(gdi_display, vis, GLX_DEPTH_SIZE, &value); + pglXGetConfig(gdi_display, vis, GLX_DEPTH_SIZE, &value); ppfd->cDepthBits = value; /* stencil bits */ - glXGetConfig( gdi_display, vis, GLX_STENCIL_SIZE, &value ); + pglXGetConfig( gdi_display, vis, GLX_STENCIL_SIZE, &value ); ppfd->cStencilBits = value; wine_tsx11_unlock(); @@ -339,10 +394,15 @@ BOOL X11DRV_SetPixelFormat(X11DRV_PDEVICE *physDev, Swap the buffers of this DC */ BOOL X11DRV_SwapBuffers(X11DRV_PDEVICE *physDev) { + if (opengl_handle == NULL) { + ERR("No libGL on this box - disabling OpenGL support !\n"); + return 0; + } + TRACE("(%p)\n", physDev); wine_tsx11_lock(); - glXSwapBuffers(gdi_display, physDev->drawable); + pglXSwapBuffers(gdi_display, physDev->drawable); wine_tsx11_unlock(); return TRUE; @@ -357,22 +417,19 @@ BOOL X11DRV_SwapBuffers(X11DRV_PDEVICE *physDev) { */ XVisualInfo *X11DRV_setup_opengl_visual( Display *display ) { - int err_base, evt_base; XVisualInfo *visual = NULL; + int dblBuf[]={GLX_RGBA,GLX_DEPTH_SIZE,16,GLX_DOUBLEBUFFER,None}; - /* In order to support OpenGL or D3D, we require a double-buffered - * visual */ + if (opengl_handle == NULL) return NULL; + + /* In order to support OpenGL or D3D, we require a double-buffered visual */ wine_tsx11_lock(); - if (glXQueryExtension(display, &err_base, &evt_base) == True) - { - int dblBuf[]={GLX_RGBA,GLX_DEPTH_SIZE,16,GLX_DOUBLEBUFFER,None}; - visual = glXChooseVisual(display, DefaultScreen(display), dblBuf); - } + visual = pglXChooseVisual(display, DefaultScreen(display), dblBuf); wine_tsx11_unlock(); return visual; } -#else /* defined(HAVE_OPENGL) */ +#else /* no OpenGL includes */ int X11DRV_ChoosePixelFormat(X11DRV_PDEVICE *physDev, const PIXELFORMATDESCRIPTOR *ppfd) { diff --git a/include/config.h.in b/include/config.h.in index 7808abd58b5..57a0439f9db 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -692,6 +692,9 @@ /* Define to the soname of the libfreetype library. */ #undef SONAME_LIBFREETYPE +/* Define to the soname of the libGL library. */ +#undef SONAME_LIBGL + /* Define to the soname of the libX11 library. */ #undef SONAME_LIBX11 diff --git a/include/x11drv.h b/include/x11drv.h index 791cf55a95d..d63bfbd058e 100644 --- a/include/x11drv.h +++ b/include/x11drv.h @@ -226,6 +226,9 @@ extern BOOL X11DRV_XRender_ExtTextOut(X11DRV_PDEVICE *physDev, INT x, INT y, UIN UINT count, const INT *lpDx); extern void X11DRV_XRender_UpdateDrawable(X11DRV_PDEVICE *physDev); +extern void X11DRV_OpenGL_Init(Display *display); +extern XVisualInfo *X11DRV_setup_opengl_visual(Display *display); + /* exported dib functions for now */ /* Additional info for DIB section objects */ @@ -440,6 +443,5 @@ extern void X11DRV_sync_window_style( Display *display, WND *win ); extern int X11DRV_sync_whole_window_position( Display *display, WND *win, int zorder ); extern int X11DRV_sync_client_window_position( Display *display, WND *win ); extern void X11DRV_set_wm_hints( Display *display, WND *win ); -extern XVisualInfo *X11DRV_setup_opengl_visual( Display *display ); #endif /* __WINE_X11DRV_H */