[RFC 1/9] gbm: add gbm_surface interface

Ander Conselvan de Oliveira conselvan2 at gmail.com
Wed Dec 14 02:00:00 PST 2011


From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>

The implementation is empty for now, but the idea here is to be able
to create an egl window surface from a gbm_surface.

gbm_surface_get_bo should return a valid bo for the current front
buffer of the surface. Getting a bo will mark it as in use until the
user call gbm_surface_release_bo. The egl platform may use this
information to do triple buffering.
---
 src/gbm/backends/dri/gbm_dri.c |   28 ++++++++++++++++++++++++++++
 src/gbm/main/gbm.c             |   26 ++++++++++++++++++++++++++
 src/gbm/main/gbm.h             |   15 +++++++++++++++
 src/gbm/main/gbmint.h          |   14 ++++++++++++++
 4 files changed, 83 insertions(+), 0 deletions(-)

diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
index 9de8cb6..d2add14 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -334,6 +334,30 @@ gbm_dri_bo_create(struct gbm_device *gbm,
    return &bo->base.base;
 }
 
+static struct gbm_surface *
+gbm_dri_surface_create(struct gbm_device *gbm,
+                       uint32_t width, uint32_t height,
+                       enum gbm_bo_format format)
+{
+   return NULL;
+}
+
+static void
+gbm_dri_surface_destroy(struct gbm_surface *_surf)
+{
+}
+
+static struct gbm_bo *
+gbm_dri_surface_get_bo(struct gbm_surface *_surf)
+{
+   return NULL;
+}
+
+static void
+gbm_dri_surface_release_bo(struct gbm_surface *_surf, struct gbm_bo *_bo)
+{
+}
+
 static void
 dri_destroy(struct gbm_device *gbm)
 {
@@ -361,6 +385,10 @@ dri_device_create(int fd)
    dri->base.base.is_format_supported = gbm_dri_is_format_supported;
    dri->base.base.bo_destroy = gbm_dri_bo_destroy;
    dri->base.base.destroy = dri_destroy;
+   dri->base.base.surface_create = gbm_dri_surface_create;
+   dri->base.base.surface_destroy = gbm_dri_surface_destroy;
+   dri->base.base.surface_get_bo = gbm_dri_surface_get_bo;
+   dri->base.base.surface_release_bo = gbm_dri_surface_release_bo;
 
    dri->base.type = GBM_DRM_DRIVER_TYPE_DRI;
    dri->base.base.name = "drm";
diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c
index 8440b2c..0be36d0 100644
--- a/src/gbm/main/gbm.c
+++ b/src/gbm/main/gbm.c
@@ -188,3 +188,29 @@ gbm_bo_create_from_egl_image(struct gbm_device *gbm,
    return gbm->bo_create_from_egl_image(gbm, egl_dpy, egl_image,
                                         width, height, usage);
 }
+
+GBM_EXPORT struct gbm_surface *
+gbm_surface_create(struct gbm_device *gbm,
+                   uint32_t width, uint32_t height,
+                   enum gbm_bo_format format)
+{
+   return gbm->surface_create(gbm, width, height, format);
+}
+
+GBM_EXPORT void
+gbm_surface_destroy(struct gbm_surface *surf)
+{
+   surf->gbm->surface_destroy(surf);
+}
+
+GBM_EXPORT struct gbm_bo *
+gbm_surface_get_bo(struct gbm_surface *surf)
+{
+   return surf->gbm->surface_get_bo(surf);
+}
+
+GBM_EXPORT void
+gbm_surface_release_bo(struct gbm_surface *surf, struct gbm_bo *bo)
+{
+   surf->gbm->surface_release_bo(surf, bo);
+}
diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
index 05d2292..da92403 100644
--- a/src/gbm/main/gbm.h
+++ b/src/gbm/main/gbm.h
@@ -39,6 +39,7 @@ extern "C" {
 
 struct gbm_device;
 struct gbm_bo;
+struct gbm_surface;
 
 union gbm_bo_handle {
    void *ptr;
@@ -102,6 +103,20 @@ gbm_bo_get_handle(struct gbm_bo *bo);
 void
 gbm_bo_destroy(struct gbm_bo *bo);
 
+struct gbm_surface *
+gbm_surface_create(struct gbm_device *gbm,
+                   uint32_t width, uint32_t height,
+                   enum gbm_bo_format format);
+
+struct gbm_bo *
+gbm_surface_get_bo(struct gbm_surface *surface);
+
+void
+gbm_surface_release_bo(struct gbm_surface *surface, struct gbm_bo *bo);
+
+void
+gbm_surface_destroy(struct gbm_surface *surface);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/gbm/main/gbmint.h b/src/gbm/main/gbmint.h
index fb8db80..31a4fc9 100644
--- a/src/gbm/main/gbmint.h
+++ b/src/gbm/main/gbmint.h
@@ -61,6 +61,13 @@ struct gbm_device {
                                               uint32_t width, uint32_t height,
                                               uint32_t usage);
    void (*bo_destroy)(struct gbm_bo *bo);
+
+   struct gbm_surface *(*surface_create)(struct gbm_device *gbm,
+                                         uint32_t width, uint32_t height,
+                                         enum gbm_bo_format format);
+   struct gbm_bo *(*surface_get_bo)(struct gbm_surface *surface);
+   void (*surface_release_bo)(struct gbm_surface *surface, struct gbm_bo *bo);
+   void (*surface_destroy)(struct gbm_surface *surface);
 };
 
 struct gbm_bo {
@@ -71,6 +78,13 @@ struct gbm_bo {
    union gbm_bo_handle  handle;
 };
 
+struct gbm_surface {
+   struct gbm_device *gbm;
+   uint32_t width;
+   uint32_t height;
+   enum gbm_bo_format format;
+};
+
 struct gbm_backend {
    const char *backend_name;
    struct gbm_device *(*create_device)(int fd);
-- 
1.7.4.1



More information about the wayland-devel mailing list