diff options
author | Chia-I Wu <olvaffe@gmail.com> | 2010-01-31 17:34:02 +0800 |
---|---|---|
committer | Chia-I Wu <olvaffe@gmail.com> | 2010-01-31 22:20:42 +0800 |
commit | 0135e5d6c83add5e539492a4899504e33f3f2434 (patch) | |
tree | c95f8a26c519ff15fb9a92e160c0d149a6eb0ee0 /src/egl | |
parent | f8f2520e88cecf21aee5023423185deea7e44b23 (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.
Diffstat (limited to 'src/egl')
-rw-r--r-- | src/egl/main/egldisplay.h | 5 | ||||
-rw-r--r-- | src/egl/main/eglimage.c | 10 | ||||
-rw-r--r-- | src/egl/main/eglimage.h | 2 | ||||
-rw-r--r-- | 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 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 } |