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 <ben@bwidawsk.net>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Acked-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
Ben Widawsky 2016-11-29 21:53:52 -08:00
parent 770b06588f
commit 42eacddfc0
5 changed files with 42 additions and 0 deletions

View File

@ -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;

View File

@ -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

View File

@ -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
*

View File

@ -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);

View File

@ -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,