Allow to create textured pixmaps from gbm_bo without using gem names
authorAxel Davy <axel.davy@ens.fr>
Mon, 18 Nov 2013 21:52:22 +0000 (22:52 +0100)
committerEric Anholt <eric@anholt.net>
Wed, 18 Dec 2013 19:23:54 +0000 (11:23 -0800)
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>
glamor/glamor.h
glamor/glamor_egl.c

index c143c4d..927892f 100644 (file)
@@ -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
 
index cd0bdc0..50b764b 100644 (file)
@@ -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)
 {