[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