st/egl: Add support for EGL_MATCH_NATIVE_PIXMAP.
authorChia-I Wu <olv@lunarg.com>
Wed, 3 Nov 2010 08:49:47 +0000 (16:49 +0800)
committerChia-I Wu <olv@lunarg.com>
Wed, 3 Nov 2010 09:17:29 +0000 (17:17 +0800)
Added for completeness.  It makes sense to have such mechanism, but I am
not aware of any user of that..

src/egl/main/eglarray.h
src/gallium/state_trackers/egl/common/egl_g3d_api.c

index fe92efc11ee25913c9169fb5d4507d0f8f339911..c8309fb066a760be3e0554ff01002382d4a31ae4 100644 (file)
@@ -37,7 +37,7 @@ void *
 _eglFindArray(_EGLArray *array, void *elem);
 
 
-void **
+PUBLIC void **
 _eglFilterArray(_EGLArray *array, EGLint *size,
                 _EGLArrayForEach filter, void *filter_data);
 
index 8fc9d1cb93d47a929ae42072a02eb366a1399716..fd7dc8f81497f7f91d03d814967b7d0f19603d74 100644 (file)
@@ -97,6 +97,70 @@ egl_g3d_choose_st(_EGLDriver *drv, _EGLContext *ctx,
    return stapi;
 }
 
+static int
+egl_g3d_compare_config(const _EGLConfig *conf1, const _EGLConfig *conf2,
+                       void *priv_data)
+{
+   const _EGLConfig *criteria = (const _EGLConfig *) priv_data;
+
+   /* EGL_NATIVE_VISUAL_TYPE ignored? */
+   return _eglCompareConfigs(conf1, conf2, criteria, EGL_TRUE);
+}
+
+static EGLBoolean
+egl_g3d_match_config(const _EGLConfig *conf, const _EGLConfig *criteria)
+{
+   if (!_eglMatchConfig(conf, criteria))
+      return EGL_FALSE;
+
+   if (criteria->MatchNativePixmap != EGL_NONE &&
+       criteria->MatchNativePixmap != EGL_DONT_CARE) {
+      struct egl_g3d_display *gdpy = egl_g3d_display(conf->Display);
+      struct egl_g3d_config *gconf = egl_g3d_config(conf);
+      EGLNativePixmapType pix =
+         (EGLNativePixmapType) criteria->MatchNativePixmap;
+
+      if (!gdpy->native->is_pixmap_supported(gdpy->native, pix, gconf->native))
+         return EGL_FALSE;
+   }
+
+   return EGL_TRUE;
+}
+
+static EGLBoolean
+egl_g3d_choose_config(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attribs,
+                      EGLConfig *configs, EGLint size, EGLint *num_configs)
+{
+   _EGLConfig **tmp_configs, criteria;
+   EGLint tmp_size, i;
+
+   if (!num_configs)
+      return _eglError(EGL_BAD_PARAMETER, "eglChooseConfigs");
+
+   if (!_eglParseConfigAttribList(&criteria, dpy, attribs))
+      return _eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig");
+
+   tmp_configs = (_EGLConfig **) _eglFilterArray(dpy->Configs, &tmp_size,
+         (_EGLArrayForEach) egl_g3d_match_config, (void *) &criteria);
+   if (!tmp_configs)
+      return _eglError(EGL_BAD_ALLOC, "eglChooseConfig(out of memory)");
+
+   /* perform sorting of configs */
+   if (tmp_configs && tmp_size) {
+      _eglSortConfigs((const _EGLConfig **) tmp_configs, tmp_size,
+            egl_g3d_compare_config, (void *) &criteria);
+      size = MIN2(tmp_size, size);
+      for (i = 0; i < size; i++)
+         configs[i] = _eglGetConfigHandle(tmp_configs[i]);
+   }
+
+   free(tmp_configs);
+
+   *num_configs = size;
+
+   return EGL_TRUE;
+}
+
 static _EGLContext *
 egl_g3d_create_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf,
                        _EGLContext *share, const EGLint *attribs)
@@ -840,6 +904,8 @@ egl_g3d_init_driver_api(_EGLDriver *drv)
 {
    _eglInitDriverFallbacks(drv);
 
+   drv->API.ChooseConfig = egl_g3d_choose_config;
+
    drv->API.CreateContext = egl_g3d_create_context;
    drv->API.DestroyContext = egl_g3d_destroy_context;
    drv->API.CreateWindowSurface = egl_g3d_create_window_surface;