diff options
author | Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> | 2011-12-14 12:00:00 +0200 |
---|---|---|
committer | Robert Bragg <robert@linux.intel.com> | 2012-01-16 13:45:27 +0000 |
commit | 11a5392e4c0d744c75a7ac4e2a2c1b111097f4e2 (patch) | |
tree | fdfcc1c351b2ded98e653166d7a91b8bb30c79ad /src | |
parent | 8e3bd812d9b03f752a52327974a1035ee692016c (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.
Diffstat (limited to 'src')
-rw-r--r-- | src/gbm/backends/dri/gbm_dri.c | 28 | ||||
-rw-r--r-- | src/gbm/main/gbm.c | 26 | ||||
-rw-r--r-- | src/gbm/main/gbm.h | 15 | ||||
-rw-r--r-- | 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 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); |