This change is a real bugfix. It fixes a crash which occured due to an uninitialized function pointer.
Please note: This is already fixed in the current CVS version of Mesa.
--- src/mesa/drivers/x11/xm_tri.c 2006/05/15 08:28:11
+++ src/mesa/drivers/x11/xm_tri.c 2006/05/18 11:39:21
@@ -1609,22 +1609,28 @@
USE(flat_DITHER_triangle);
case PF_Lookup:
if (depth == 8)
USE(flat_LOOKUP8_triangle);
else
return (swrast_tri_func) NULL;
default:
return (swrast_tri_func) NULL;
}
}
+
+ /* CLI fix crash */
+ return (swrast_tri_func) NULL;
+ } else {
+ /* draw to pixmap */
+ return (swrast_tri_func) NULL;
}
-
+ /* CLI fix crash end of change*/
#else
return (swrast_tri_func) NULL;
#endif /* CHAN_BITS == 8 */
}
/* Override for the swrast tri-selection function. Try to use one
* of our internal tri functions, otherwise fall back to the
* standard swrast functions.
*/
This change is a hack which works around a bug and only works if Mesa is used inside an Xserver to implement GLX.
The following two diffs apply to the Xserver code:
--- GL/glx/glxutil.c 2006/05/19 12:23:58
+++ GL/glx/glxutil.c 2006/05/20 04:06:29
@@ -67,20 +67,26 @@
__glXRefDrawable(glxc->drawPriv);
glxc->nextReadPriv = glxc->readPriv->readGlxc;
glxc->readPriv->readGlxc = glxc;
__glXRefDrawable(glxc->readPriv);
}
+/* hack: bypass function pointers in __GLXcontext which should have
+ been declared for these operations */
+extern void __glXSetDrawBufferToNull( __GLXcontext *baseContext );
+
+extern void __glXSetReadBufferToNull( __GLXcontext *baseContext );
+
/*
** Deassociate a context from a drawable
*/
void
__glXDeassociateContext(__GLXcontext *glxc)
{
__GLXcontext *curr, *prev;
prev = NULL;
for ( curr = glxc->drawPriv->drawGlxc
@@ -88,38 +94,42 @@
; prev = curr, curr = curr->nextDrawPriv ) {
if (curr == glxc) {
/* found context. Deassociate. */
if (prev == NULL) {
glxc->drawPriv->drawGlxc = curr->nextDrawPriv;
} else {
prev->nextDrawPriv = curr->nextDrawPriv;
}
curr->nextDrawPriv = NULL;
__glXUnrefDrawable(glxc->drawPriv);
+ glxc->drawPriv = NULL;
+ __glXSetDrawBufferToNull(glxc);
break;
}
}
prev = NULL;
for ( curr = glxc->readPriv->readGlxc
; curr != NULL
; prev = curr, curr = curr->nextReadPriv ) {
if (curr == glxc) {
/* found context. Deassociate. */
if (prev == NULL) {
glxc->readPriv->readGlxc = curr->nextReadPriv;
} else {
prev->nextReadPriv = curr->nextReadPriv;
}
curr->nextReadPriv = NULL;
__glXUnrefDrawable(glxc->readPriv);
+ glxc->readPriv = NULL;
+ __glXSetReadBufferToNull(glxc);
break;
}
}
}
/*****************************************************************************/
/* Drawable private stuff */
void
__glXRefDrawable(__GLXdrawable *glxPriv)
--- GL/mesa/X/xf86glx.c 2006/05/19 12:24:18
+++ GL/mesa/X/xf86glx.c 2006/05/19 13:42:32
@@ -207,20 +207,34 @@
{
__GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
__GLXMESAdrawable *drawPriv = (__GLXMESAdrawable *) context->base.drawPriv;
__GLXMESAdrawable *readPriv = (__GLXMESAdrawable *) context->base.readPriv;
return XMesaMakeCurrent2(context->xmesa,
drawPriv->xm_buf,
readPriv->xm_buf);
}
+void
+__glXSetDrawBufferToNull( __GLXcontext *baseContext )
+{
+ __GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
+ XMesaSetDrawBufferToNull(context->xmesa);
+}
+
+void
+__glXSetReadBufferToNull( __GLXcontext *baseContext )
+{
+ __GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
+ XMesaSetReadBufferToNull(context->xmesa);
+}
+
static int
__glXMesaContextLoseCurrent(__GLXcontext *baseContext)
{
__GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
return XMesaLoseCurrent(context->xmesa);
}
static int
__glXMesaContextCopy(__GLXcontext *baseDst,
The following two diffs apply to Mesa:
--- src/mesa/drivers/x11/xm_api.c 2006/05/15 08:28:09
+++ src/mesa/drivers/x11/xm_api.c 2006/05/19 13:42:32
@@ -2092,20 +2092,33 @@
/* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
drawBuffer->wasCurrent = GL_TRUE;
}
else {
/* Detach */
_mesa_make_current( NULL, NULL, NULL );
}
return GL_TRUE;
}
+void XMesaSetDrawBufferToNull( XMesaContext c )
+{
+ if ( c ) {
+ c->mesa.DrawBuffer = NULL;
+ }
+}
+
+void XMesaSetReadBufferToNull( XMesaContext c )
+{
+ if ( c ) {
+ c->mesa.ReadBuffer = NULL;
+ }
+}
/*
* Unbind the context c from its buffer.
*/
GLboolean XMesaUnbindContext( XMesaContext c )
{
/* A no-op for XFree86 integration purposes */
return GL_TRUE;
}
--- include/GL/xmesa.h 2006/05/15 08:15:39
+++ include/GL/xmesa.h 2006/05/19 13:42:31
@@ -219,20 +219,30 @@
/*
* Bind two buffers (read and draw) to a context and make the
* context the current one.
* New in Mesa 3.3
*/
extern GLboolean XMesaMakeCurrent2( XMesaContext c,
XMesaBuffer drawBuffer,
XMesaBuffer readBuffer );
+/*
+ * Set the draw buffer to NULL (because it was already deallocated)
+ */
+void XMesaSetDrawBufferToNull( XMesaContext c );
+
+/*
+ * Set the read buffer to NULL (because it was already deallocated)
+ */
+void XMesaSetReadBufferToNull( XMesaContext c );
+
/*
* Unbind the current context from its buffer.
*/
extern GLboolean XMesaUnbindContext( XMesaContext c );
/*
* Return a handle to the current context.
*/
Tutorial | Features | Download | Get Free Trial | Buy | Support