From: Ander Conselvan de Oliveira <ander.conselvan.de.olive...@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 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel