diff options
author | Axel Davy <axel.davy@ens.fr> | 2013-11-18 22:52:22 +0100 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@intel.com> | 2013-11-19 15:38:51 +0800 |
commit | b418b13126108fe83628825b5015f348914ad5f5 (patch) | |
tree | c4f3d547118eda8e7364ba474d41b3f7337bc3e8 | |
parent | 8d242b32416fb860400ef9e9c5cf617f6875db87 (diff) |
Allow to create textured pixmaps from gbm_bo without using gem names
This implements glamor_egl_create_textured_pixmap_from_gbm_bo,
which is similar to glamor_egl_create_textured_pixmap, except
it takes a gbm_bo as argument.
Signed-off-by: Axel Davy <axel.davy@ens.fr>
Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
-rw-r--r-- | src/glamor.h | 13 | ||||
-rw-r--r-- | src/glamor_egl.c | 34 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/glamor.h b/src/glamor.h index c143c4d..927892f 100644 --- a/src/glamor.h +++ b/src/glamor.h @@ -230,6 +230,19 @@ extern _X_EXPORT Bool glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride); +/* + * @glamor_egl_create_textured_pixmap_from_bo: Try to create a textured pixmap + * from a gbm_bo. + * + * @pixmap: The pixmap need to be processed. + * @bo: a pointer on a gbm_bo structure attached to this pixmap at DDX layer. + * + * This function is similar to glamor_egl_create_textured_pixmap. + */ +extern _X_EXPORT Bool + glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap, + void *bo); + extern _X_EXPORT void glamor_egl_destroy_textured_pixmap(PixmapPtr pixmap); #endif diff --git a/src/glamor_egl.c b/src/glamor_egl.c index cd0bdc0..50b764b 100644 --- a/src/glamor_egl.c +++ b/src/glamor_egl.c @@ -315,6 +315,40 @@ done: return ret; } +Bool +glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap, void *bo) +{ + ScreenPtr screen = pixmap->drawable.pScreen; + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); + struct glamor_egl_screen_private *glamor_egl; + EGLImageKHR image; + GLuint texture; + Bool ret = FALSE; + + glamor_egl = glamor_egl_get_screen_private(scrn); + + glamor_egl_make_current(screen); + + image = glamor_egl->egl_create_image_khr(glamor_egl->display, + glamor_egl->context, + EGL_NATIVE_PIXMAP_KHR, + bo, NULL); + if (image == EGL_NO_IMAGE_KHR) { + glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY); + goto done; + } + glamor_create_texture_from_image(glamor_egl, image, &texture); + glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM); + glamor_set_pixmap_texture(pixmap, texture); + dixSetPrivate(&pixmap->devPrivates, glamor_egl_pixmap_private_key, + image); + ret = TRUE; + +done: + glamor_egl_restore_context(screen); + return ret; +} + static void _glamor_egl_destroy_pixmap_image(PixmapPtr pixmap) { |