diff options
author | Chia-I Wu <olvaffe@gmail.com> | 2009-09-18 17:13:20 +0800 |
---|---|---|
committer | Chia-I Wu <olvaffe@gmail.com> | 2009-09-18 18:36:14 +0800 |
commit | 6059e6a8f25e15e934a268d1f022044736f8ba33 (patch) | |
tree | 2eb0a37925672d3ec8932efeafa75aee21011f09 /src/egl/drivers/android/egl_android.c | |
parent | 3c718c0e95583c3c080bb0e7020b39066a265fa1 (diff) |
egl_android: Add untested support for EGLImage.
Diffstat (limited to 'src/egl/drivers/android/egl_android.c')
-rw-r--r-- | src/egl/drivers/android/egl_android.c | 103 |
1 files changed, 101 insertions, 2 deletions
diff --git a/src/egl/drivers/android/egl_android.c b/src/egl/drivers/android/egl_android.c index 10c0aea3ab..e9e0114683 100644 --- a/src/egl/drivers/android/egl_android.c +++ b/src/egl/drivers/android/egl_android.c @@ -32,8 +32,6 @@ #include "eglsurface.h" #include "eglimage.h" -#include "EGL/internal/eglimage_dri.h" - #include "droid.h" #ifndef DROID_DEVICE_PATH @@ -73,6 +71,12 @@ struct droid_egl_surface { struct droid_surface *surface; }; +struct droid_egl_image { + _EGLImage base; + struct droid_drawable *drawable; + struct droid_surface *surface; +}; + struct droid_egl_config { _EGLConfig base; const __DRIconfig *config; @@ -102,6 +106,12 @@ lookup_surface(_EGLSurface *surface) return (struct droid_egl_surface *) surface; } +static INLINE struct droid_egl_image * +lookup_image(_EGLImage *image) +{ + return (struct droid_egl_image *) image; +} + static INLINE struct droid_egl_config * lookup_config(_EGLConfig *conf) { @@ -184,6 +194,14 @@ droid_eglInitialize(_EGLDriver *drv, _EGLDisplay *dpy, droid_create_configs(dpy, droid_dpy, droid_dpy->screen->dri_configs, droid_dpy->screen->num_dri_configs); +#if EGL_KHR_image_base + if (droid_dpy->backend->create_image_surface) { + dpy->Extensions.KHR_image = EGL_TRUE; + dpy->Extensions.KHR_image_base = EGL_TRUE; + dpy->Extensions.KHR_image_pixmap = EGL_TRUE; + } +#endif + droid_drv->default_display = droid_dpy; } @@ -380,6 +398,83 @@ droid_eglSwapBuffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) return EGL_TRUE; } +#if EGL_KHR_image_base + +static _EGLImage * +droid_eglCreateImageKHR(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx, + EGLenum target, EGLClientBuffer buffer, const EGLint *attr_list) +{ + struct droid_egl_display *droid_dpy = lookup_display(dpy); + struct droid_egl_image *droid_img; + const __DRIconfig *dri_conf; + int depth; + + if (target != EGL_NATIVE_PIXMAP_KHR || ctx) { + _eglError(EGL_BAD_PARAMETER, "eglCreateImageKHR"); + return NULL; + } + + droid_img = calloc(1, sizeof(*droid_img)); + if (!droid_img) { + _eglError(EGL_BAD_ALLOC, "eglCreateImageKHR"); + return NULL; + } + + if (!_eglInitImage(drv, &droid_img->base, attr_list)) { + free(droid_img); + return NULL; + } + + droid_img->surface = + droid_dpy->backend->create_image_surface(droid_dpy->backend, + (NativePixmapType) buffer, + &depth); + if (!droid_img->surface) { + free(droid_img); + return NULL; + } + + dri_conf = droid_dpy->screen->image_configs[depth]; + if (!dri_conf) { + droid_dpy->backend->destroy_surface(droid_dpy->backend, + droid_img->surface); + free(droid_img); + return NULL; + } + + droid_img->drawable = + droid_screen_create_drawable(droid_dpy->screen, dri_conf, + droid_img->surface); + + if (!droid_img->drawable) { + droid_dpy->backend->destroy_surface(droid_dpy->backend, + droid_img->surface); + free(droid_img); + return NULL; + } + + droid_img->base.ClientData = + droid_screen_get_drawable_data(droid_dpy->screen, droid_img->drawable); + + return &droid_img->base; +} + + +static EGLBoolean +droid_eglDestroyImageKHR(_EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *img) +{ + struct droid_egl_display *droid_dpy = lookup_display(dpy); + struct droid_egl_image *droid_img = lookup_image(img); + + droid_screen_destroy_drawable(droid_dpy->screen, droid_img->drawable); + droid_dpy->backend->destroy_surface(droid_dpy->backend, droid_img->surface); + free(droid_img); + + return EGL_TRUE; +} + +#endif /* EGL_KHR_image_base */ + static EGLBoolean droid_eglWaitClient(_EGLDriver *drv, _EGLDisplay *dpy) { @@ -446,6 +541,10 @@ _eglMain(const char *args) droid_drv->base.API.CreateWindowSurface = droid_eglCreateWindowSurface; droid_drv->base.API.DestroySurface = droid_eglDestroySurface; droid_drv->base.API.SwapBuffers = droid_eglSwapBuffers; +#if EGL_KHR_image_base + droid_drv->base.API.CreateImageKHR = droid_eglCreateImageKHR; + droid_drv->base.API.DestroyImageKHR = droid_eglDestroyImageKHR; +#endif /* EGL_KHR_image_base */ droid_drv->base.API.WaitClient = droid_eglWaitClient; droid_drv->base.API.WaitNative = droid_eglWaitNative; |