XQuartz: GL: Fix a problem with uninitialized data in __glXAquaScreenProbe.

I added a memset to fix the issue with an uninitialized function pointer,
and potentially other GLX data in ->base.

Also use xalloc and xfree, instead of malloc.

Enable the alpha bits from the __GLcontextModes.  The alphaBits are no
longer always 0 as the previous comment eluded to.

Add some commentary about how some of the data structures work.

Cleanup some of the GLAQUA_DEBUG_MSG.

This was tested with various Mesa demos in a variety of situations over
indirect.
This commit is contained in:
George Staplin 2009-03-02 01:22:15 -07:00
parent 3e2427e6e9
commit 99babae132

View File

@ -144,6 +144,15 @@ typedef struct __GLXAquaScreen __GLXAquaScreen;
typedef struct __GLXAquaContext __GLXAquaContext;
typedef struct __GLXAquaDrawable __GLXAquaDrawable;
/*
* The following structs must keep the base as the first member.
* It's used to treat the start of the struct as a different struct
* in GLX.
*
* Note: these structs should be initialized with xcalloc or memset
* prior to usage, and some of them require initializing
* the base with function pointers.
*/
struct __GLXAquaScreen {
__GLXscreen base;
int index;
@ -162,7 +171,7 @@ struct __GLXAquaContext {
};
struct __GLXAquaDrawable {
__GLXdrawable base;
__GLXdrawable base;
DrawablePtr pDraw;
xp_surface_id sid;
};
@ -178,8 +187,9 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
GLAQUA_DEBUG_MSG("glXAquaScreenCreateContext\n");
context = malloc (sizeof (__GLXAquaContext));
if (context == NULL) return NULL;
context = xalloc(sizeof *context);
if (context == NULL)
return NULL;
memset(context, 0, sizeof *context);
@ -195,7 +205,7 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
context->pixelFormat = makeFormat(modes);
if (!context->pixelFormat) {
free(context);
xfree(context);
return NULL;
}
@ -207,7 +217,7 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
if (gl_err != 0) {
ErrorF("CGLCreateContext error: %s\n", CGLErrorString(gl_err));
CGLDestroyPixelFormat(context->pixelFormat);
free(context);
xfree(context);
return NULL;
}
@ -238,8 +248,7 @@ static void __glXAquaContextDestroy(__GLXcontext *baseContext) {
__GLXAquaContext *context = (__GLXAquaContext *) baseContext;
GLAQUA_DEBUG_MSG("glAquaContextDestroy (ctx 0x%x)\n",
(unsigned int) baseContext);
GLAQUA_DEBUG_MSG("%s(ctx %p)\n", __func__, (void *)baseContext);
if (context != NULL) {
if (context->sid != 0 && surface_hash != NULL) {
lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(context->sid), NULL);
@ -247,11 +256,13 @@ static void __glXAquaContextDestroy(__GLXcontext *baseContext) {
x_hash_table_insert(surface_hash, x_cvt_uint_to_vptr(context->sid), lst);
}
if (context->ctx != NULL) CGLDestroyContext(context->ctx);
if (context->ctx != NULL)
CGLDestroyContext(context->ctx);
if (context->pixelFormat != NULL) CGLDestroyPixelFormat(context->pixelFormat);
if (context->pixelFormat != NULL)
CGLDestroyPixelFormat(context->pixelFormat);
free(context);
xfree(context);
}
}
@ -264,7 +275,11 @@ static int __glXAquaContextLoseCurrent(__GLXcontext *baseContext) {
if (gl_err != 0)
ErrorF("CGLSetCurrentContext error: %s\n", CGLErrorString(gl_err));
__glXLastContext = NULL; // Mesa does this; why?
/*
* There should be no need to set __glXLastContext to NULL here, because
* glxcmds.c does it as part of the context cache flush after calling
* this.
*/
return GL_TRUE;
}
@ -282,7 +297,7 @@ static void surface_notify(void *_arg, void *data) {
return;
}
GLAQUA_DEBUG_MSG("surface_notify(%p, %p)\n", _arg, data);
GLAQUA_DEBUG_MSG("%s(%p, %p)\n", __func__, (void *)_arg, (void *)data);
switch (arg->kind) {
case AppleDRISurfaceNotifyDestroyed:
if (surface_hash != NULL)
@ -301,9 +316,10 @@ static void surface_notify(void *_arg, void *data) {
}
}
break;
default:
ErrorF("surface_notify: unknown kind %d\n", arg->kind);
break;
default:
ErrorF("surface_notify: unknown kind %d\n", arg->kind);
break;
}
}
@ -495,7 +511,7 @@ static CGLPixelFormatObj makeFormat(__GLcontextModes *mode) {
attr[i++] = kCGLPFAColorSize;
attr[i++] = mode->redBits + mode->greenBits + mode->blueBits;
attr[i++] = kCGLPFAAlphaSize;
attr[i++] = 1; /* FIXME: ignoring mode->alphaBits which is always 0 */
attr[i++] = mode->alphaBits;
}
if (mode->haveAccumBuffer) {
@ -1102,7 +1118,7 @@ static void fixup_visuals(int screen)
#endif
static void __glXAquaScreenDestroy(__GLXscreen *screen) {
GLAQUA_DEBUG_MSG("glXAquaScreenDestroy(%p)\n", screen);
GLAQUA_DEBUG_MSG("%s(%p)\n", __func__, screen);
__glXScreenDestroy(screen);
free(screen);
@ -1171,9 +1187,16 @@ static void init_screen_visuals(__GLXAquaScreen *screen) {
static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen) {
__GLXAquaScreen *screen;
GLAQUA_DEBUG_MSG("glXAquaScreenProbe\n");
if (pScreen == NULL) return NULL;
screen = malloc(sizeof *screen);
if (pScreen == NULL)
return NULL;
screen = xalloc(sizeof *screen);
if(NULL == screen)
return NULL;
memset(screen, 0, sizeof *screen);
__glXScreenInit(&screen->base, pScreen);
@ -1203,7 +1226,7 @@ static void __glXAquaDrawableDestroy(__GLXdrawable *base) {
already gone.. But dri.c notices the window destruction and
frees the surface itself. */
free(base);
xfree(base);
}
static __GLXdrawable *
@ -1213,10 +1236,13 @@ __glXAquaScreenCreateDrawable(__GLXscreen *screen,
__GLcontextModes *modes) {
__GLXAquaDrawable *glxPriv;
GLAQUA_DEBUG_MSG("glAquaScreenCreateDrawable(%p,%p,%d,%p)\n", context, pDraw, drawId, modes);
GLAQUA_DEBUG_MSG("%s(%p,%p,0x%lx,%p)\n", __func__, (void *)context,
(void *)pDraw, drawId, (void *)modes);
glxPriv = xalloc(sizeof *glxPriv);
if (glxPriv == NULL) return NULL;
if (glxPriv == NULL)
return NULL;
memset(glxPriv, 0, sizeof *glxPriv);
@ -1259,6 +1285,8 @@ void warn_func(void * p1, char *format, ...) {
va_end(v);
}
static void setup_dispatch_table(void) {
struct _glapi_table *disp=_glapi_get_dispatch();
_glapi_set_warning_func((_glapi_warning_func)warn_func);