egl: in _eglAddConfig() just save a pointer to the config; don't copy the config
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 4 Jun 2008 17:34:10 +0000 (11:34 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 4 Jun 2008 17:36:59 +0000 (11:36 -0600)
This allows subclassing by drivers.

src/egl/main/eglconfig.c
src/egl/main/eglconfig.h
src/egl/main/egldisplay.c
src/egl/main/egldisplay.h

index c6369e7adfaa55499ee56879c3bb0d5261dc5660..794a783b9e254ad5bc738219abe1f2c471568863 100644 (file)
@@ -78,8 +78,8 @@ _eglLookupConfig(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config)
    EGLint i;
    _EGLDisplay *disp = _eglLookupDisplay(dpy);
    for (i = 0; i < disp->NumConfigs; i++) {
-      if (disp->Configs[i].Handle == config) {
-          return disp->Configs + i;
+      if (disp->Configs[i]->Handle == config) {
+          return disp->Configs[i];
       }
    }
    return NULL;
@@ -88,23 +88,24 @@ _eglLookupConfig(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config)
 
 /**
  * Add the given _EGLConfig to the given display.
+ * Note that we just save the ptr to the config (we don't copy the config).
  */
 _EGLConfig *
-_eglAddConfig(_EGLDisplay *display, const _EGLConfig *config)
+_eglAddConfig(_EGLDisplay *display, _EGLConfig *config)
 {
-   _EGLConfig *newConfigs;
+   _EGLConfig **newConfigs;
    EGLint n;
 
    n = display->NumConfigs;
 
-   newConfigs = (_EGLConfig *) realloc(display->Configs,
-                                       (n + 1) * sizeof(_EGLConfig));
+   /* realloc array of ptrs */
+   newConfigs = (_EGLConfig **) realloc(display->Configs,
+                                        (n + 1) * sizeof(_EGLConfig *));
    if (newConfigs) {
       display->Configs = newConfigs;
-      display->Configs[n] = *config; /* copy struct */
-      display->Configs[n].Handle = (EGLConfig) n;
+      display->Configs[n] = config;
       display->NumConfigs++;
-      return display->Configs + n;
+      return config;
    }
    else {
       return NULL;
@@ -330,8 +331,8 @@ _eglChooseConfig(_EGLDriver *drv, EGLDisplay dpy, const EGLint *attrib_list,
 
    /* make array of pointers to qualifying configs */
    for (i = count = 0; i < disp->NumConfigs && count < config_size; i++) {
-      if (_eglConfigQualifies(disp->Configs + i, &criteria)) {
-         configList[count++] = disp->Configs + i;
+      if (_eglConfigQualifies(disp->Configs[i], &criteria)) {
+         configList[count++] = disp->Configs[i];
       }
    }
 
@@ -389,7 +390,7 @@ _eglGetConfigs(_EGLDriver *drv, EGLDisplay dpy, EGLConfig *configs,
       EGLint i;
       *num_config = MIN2(disp->NumConfigs, config_size);
       for (i = 0; i < *num_config; i++) {
-         configs[i] = disp->Configs[i].Handle;
+         configs[i] = disp->Configs[i]->Handle;
       }
    }
    else {
index b10a61985d11d5e256f908ee3b3ca9d78bbceb84..d12f66245c0a2bb1011709aa8a62193f1b3fcd11 100644 (file)
@@ -34,7 +34,7 @@ _eglLookupConfig(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config);
 
 
 extern _EGLConfig *
-_eglAddConfig(_EGLDisplay *display, const _EGLConfig *config);
+_eglAddConfig(_EGLDisplay *display, _EGLConfig *config);
 
 
 extern EGLBoolean
index 8fd29b842165ca2a7d176f36ae535b6052407b57..540efd4fee506cedc1bd5a1a886ffee4d1d1ef15 100644 (file)
@@ -96,11 +96,25 @@ _eglGetCurrentDisplay(void)
 }
 
 
+/**
+ * Free all the data hanging of an _EGLDisplay object, but not
+ * the object itself.
+ */
 void
 _eglCleanupDisplay(_EGLDisplay *disp)
 {
-   /* XXX incomplete */
+   EGLint i;
+
+   for (i = 0; i < disp->NumConfigs; i++) {
+      free(disp->Configs[i]);
+   }
    free(disp->Configs);
+   disp->Configs = NULL;
+
+   /* XXX incomplete */
+
    free((void *) disp->DriverName);
-   /* driver deletes _EGLDisplay */
+   disp->DriverName = NULL;
+
+   /* driver deletes the _EGLDisplay object */
 }
index e2ebab0b218fa6192968c69661271b68b2037664..ff623ee1c666474649034ae51197546a3b193ec0 100644 (file)
@@ -21,7 +21,7 @@ struct _egl_display
    _EGLScreen **Screens;  /* array [NumScreens] */
 
    EGLint NumConfigs;
-   _EGLConfig *Configs;  /* array [NumConfigs] */
+   _EGLConfig **Configs;  /* array [NumConfigs] of ptr to _EGLConfig */
 
 #ifdef _EGL_PLATFORM_X
    Display *Xdpy;