summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChia-I Wu <olvaffe@gmail.com>2010-01-31 17:34:02 +0800
committerChia-I Wu <olvaffe@gmail.com>2010-01-31 22:20:42 +0800
commit0135e5d6c83add5e539492a4899504e33f3f2434 (patch)
treec95f8a26c519ff15fb9a92e160c0d149a6eb0ee0
parentf8f2520e88cecf21aee5023423185deea7e44b23 (diff)
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.
-rw-r--r--src/egl/main/egldisplay.h5
-rw-r--r--src/egl/main/eglimage.c10
-rw-r--r--src/egl/main/eglimage.h2
-rw-r--r--src/egl/main/eglmisc.c54
4 files changed, 60 insertions, 11 deletions
diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
index b04b094d84..8e3d53864b 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 e7a293b374..5732ef35ec 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 26bf054a07..2c0fb16d1d 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 907a057b44..984e426686 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
}