opengl32: Fix ATI OpenGL bug.

This commit is contained in:
Roderick Colenbrander 2006-08-23 23:11:52 +00:00 committed by Alexandre Julliard
parent bc66d7edde
commit f25cea1094

View file

@ -1276,21 +1276,50 @@ void internal_glGetIntegerv(GLenum pname, GLint* params) {
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 *display, int screen, glXGetProcAddressAR
/*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 */