Mesa (master): egl: Add support for more EGLImage extensions to EGL core.

Chia-I Wu olv at kemper.freedesktop.org
Sun Jan 31 14:19:26 UTC 2010


Module: Mesa
Branch: master
Commit: 0135e5d6c83add5e539492a4899504e33f3f2434
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0135e5d6c83add5e539492a4899504e33f3f2434

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Sun Jan 31 17:34:02 2010 +0800

egl: Add support for more EGLImage extensions to EGL core.

Add support EGL_KHR_vg_parent_image and EGL_KHR_gl_*.  This is as simple
as adding some flags that can be enabled.  Individual drivers need to
implement the extensions before enbaling the flags.

---

 src/egl/main/egldisplay.h |    5 ++++
 src/egl/main/eglimage.c   |   10 +++++++-
 src/egl/main/eglimage.h   |    2 +
 src/egl/main/eglmisc.c    |   54 ++++++++++++++++++++++++++++++++++++--------
 4 files changed, 60 insertions(+), 11 deletions(-)

diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
index b04b094..8e3d538 100644
--- a/src/egl/main/egldisplay.h
+++ b/src/egl/main/egldisplay.h
@@ -38,6 +38,11 @@ struct _egl_extensions
    EGLBoolean MESA_copy_context;
    EGLBoolean KHR_image_base;
    EGLBoolean KHR_image_pixmap;
+   EGLBoolean KHR_vg_parent_image;
+   EGLBoolean KHR_gl_texture_2D_image;
+   EGLBoolean KHR_gl_texture_cubemap_image;
+   EGLBoolean KHR_gl_texture_3D_image;
+   EGLBoolean KHR_gl_renderbuffer_image;
 
    char String[_EGL_MAX_EXTENSIONS_LEN];
 };
diff --git a/src/egl/main/eglimage.c b/src/egl/main/eglimage.c
index e7a293b..5732ef3 100644
--- a/src/egl/main/eglimage.c
+++ b/src/egl/main/eglimage.c
@@ -28,8 +28,14 @@ _eglParseImageAttribList(_EGLImage *img, const EGLint *attrib_list)
       case EGL_IMAGE_PRESERVED_KHR:
          img->Preserved = val;
          break;
+      case EGL_GL_TEXTURE_LEVEL_KHR:
+         img->GLTextureLevel = val;
+         break;
+      case EGL_GL_TEXTURE_ZOFFSET_KHR:
+         img->GLTextureZOffset = val;
+         break;
       default:
-         err = EGL_BAD_ATTRIBUTE;
+         /* unknown attrs are ignored */
          break;
       }
 
@@ -52,6 +58,8 @@ _eglInitImage(_EGLImage *img, _EGLDisplay *dpy, const EGLint *attrib_list)
    img->Resource.Display = dpy;
 
    img->Preserved = EGL_FALSE;
+   img->GLTextureLevel = 0;
+   img->GLTextureZOffset = 0;
 
    err = _eglParseImageAttribList(img, attrib_list);
    if (err != EGL_SUCCESS)
diff --git a/src/egl/main/eglimage.h b/src/egl/main/eglimage.h
index 26bf054..2c0fb16 100644
--- a/src/egl/main/eglimage.h
+++ b/src/egl/main/eglimage.h
@@ -15,6 +15,8 @@ struct _egl_image
    _EGLResource Resource;
 
    EGLBoolean Preserved;
+   EGLint GLTextureLevel;
+   EGLint GLTextureZOffset;
 };
 
 
diff --git a/src/egl/main/eglmisc.c b/src/egl/main/eglmisc.c
index 907a057..984e426 100644
--- a/src/egl/main/eglmisc.c
+++ b/src/egl/main/eglmisc.c
@@ -39,30 +39,64 @@
 
 
 /**
+ * Copy the extension into the string and update the string pointer.
+ */
+static EGLint
+_eglAppendExtension(char **str, const char *ext)
+{
+   char *s = *str;
+   EGLint len = strlen(ext);
+
+   if (s) {
+      memcpy(s, ext, len);
+      s[len++] = ' ';
+      s[len] = '\0';
+
+      *str += len;
+   }
+   else {
+      len++;
+   }
+
+   return len;
+}
+
+
+/**
  * Examine the individual extension enable/disable flags and recompute
  * the driver's Extensions string.
  */
 static void
 _eglUpdateExtensionsString(_EGLDisplay *dpy)
 {
+#define _EGL_CHECK_EXTENSION(ext)                                          \
+   do {                                                                    \
+      if (dpy->Extensions.ext) {                                           \
+         _eglAppendExtension(&exts, "EGL_" #ext);                          \
+         assert(exts <= dpy->Extensions.String + _EGL_MAX_EXTENSIONS_LEN); \
+      }                                                                    \
+   } while (0)
+
    char *exts = dpy->Extensions.String;
 
    if (exts[0])
       return;
 
-   if (dpy->Extensions.MESA_screen_surface)
-      strcat(exts, "EGL_MESA_screen_surface ");
-   if (dpy->Extensions.MESA_copy_context)
-      strcat(exts, "EGL_MESA_copy_context ");
+   _EGL_CHECK_EXTENSION(MESA_screen_surface);
+   _EGL_CHECK_EXTENSION(MESA_copy_context);
 
-   if (dpy->Extensions.KHR_image_base)
-      strcat(exts, "EGL_KHR_image_base ");
-   if (dpy->Extensions.KHR_image_pixmap)
-      strcat(exts, "EGL_KHR_image_pixmap ");
+   _EGL_CHECK_EXTENSION(KHR_image_base);
+   _EGL_CHECK_EXTENSION(KHR_image_pixmap);
    if (dpy->Extensions.KHR_image_base && dpy->Extensions.KHR_image_pixmap)
-      strcat(exts, "EGL_KHR_image ");
+      _eglAppendExtension(&exts, "EGL_KHR_image");
+
+   _EGL_CHECK_EXTENSION(KHR_vg_parent_image);
+   _EGL_CHECK_EXTENSION(KHR_gl_texture_2D_image);
+   _EGL_CHECK_EXTENSION(KHR_gl_texture_cubemap_image);
+   _EGL_CHECK_EXTENSION(KHR_gl_texture_3D_image);
+   _EGL_CHECK_EXTENSION(KHR_gl_renderbuffer_image);
 
-   assert(strlen(exts) < _EGL_MAX_EXTENSIONS_LEN);
+#undef _EGL_CHECK_EXTENSION
 }
 
 




More information about the mesa-commit mailing list