/* ** Allocate the memory for the per screen configs for each screen. ** If that works then fetch the per screen configs data. */ static Bool AllocAndFetchScreenConfigs(Display * dpy, __GLXdisplayPrivate * priv) { __GLXscreenConfigs *psc; GLint i, screens; /* ** First allocate memory for the array of per screen configs. */ screens = ScreenCount(dpy); psc = (__GLXscreenConfigs *) Xmalloc(screens * sizeof(__GLXscreenConfigs)); if (!psc) { return GL_FALSE; } memset(psc, 0, screens * sizeof(__GLXscreenConfigs)); priv->screenConfigs = psc; priv->serverGLXversion = __glXQueryServerString(dpy, priv->majorOpcode, 0, GLX_VERSION); if (priv->serverGLXversion == NULL) { FreeScreenConfigs(priv); return GL_FALSE; } for (i = 0; i < screens; i++, psc++) { getVisualConfigs(dpy, priv, i); getFBConfigs(dpy, priv, i); #ifdef GLX_DIRECT_RENDERING psc->scr = i; psc->dpy = dpy; psc->drawHash = __glxHashCreate(); if (psc->drawHash == NULL) continue; if (priv->dri2Display) psc->driScreen = (*priv->dri2Display->createScreen) (psc, i, priv); if (psc->driScreen == NULL && priv->driDisplay) psc->driScreen = (*priv->driDisplay->createScreen) (psc, i, priv); if (psc->driScreen == NULL && priv->driswDisplay) psc->driScreen = (*priv->driswDisplay->createScreen) (psc, i, priv); if (psc->driScreen == NULL) { __glxHashDestroy(psc->drawHash); psc->drawHash = NULL; } #endif } SyncHandle(); return GL_TRUE; }
static void glx_display_free(struct glx_display *priv) { struct glx_context *gc; gc = __glXGetCurrentContext(); if (priv->dpy == gc->currentDpy) { gc->vtable->destroy(gc); __glXSetCurrentContextNull(); } FreeScreenConfigs(priv); if (priv->serverGLXvendor) Xfree((char *) priv->serverGLXvendor); if (priv->serverGLXversion) Xfree((char *) priv->serverGLXversion); __glxHashDestroy(priv->glXDrawHash); #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) __glxHashDestroy(priv->drawHash); /* Free the direct rendering per display data */ if (priv->driswDisplay) (*priv->driswDisplay->destroyDisplay) (priv->driswDisplay); priv->driswDisplay = NULL; if (priv->driDisplay) (*priv->driDisplay->destroyDisplay) (priv->driDisplay); priv->driDisplay = NULL; if (priv->dri2Display) (*priv->dri2Display->destroyDisplay) (priv->dri2Display); priv->dri2Display = NULL; #endif Xfree((char *) priv); }
/* ** Free the per screen configs data as well as the array of ** __glXScreenConfigs. */ static void FreeScreenConfigs(__GLXdisplayPrivate * priv) { __GLXscreenConfigs *psc; GLint i, screens; /* Free screen configuration information */ psc = priv->screenConfigs; screens = ScreenCount(priv->dpy); for (i = 0; i < screens; i++, psc++) { if (psc->configs) { _gl_context_modes_destroy(psc->configs); if (psc->effectiveGLXexts) Xfree(psc->effectiveGLXexts); psc->configs = NULL; /* NOTE: just for paranoia */ } if (psc->visuals) { _gl_context_modes_destroy(psc->visuals); psc->visuals = NULL; /* NOTE: just for paranoia */ } Xfree((char *) psc->serverGLXexts); #ifdef GLX_DIRECT_RENDERING if (psc->driver_configs) { unsigned int j; for (j = 0; psc->driver_configs[j]; j++) free((__DRIconfig *) psc->driver_configs[j]); free(psc->driver_configs); psc->driver_configs = NULL; } if (psc->driScreen) { psc->driScreen->destroyScreen(psc); __glxHashDestroy(psc->drawHash); XFree(psc->driScreen); psc->driScreen = NULL; } #endif } XFree((char *) priv->screenConfigs); priv->screenConfigs = NULL; }