summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>2011-12-14 12:00:00 +0200
committerRobert Bragg <robert@linux.intel.com>2012-01-16 13:45:27 +0000
commit11a5392e4c0d744c75a7ac4e2a2c1b111097f4e2 (patch)
treefdfcc1c351b2ded98e653166d7a91b8bb30c79ad
parent8e3bd812d9b03f752a52327974a1035ee692016c (diff)
gbm: add gbm_surface interface
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.
-rw-r--r--src/gbm/backends/dri/gbm_dri.c28
-rw-r--r--src/gbm/main/gbm.c26
-rw-r--r--src/gbm/main/gbm.h15
-rw-r--r--src/gbm/main/gbmint.h14
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 9de8cb6116..d2add147d6 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 3e24c4af01..06e6a8c75c 100644
--- a/src/gbm/main/gbm.c
+++ b/src/gbm/main/gbm.c
@@ -292,3 +292,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 c4ae51db02..f6492959d0 100644
--- a/src/gbm/main/gbm.h
+++ b/src/gbm/main/gbm.h
@@ -44,6 +44,7 @@ extern "C" {
struct gbm_device;
struct gbm_bo;
+struct gbm_surface;
/**
* \mainpage The Generic Buffer Manager
@@ -143,6 +144,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 9e4072ef6e..bcfa2feb75 100644
--- a/src/gbm/main/gbmint.h
+++ b/src/gbm/main/gbmint.h
@@ -71,6 +71,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);
};
/**
@@ -86,6 +93,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);