From 42eacddfc027dd8668956dd836b85e16bab4f9f4 Mon Sep 17 00:00:00 2001 From: Ben Widawsky Date: Tue, 29 Nov 2016 21:53:52 -0800 Subject: [PATCH] gbm: Export a plane getter function This will be used by clients that need to know the number of planes allocated for them on behalf of the GL or other API. The best current example of this is when an extra "plane" is allocated to store compression data for the primary plane. v2: Return 1 for cases where there is no image, ie. dumb bo (Daniel) Signed-off-by: Ben Widawsky Reviewed-by: Eric Engestrom Reviewed-by: Jason Ekstrand Acked-by: Daniel Stone --- src/gbm/backends/dri/gbm_dri.c | 27 +++++++++++++++++++++++++++ src/gbm/gbm-symbols-check | 1 + src/gbm/main/gbm.c | 10 ++++++++++ src/gbm/main/gbm.h | 3 +++ src/gbm/main/gbmint.h | 1 + 5 files changed, 42 insertions(+) diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 3faa19e3f19..9bd647fa19f 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -599,6 +599,32 @@ gbm_dri_bo_get_fd(struct gbm_bo *_bo) return fd; } +static int +get_number_planes(struct gbm_dri_device *dri, __DRIimage *image) +{ + int num_planes = 0; + + /* Dumb buffers are single-plane only. */ + if (!image) + return 1; + + dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_NUM_PLANES, &num_planes); + + if (num_planes <= 0) + num_planes = 1; + + return num_planes; +} + +static int +gbm_dri_bo_get_planes(struct gbm_bo *_bo) +{ + struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm); + struct gbm_dri_bo *bo = gbm_dri_bo(_bo); + + return get_number_planes(dri, bo->image); +} + static void gbm_dri_bo_destroy(struct gbm_bo *_bo) { @@ -1091,6 +1117,7 @@ dri_device_create(int fd) dri->base.base.is_format_supported = gbm_dri_is_format_supported; dri->base.base.bo_write = gbm_dri_bo_write; dri->base.base.bo_get_fd = gbm_dri_bo_get_fd; + dri->base.base.bo_get_planes = gbm_dri_bo_get_planes; dri->base.base.bo_destroy = gbm_dri_bo_destroy; dri->base.base.destroy = dri_destroy; dri->base.base.surface_create = gbm_dri_surface_create; diff --git a/src/gbm/gbm-symbols-check b/src/gbm/gbm-symbols-check index 5a333ffcda0..8c4da1b7ea2 100755 --- a/src/gbm/gbm-symbols-check +++ b/src/gbm/gbm-symbols-check @@ -18,6 +18,7 @@ gbm_bo_get_format gbm_bo_get_device gbm_bo_get_handle gbm_bo_get_fd +gbm_bo_get_plane_count gbm_bo_write gbm_bo_set_user_data gbm_bo_get_user_data diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c index e96297ec52e..37795175644 100644 --- a/src/gbm/main/gbm.c +++ b/src/gbm/main/gbm.c @@ -223,6 +223,16 @@ gbm_bo_get_fd(struct gbm_bo *bo) return bo->gbm->bo_get_fd(bo); } +/** Get the number of planes for the given bo. + * + * \param bo The buffer object + * \return The number of planes + */ +GBM_EXPORT int +gbm_bo_get_plane_count(struct gbm_bo *bo) +{ + return bo->gbm->bo_get_planes(bo); +} /** Write data into the buffer object * diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h index 59daaa164d1..203a2363579 100644 --- a/src/gbm/main/gbm.h +++ b/src/gbm/main/gbm.h @@ -315,6 +315,9 @@ gbm_bo_get_handle(struct gbm_bo *bo); int gbm_bo_get_fd(struct gbm_bo *bo); +int +gbm_bo_get_plane_count(struct gbm_bo *bo); + int gbm_bo_write(struct gbm_bo *bo, const void *buf, size_t count); diff --git a/src/gbm/main/gbmint.h b/src/gbm/main/gbmint.h index cfef5eea291..c6a6701464a 100644 --- a/src/gbm/main/gbmint.h +++ b/src/gbm/main/gbmint.h @@ -76,6 +76,7 @@ struct gbm_device { void (*bo_unmap)(struct gbm_bo *bo, void *map_data); int (*bo_write)(struct gbm_bo *bo, const void *buf, size_t data); int (*bo_get_fd)(struct gbm_bo *bo); + int (*bo_get_planes)(struct gbm_bo *bo); void (*bo_destroy)(struct gbm_bo *bo); struct gbm_surface *(*surface_create)(struct gbm_device *gbm, -- 2.30.2