Example #1
0
/*
** 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);
}
Example #3
0
/*
** 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;
}