Roderick Colenbrander : opengl32: Fix ATI OpenGL bug.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Aug 24 05:56:59 CDT 2006


Module: wine
Branch: master
Commit: f25cea1094a05860abe666c199b0793e195df49a
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=f25cea1094a05860abe666c199b0793e195df49a

Author: Roderick Colenbrander <thunderbird2k at gmx.net>
Date:   Wed Aug 23 23:11:52 2006 +0000

opengl32: Fix ATI OpenGL bug.

---

 dlls/opengl32/wgl.c |   45 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c
index 45f6297..f1efe8c 100644
--- a/dlls/opengl32/wgl.c
+++ b/dlls/opengl32/wgl.c
@@ -1276,21 +1276,50 @@ #endif
 static void wgl_initialize_glx(Display *display, int screen, glXGetProcAddressARB_t proc) 
 {
   const char *server_glx_version = glXQueryServerString(display, screen, GLX_VERSION);
-  const char *server_glx_extensions = glXQueryServerString(display, screen, GLX_EXTENSIONS);
-  /*
   const char *client_glx_version = glXGetClientString(display, GLX_VERSION);
-  const char *client_glx_extensions = glXGetClientString(display, GLX_EXTENSIONS);
-  const char *glx_extensions = glXQueryExtensionsString(display, screen);
-  */
+  const char *glx_extensions = NULL;
+  BOOL glx_direct = glXIsDirect(display, default_cx);
 
   memset(&wine_glx, 0, sizeof(wine_glx));
 
-  if (!strcmp("1.2", server_glx_version)) {
+  /* In case of GLX you have direct and indirect rendering. Most of the time direct rendering is used
+   * as in general only that is hardware accelerated. In some cases like in case of remote X indirect
+   * rendering is used.
+   *
+   * The main problem for our OpenGL code is that we need certain GLX calls but their presence
+   * depends on the reported GLX client / server version and on the client / server extension list.
+   * Those don't have to be the same.
+   *
+   * In general the server GLX information should be used in case of indirect rendering. When direct
+   * rendering is used, the OpenGL client library is responsible for which GLX calls are available.
+   * Nvidia's OpenGL drivers are the best in terms of GLX features. At the moment of writing their
+   * 8762 drivers support 1.3 for the server and 1.4 for the client and they support lots of extensions.
+   * Unfortunately it is much more complicated for Mesa/DRI-based drivers and ATI's drivers.
+   * Both sets of drivers report a server version of 1.2 and the client version can be 1.3 or 1.4.
+   * Further in case of atleast ATI's drivers one crucial extension needed for our pixel format code
+   * is only available in the list of server extensions and not in the client list.
+   *
+   * The versioning checks below try to take into account the comments from above.
+   */
+
+  /* Based on the default opengl context we decide whether direct or indirect rendering is used.
+   * In case of indirect rendering we check if the GLX version of the server is 1.2 and else
+   * the client version is checked.
+   */
+  if ( (!glx_direct && !strcmp("1.2", server_glx_version)) || (glx_direct && !strcmp("1.2", client_glx_version)) ) {
     wine_glx.version = 2;
   } else {
     wine_glx.version = 3;
   }
 
+  /* Depending on the use of direct or indirect rendering we need either the list of extensions
+   * exported by the client or by the server.
+   */
+  if(glx_direct)
+    glx_extensions = glXGetClientString(display, GLX_EXTENSIONS);
+  else
+    glx_extensions = glXQueryServerString(display, screen, GLX_EXTENSIONS);
+
   if (2 < wine_glx.version) {
     wine_glx.p_glXChooseFBConfig = proc( (const GLubyte *) "glXChooseFBConfig");
     wine_glx.p_glXGetFBConfigAttrib = proc( (const GLubyte *) "glXGetFBConfigAttrib");
@@ -1299,12 +1328,12 @@ static void wgl_initialize_glx(Display *
     /*wine_glx.p_glXGetFBConfigs = proc( (const GLubyte *) "glXGetFBConfigs");*/
     wine_glx.p_glXQueryDrawable = proc( (const GLubyte *) "glXQueryDrawable");
   } else {
-    if (NULL != strstr(server_glx_extensions, "GLX_SGIX_fbconfig")) {
+    if (NULL != strstr(glx_extensions, "GLX_SGIX_fbconfig")) {
       wine_glx.p_glXChooseFBConfig = proc( (const GLubyte *) "glXChooseFBConfigSGIX");
       wine_glx.p_glXGetFBConfigAttrib = proc( (const GLubyte *) "glXGetFBConfigAttribSGIX");
       wine_glx.p_glXGetVisualFromFBConfig = proc( (const GLubyte *) "glXGetVisualFromFBConfigSGIX");
     } else {
-      ERR(" glx_version as %s and GLX_SGIX_fbconfig extension is unsupported. Expect problems.\n", server_glx_version);
+      ERR(" glx_version as %s and GLX_SGIX_fbconfig extension is unsupported. Expect problems.\n", client_glx_version);
     }
   }
   /** try anyway to retrieve that calls, maybe they works using glx client tricks */




More information about the wine-cvs mailing list