changes to vishandle usage to prevent segfault in some circumstances

This commit is contained in:
Brian Paul 2002-11-10 17:07:06 +00:00
parent 04cf6f4958
commit f104619b8f
3 changed files with 74 additions and 42 deletions

View file

@ -1,4 +1,4 @@
/* $Id: fakeglx.c,v 1.74 2002/11/05 21:11:18 brianp Exp $ */
/* $Id: fakeglx.c,v 1.75 2002/11/10 17:07:06 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -330,6 +330,11 @@ save_glx_visual( Display *dpy, XVisualInfo *vinfo,
accumBlueSize, accumAlphaSize, 0, level,
GLX_NONE_EXT );
if (xmvis) {
/* Save a copy of the pointer now so we can find this visual again
* if we need to search for it in find_glx_visual().
*/
xmvis->vishandle = vinfo;
/* add xmvis to the list */
VisualTable[NumVisuals] = xmvis;
NumVisuals++;
}
@ -417,12 +422,6 @@ find_glx_visual( Display *dpy, XVisualInfo *vinfo )
{
int i;
/* First try to match pointers */
for (i=0;i<NumVisuals;i++) {
if (VisualTable[i]->display==dpy && VisualTable[i]->vishandle==vinfo) {
return VisualTable[i];
}
}
/* try to match visual id */
for (i=0;i<NumVisuals;i++) {
if (VisualTable[i]->display==dpy
@ -430,6 +429,14 @@ find_glx_visual( Display *dpy, XVisualInfo *vinfo )
return VisualTable[i];
}
}
/* if that fails, try to match pointers */
for (i=0;i<NumVisuals;i++) {
if (VisualTable[i]->display==dpy && VisualTable[i]->vishandle==vinfo) {
return VisualTable[i];
}
}
return NULL;
}
@ -1174,8 +1181,18 @@ static XVisualInfo *
Fake_glXChooseVisual( Display *dpy, int screen, int *list )
{
XMesaVisual xmvis = choose_visual(dpy, screen, list);
if (xmvis)
if (xmvis) {
#if 0
return xmvis->vishandle;
#else
/* create a new vishandle - the cached one may be stale */
xmvis->vishandle = _mesa_malloc(sizeof(XVisualInfo));
if (xmvis->vishandle) {
_mesa_memcpy(xmvis->vishandle, xmvis->visinfo, sizeof(XVisualInfo));
}
return xmvis->vishandle;
#endif
}
else
return NULL;
}
@ -1670,29 +1687,29 @@ get_config( XMesaVisual xmvis, int attrib, int *value, GLboolean fbconfig )
case GLX_FBCONFIG_ID_SGIX:
if (!fbconfig)
return GLX_BAD_ATTRIBUTE;
*value = xmvis->vishandle->visualid;
*value = xmvis->visinfo->visualid;
break;
case GLX_MAX_PBUFFER_WIDTH:
if (!fbconfig)
return GLX_BAD_ATTRIBUTE;
/* XXX or MAX_WIDTH? */
*value = DisplayWidth(xmvis->display, xmvis->vishandle->screen);
*value = DisplayWidth(xmvis->display, xmvis->visinfo->screen);
break;
case GLX_MAX_PBUFFER_HEIGHT:
if (!fbconfig)
return GLX_BAD_ATTRIBUTE;
*value = DisplayHeight(xmvis->display, xmvis->vishandle->screen);
*value = DisplayHeight(xmvis->display, xmvis->visinfo->screen);
break;
case GLX_MAX_PBUFFER_PIXELS:
if (!fbconfig)
return GLX_BAD_ATTRIBUTE;
*value = DisplayWidth(xmvis->display, xmvis->vishandle->screen) *
DisplayHeight(xmvis->display, xmvis->vishandle->screen);
*value = DisplayWidth(xmvis->display, xmvis->visinfo->screen) *
DisplayHeight(xmvis->display, xmvis->visinfo->screen);
break;
case GLX_VISUAL_ID:
if (!fbconfig)
return GLX_BAD_ATTRIBUTE;
*value = xmvis->vishandle->visualid;
*value = xmvis->visinfo->visualid;
break;
default:
@ -1891,8 +1908,17 @@ static XVisualInfo *
Fake_glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config )
{
if (dpy && config) {
XMesaVisual v = (XMesaVisual) config;
return v->vishandle;
XMesaVisual xmvis = (XMesaVisual) config;
#if 0
return xmvis->vishandle;
#else
/* create a new vishandle - the cached one may be stale */
xmvis->vishandle = _mesa_malloc(sizeof(XVisualInfo));
if (xmvis->vishandle) {
_mesa_memcpy(xmvis->vishandle, xmvis->visinfo, sizeof(XVisualInfo));
}
return xmvis->vishandle;
#endif
}
else {
return NULL;
@ -1929,7 +1955,6 @@ Fake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
const int *attribList )
{
XMesaVisual v = (XMesaVisual) config;
XVisualInfo *visinfo;
XMesaBuffer b;
(void) dpy;
@ -1940,17 +1965,6 @@ Fake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
if (!dpy || !config || !pixmap)
return 0;
visinfo = v->vishandle;
v = find_glx_visual( dpy, visinfo );
if (!v) {
v = create_glx_visual( dpy, visinfo );
if (!v) {
/* unusable visual */
return 0;
}
}
b = XMesaCreatePixmapBuffer( v, pixmap, 0 );
if (!b) {
return 0;
@ -2048,7 +2062,7 @@ Fake_glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
*value = xmbuf->width * xmbuf->height;
break;
case GLX_FBCONFIG_ID:
*value = xmbuf->xm_visual->vishandle->visualid;
*value = xmbuf->xm_visual->visinfo->visualid;
return;
default:
return; /* GLX_BAD_ATTRIBUTE? */
@ -2060,13 +2074,36 @@ static GLXContext
Fake_glXCreateNewContext( Display *dpy, GLXFBConfig config,
int renderType, GLXContext shareList, Bool direct )
{
XMesaVisual v = (XMesaVisual) config;
struct fake_glx_context *glxCtx;
struct fake_glx_context *shareCtx = (struct fake_glx_context *) shareList;
XMesaVisual xmvis = (XMesaVisual) config;
if (!dpy || !config ||
(renderType != GLX_RGBA_TYPE && renderType != GLX_COLOR_INDEX_TYPE))
return 0;
return Fake_glXCreateContext(dpy, v->vishandle, shareList, direct);
glxCtx = CALLOC_STRUCT(fake_glx_context);
if (!glxCtx)
return 0;
/* deallocate unused windows/buffers */
XMesaGarbageCollect();
glxCtx->xmesaContext = XMesaCreateContext(xmvis,
shareCtx ? shareCtx->xmesaContext : NULL);
if (!glxCtx->xmesaContext) {
FREE(glxCtx);
return NULL;
}
glxCtx->xmesaContext->direct = GL_FALSE;
glxCtx->glxContext.isDirect = GL_FALSE;
glxCtx->glxContext.currentDpy = dpy;
glxCtx->glxContext.xid = (XID) glxCtx; /* self pointer */
assert((void *) glxCtx == (void *) &(glxCtx->glxContext));
return (GLXContext) glxCtx;
}
@ -2081,7 +2118,7 @@ Fake_glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value )
switch (attribute) {
case GLX_FBCONFIG_ID:
*value = xmctx->xm_visual->vishandle->visualid;
*value = xmctx->xm_visual->visinfo->visualid;
break;
case GLX_RENDER_TYPE:
if (xmctx->xm_visual->mesa_visual.rgbMode)

View file

@ -1,4 +1,4 @@
/* $Id: xm_api.c,v 1.50 2002/10/30 20:24:46 brianp Exp $ */
/* $Id: xm_api.c,v 1.51 2002/11/10 17:07:06 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -1494,11 +1494,6 @@ XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
return NULL;
}
MEMCPY(v->visinfo, visinfo, sizeof(*visinfo));
/* Save a copy of the pointer now so we can find this visual again
* if we need to search for it in find_glx_visual().
*/
v->vishandle = visinfo;
#endif
#ifdef XFree86Server

View file

@ -1,8 +1,8 @@
/* $Id: xmesaP.h,v 1.31 2002/10/05 18:27:41 brianp Exp $ */
/* $Id: xmesaP.h,v 1.32 2002/11/10 17:07:06 brianp Exp $ */
/*
* Mesa 3-D graphics library
* Version: 4.0.2
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
@ -71,9 +71,9 @@ struct xmesa_visual {
#ifdef XFree86Server
GLint screen_depth; /* The depth of the screen */
#else
XVisualInfo *vishandle; /* The pointer returned by glXChooseVisual */
XVisualInfo *vishandle; /* Only used in fakeglx.c */
#endif
XMesaVisualInfo visinfo; /* X's visual info */
XMesaVisualInfo visinfo; /* X's visual info (pointer to private copy) */
GLint BitsPerPixel; /* True bits per pixel for XImages */
GLint level; /* 0=normal, 1=overlay, etc */