diff options
| author | Chia-I Wu <olvaffe@gmail.com> | 2009-08-15 22:58:13 +0800 | 
|---|---|---|
| committer | Chia-I Wu <olvaffe@gmail.com> | 2010-01-25 11:28:27 +0800 | 
| commit | a1c4a8a3c855d52fbfef10023b9a8f116e163a97 (patch) | |
| tree | 4e5138454e78a3ec05d9adce04420f7c5047e427 | |
| parent | 95f8f75ad8bdb1d8e1cc16ea91fed8c407c36abd (diff) | |
egl: Add support for EGL_KHR_image.
Individual drivers still need to implement the API hooks.
| -rw-r--r-- | src/egl/main/Makefile | 2 | ||||
| -rw-r--r-- | src/egl/main/eglapi.c | 54 | ||||
| -rw-r--r-- | src/egl/main/eglapi.h | 13 | ||||
| -rw-r--r-- | src/egl/main/egldisplay.h | 3 | ||||
| -rw-r--r-- | src/egl/main/egldriver.c | 6 | ||||
| -rw-r--r-- | src/egl/main/eglimage.c | 51 | ||||
| -rw-r--r-- | src/egl/main/eglimage.h | 95 | ||||
| -rw-r--r-- | src/egl/main/eglmisc.c | 8 | ||||
| -rw-r--r-- | src/egl/main/egltypedefs.h | 2 | 
9 files changed, 233 insertions, 1 deletions
| diff --git a/src/egl/main/Makefile b/src/egl/main/Makefile index 20614d8753..5b83b43bc2 100644 --- a/src/egl/main/Makefile +++ b/src/egl/main/Makefile @@ -19,6 +19,7 @@ HEADERS = \  	egldisplay.h \  	egldriver.h \  	eglglobals.h \ +	eglimage.h \  	egllog.h \  	eglmisc.h \  	eglmode.h \ @@ -36,6 +37,7 @@ SOURCES = \  	egldisplay.c \  	egldriver.c \  	eglglobals.c \ +	eglimage.c \  	egllog.c \  	eglmisc.c \  	eglmode.c \ diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index e57ce211b8..218de3ab6b 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -65,6 +65,7 @@  #include "eglconfig.h"  #include "eglscreen.h"  #include "eglmode.h" +#include "eglimage.h"  /** @@ -700,6 +701,10 @@ eglGetProcAddress(const char *procname)        { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },        { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },  #endif /* EGL_MESA_screen_surface */ +#ifdef EGL_KHR_image_base +      { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR }, +      { "eglDestroyImageKHR", (_EGLProc) eglDestroyImageKHR }, +#endif /* EGL_KHR_image_base */        { NULL, NULL }     };     EGLint i; @@ -995,3 +1000,52 @@ eglReleaseThread(void)  #endif /* EGL_VERSION_1_2 */ + + +#ifdef EGL_KHR_image_base + + +EGLImageKHR +eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, +                  EGLClientBuffer buffer, const EGLint *attr_list) +{ +   _EGLDisplay *disp = _eglLookupDisplay(dpy); +   _EGLContext *context = _eglLookupContext(ctx, disp); +   _EGLDriver *drv; +   _EGLImage *img; + +   drv = _eglCheckDisplay(disp, __FUNCTION__); +   if (!drv) +      return EGL_NO_IMAGE_KHR; +   if (!context && ctx != EGL_NO_CONTEXT) { +      _eglError(EGL_BAD_CONTEXT, __FUNCTION__); +      return EGL_NO_IMAGE_KHR; +   } + +   img = drv->API.CreateImageKHR(drv, +         disp, context, target, buffer, attr_list); +   if (img) +      return _eglLinkImage(img, disp); +   else +      return EGL_NO_IMAGE_KHR; +} + + +EGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image) +{ +   _EGLDisplay *disp = _eglLookupDisplay(dpy); +   _EGLImage *img = _eglLookupImage(image, disp); +   _EGLDriver *drv; + +   drv = _eglCheckDisplay(disp, __FUNCTION__); +   if (!drv) +      return EGL_FALSE; +   if (!img) +      return _eglError(EGL_BAD_PARAMETER, __FUNCTION__); + +   _eglUnlinkImage(img); +   return drv->API.DestroyImageKHR(drv, disp, img); +} + + +#endif /* EGL_KHR_image_base */ diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h index 080f2155e3..bd3c3b4875 100644 --- a/src/egl/main/eglapi.h +++ b/src/egl/main/eglapi.h @@ -69,6 +69,11 @@ typedef _EGLSurface *(*CreatePbufferFromClientBuffer_t)(_EGLDriver *drv, _EGLDis  #endif /* EGL_VERSION_1_2 */ +#ifdef EGL_KHR_image_base +typedef _EGLImage *(*CreateImageKHR_t)(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attr_list); +typedef EGLBoolean (*DestroyImageKHR_t)(_EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *image); +#endif /* EGL_KHR_image_base */ +  /**   * The API dispatcher jumps through these functions @@ -104,7 +109,7 @@ struct _egl_api     WaitNative_t WaitNative;     GetProcAddress_t GetProcAddress; -   /* EGL_MESA_screen extension */ +#ifdef EGL_MESA_screen_surface     ChooseModeMESA_t ChooseModeMESA;     GetModesMESA_t GetModesMESA;     GetModeAttribMESA_t GetModeAttribMESA; @@ -117,10 +122,16 @@ struct _egl_api     QueryScreenSurfaceMESA_t QueryScreenSurfaceMESA;     QueryScreenModeMESA_t QueryScreenModeMESA;     QueryModeStringMESA_t QueryModeStringMESA; +#endif /* EGL_MESA_screen_surface */  #ifdef EGL_VERSION_1_2     CreatePbufferFromClientBuffer_t CreatePbufferFromClientBuffer;  #endif + +#ifdef EGL_KHR_image_base +   CreateImageKHR_t CreateImageKHR; +   DestroyImageKHR_t DestroyImageKHR; +#endif /* EGL_KHR_image_base */  };  #endif /* EGLAPI_INCLUDED */ diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h index b13ce08261..70fe29513c 100644 --- a/src/egl/main/egldisplay.h +++ b/src/egl/main/egldisplay.h @@ -8,6 +8,7 @@  enum _egl_resource_type {     _EGL_RESOURCE_CONTEXT,     _EGL_RESOURCE_SURFACE, +   _EGL_RESOURCE_IMAGE,     _EGL_NUM_RESOURCES  }; @@ -30,6 +31,8 @@ struct _egl_extensions  {     EGLBoolean MESA_screen_surface;     EGLBoolean MESA_copy_context; +   EGLBoolean KHR_image_base; +   EGLBoolean KHR_image_pixmap;     char String[_EGL_MAX_EXTENSIONS_LEN];  }; diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c index d997326729..b820b966f9 100644 --- a/src/egl/main/egldriver.c +++ b/src/egl/main/egldriver.c @@ -19,6 +19,7 @@  #include "eglscreen.h"  #include "eglstring.h"  #include "eglsurface.h" +#include "eglimage.h"  #if defined(_EGL_PLATFORM_POSIX)  #include <dlfcn.h> @@ -545,6 +546,11 @@ _eglInitDriverFallbacks(_EGLDriver *drv)  #ifdef EGL_VERSION_1_2     drv->API.CreatePbufferFromClientBuffer = _eglCreatePbufferFromClientBuffer;  #endif /* EGL_VERSION_1_2 */ + +#ifdef EGL_KHR_image_base +   drv->API.CreateImageKHR = _eglCreateImageKHR; +   drv->API.DestroyImageKHR = _eglDestroyImageKHR; +#endif /* EGL_KHR_image_base */  } diff --git a/src/egl/main/eglimage.c b/src/egl/main/eglimage.c new file mode 100644 index 0000000000..5044112fa8 --- /dev/null +++ b/src/egl/main/eglimage.c @@ -0,0 +1,51 @@ +#include <assert.h> + +#include "eglimage.h" +#include "egldisplay.h" + + +#ifdef EGL_KHR_image_base + + +EGLBoolean +_eglInitImage(_EGLDriver *drv, _EGLImage *img, const EGLint *attrib_list) +{ +   EGLint i; + +   img->Preserved = EGL_FALSE; + +   for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) { +      switch (attrib_list[i]) { +      case EGL_IMAGE_PRESERVED_KHR: +         i++; +         img->Preserved = attrib_list[i]; +         break; +      default: +         /* not an error */ +         break; +      } +   } + +   return EGL_TRUE; +} + + +_EGLImage * +_eglCreateImageKHR(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx, +                   EGLenum target, EGLClientBuffer buffer, +                   const EGLint *attr_list) +{ +   /* driver should override this function */ +   return NULL; +} + + +EGLBoolean +_eglDestroyImageKHR(_EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *image) +{ +   /* driver should override this function */ +   return EGL_FALSE; +} + + +#endif /* EGL_KHR_image_base */ diff --git a/src/egl/main/eglimage.h b/src/egl/main/eglimage.h new file mode 100644 index 0000000000..026b10307d --- /dev/null +++ b/src/egl/main/eglimage.h @@ -0,0 +1,95 @@ +#ifndef EGLIMAGE_INCLUDED +#define EGLIMAGE_INCLUDED + + +#include "egltypedefs.h" +#include "egldisplay.h" + + +/** + * "Base" class for device driver images. + */ +struct _egl_image +{ +   /* An image is a display resource */ +   _EGLResource Resource; + +   EGLBoolean Preserved; +}; + + +PUBLIC EGLBoolean +_eglInitImage(_EGLDriver *drv, _EGLImage *img, const EGLint *attrib_list); + + +extern _EGLImage * +_eglCreateImageKHR(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx, +                   EGLenum target, EGLClientBuffer buffer, const EGLint *attr_list); + + +extern EGLBoolean +_eglDestroyImageKHR(_EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *image); + + +/** + * Link an image to a display and return the handle of the link. + * The handle can be passed to client directly. + */ +static INLINE EGLImageKHR +_eglLinkImage(_EGLImage *img, _EGLDisplay *dpy) +{ +   _eglLinkResource(&img->Resource, _EGL_RESOURCE_IMAGE, dpy); +   return (EGLImageKHR) img; +} + + +/** + * Unlink a linked image from its display. + * Accessing an unlinked image should generate EGL_BAD_PARAMETER error. + */ +static INLINE void +_eglUnlinkImage(_EGLImage *img) +{ +   _eglUnlinkResource(&img->Resource, _EGL_RESOURCE_IMAGE); +} + + +/** + * Lookup a handle to find the linked image. + * Return NULL if the handle has no corresponding linked image. + */ +static INLINE _EGLImage * +_eglLookupImage(EGLImageKHR image, _EGLDisplay *dpy) +{ +   _EGLResource *res = (_EGLResource *) image; +   _EGLImage *img = (_EGLImage *) image; +   if (!res || !dpy || !_eglCheckResource(res, _EGL_RESOURCE_IMAGE, dpy)) +      img = NULL; +   return img; +} + + +/** + * Return the handle of a linked image, or EGL_NO_IMAGE_KHR. + */ +static INLINE EGLImageKHR +_eglGetImageHandle(_EGLImage *img) +{ +   _EGLResource *res = (_EGLResource *) img; +   return (res && _eglIsResourceLinked(res)) ? +      (EGLImageKHR) img : EGL_NO_IMAGE_KHR; +} + + +/** + * Return true if the image is linked to a display. + */ +static INLINE EGLBoolean +_eglIsImageLinked(_EGLImage *img) +{ +   _EGLResource *res = (_EGLResource *) img; +   return (res && _eglIsResourceLinked(res)); +} + + +#endif /* EGLIMAGE_INCLUDED */ diff --git a/src/egl/main/eglmisc.c b/src/egl/main/eglmisc.c index e66913320b..5726f5bca8 100644 --- a/src/egl/main/eglmisc.c +++ b/src/egl/main/eglmisc.c @@ -54,6 +54,14 @@ _eglUpdateExtensionsString(_EGLDisplay *dpy)        strcat(exts, "EGL_MESA_screen_surface ");     if (dpy->Extensions.MESA_copy_context)        strcat(exts, "EGL_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 "); +   if (dpy->Extensions.KHR_image_base && dpy->Extensions.KHR_image_pixmap) +      strcat(exts, "EGL_KHR_image "); +     assert(strlen(exts) < _EGL_MAX_EXTENSIONS_LEN);  } diff --git a/src/egl/main/egltypedefs.h b/src/egl/main/egltypedefs.h index a49ffbb0cd..e6b19b35d0 100644 --- a/src/egl/main/egltypedefs.h +++ b/src/egl/main/egltypedefs.h @@ -22,6 +22,8 @@ typedef struct _egl_driver _EGLDriver;  typedef struct _egl_extensions _EGLExtensions; +typedef struct _egl_image _EGLImage; +  typedef struct _egl_mode _EGLMode;  typedef struct _egl_resource _EGLResource; | 
