Allow running opengl and DirectX applications without stencil support,

an earlier patch assumed that stencil support was available, but it
isn't in all cases.
This commit is contained in:
Oliver Stieber 2005-07-22 09:05:04 +00:00 committed by Alexandre Julliard
parent 6b4c9ef268
commit b9efc4d26c
1 changed files with 39 additions and 13 deletions

View File

@ -122,6 +122,7 @@ MAKE_FUNCPTR(glXQueryExtension)
MAKE_FUNCPTR(glXGetFBConfigs)
MAKE_FUNCPTR(glXChooseFBConfig)
MAKE_FUNCPTR(glXGetFBConfigAttrib)
MAKE_FUNCPTR(glXGetVisualFromFBConfig)
#undef MAKE_FUNCPTR
static BOOL has_opengl(void)
@ -147,6 +148,7 @@ LOAD_FUNCPTR(glXQueryExtension)
LOAD_FUNCPTR(glXGetFBConfigs)
LOAD_FUNCPTR(glXChooseFBConfig)
LOAD_FUNCPTR(glXGetFBConfigAttrib)
LOAD_FUNCPTR(glXGetVisualFromFBConfig)
#undef LOAD_FUNCPTR
wine_tsx11_lock();
@ -475,25 +477,49 @@ XVisualInfo *X11DRV_setup_opengl_visual( Display *display )
{
XVisualInfo *visual = NULL;
/* In order to support OpenGL or D3D, we require a double-buffered visual and stencil buffer support, */
int dblBuf[] = {GLX_RGBA,GLX_DEPTH_SIZE,16,GLX_STENCIL_SIZE,8,GLX_DOUBLEBUFFER,None};
int dblBuf[] = {GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT | GLX_WINDOW_BIT,
GLX_RENDER_TYPE,GLX_RGBA_BIT
,GLX_DEPTH_SIZE,16
,GLX_DOUBLEBUFFER,TRUE, None};
int nCfgs;
unsigned int i;
int maxStencil = -1;
int attribSize;
GLXFBConfig* cfgs = NULL;
GLXFBConfig* chosenCfg = NULL;
if (!has_opengl()) return NULL;
wine_tsx11_lock();
visual = pglXChooseVisual(display, DefaultScreen(display), dblBuf);
wine_tsx11_unlock();
if (visual == NULL) {
/* fallback to a 1 bit stencil (opengl states that at least 1 bit of stencil must be provided for on of the available configurations) */
int dblBuf2[] = {GLX_RGBA,GLX_DEPTH_SIZE,16,GLX_STENCIL_SIZE,1,GLX_DOUBLEBUFFER,None};
WARN("Failed to get a visual with at least 8 bits of stencil\n");
wine_tsx11_lock();
visual = pglXChooseVisual(display, DefaultScreen(display), dblBuf2);
wine_tsx11_unlock();
if (visual == NULL) {
/* This should only happen if we cannot fidn a match with a depth size 16 */
FIXME("Failed to find a suitable visual\n");
/* Fint the config with the highest stencil buffer size */
cfgs = pglXChooseFBConfig(display, DefaultScreen(display), dblBuf, &nCfgs);
if (cfgs == NULL) {
WARN("Couldn't find a double buffered, RGBA visual with 16 bits depth\n");
visual = NULL;
} else {
for (i = 0; i < nCfgs ; ++i) {
pglXGetFBConfigAttrib(display, cfgs[i],GLX_STENCIL_SIZE, &attribSize);
if (attribSize > maxStencil ) {
chosenCfg = cfgs + i;
maxStencil = attribSize;
}
}
pglXGetFBConfigAttrib(display, *chosenCfg, GLX_RED_SIZE, &attribSize);
TRACE("A FB config with RED %d", attribSize);
pglXGetFBConfigAttrib(display, *chosenCfg, GLX_GREEN_SIZE, &attribSize);
TRACE(" GREEN %d",attribSize);
pglXGetFBConfigAttrib(display, *chosenCfg, GLX_BLUE_SIZE, &attribSize);
TRACE(" BLUE %d",attribSize);
pglXGetFBConfigAttrib(display, *chosenCfg, GLX_ALPHA_SIZE, &attribSize);
TRACE(" ALPHA %d",attribSize);
pglXGetFBConfigAttrib(display, *chosenCfg, GLX_DEPTH_SIZE, &attribSize);
TRACE(" DEPTH %d",attribSize);
pglXGetFBConfigAttrib(display, *chosenCfg, GLX_STENCIL_SIZE, &attribSize);
TRACE(" STENCIL %d has been chosen\n",attribSize);
visual = pglXGetVisualFromFBConfig(display, *chosenCfg);
XFree(cfgs);
}
wine_tsx11_unlock();
return visual;
}