gbm: Add a gbm_device_get_format_modifier_plane_count function
This allows the user to query the number of planes required by a given format+modifier combination without having to create a bo or surface. Reviewed-by: Emil Velikov <emil.velikov@collabora.com> Reviewed-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
parent
0a25a417ce
commit
8824141b8d
|
@ -639,6 +639,30 @@ gbm_dri_is_format_supported(struct gbm_device *gbm,
|
|||
return (count > 0);
|
||||
}
|
||||
|
||||
static int
|
||||
gbm_dri_get_format_modifier_plane_count(struct gbm_device *gbm,
|
||||
uint32_t format,
|
||||
uint64_t modifier)
|
||||
{
|
||||
struct gbm_dri_device *dri = gbm_dri_device(gbm);
|
||||
uint64_t plane_count;
|
||||
|
||||
if (dri->image->base.version < 16 ||
|
||||
!dri->image->queryDmaBufFormatModifierAttribs)
|
||||
return -1;
|
||||
|
||||
format = gbm_format_canonicalize(format);
|
||||
if (gbm_format_to_dri_format(format) == 0)
|
||||
return -1;
|
||||
|
||||
if (!dri->image->queryDmaBufFormatModifierAttribs(
|
||||
dri->screen, format, modifier,
|
||||
__DRI_IMAGE_FORMAT_MODIFIER_ATTRIB_PLANE_COUNT, &plane_count))
|
||||
return -1;
|
||||
|
||||
return plane_count;
|
||||
}
|
||||
|
||||
static int
|
||||
gbm_dri_bo_write(struct gbm_bo *_bo, const void *buf, size_t count)
|
||||
{
|
||||
|
@ -1350,6 +1374,8 @@ dri_device_create(int fd)
|
|||
dri->base.bo_map = gbm_dri_bo_map;
|
||||
dri->base.bo_unmap = gbm_dri_bo_unmap;
|
||||
dri->base.is_format_supported = gbm_dri_is_format_supported;
|
||||
dri->base.get_format_modifier_plane_count =
|
||||
gbm_dri_get_format_modifier_plane_count;
|
||||
dri->base.bo_write = gbm_dri_bo_write;
|
||||
dri->base.bo_get_fd = gbm_dri_bo_get_fd;
|
||||
dri->base.bo_get_planes = gbm_dri_bo_get_planes;
|
||||
|
|
|
@ -85,6 +85,20 @@ gbm_device_is_format_supported(struct gbm_device *gbm,
|
|||
return gbm->is_format_supported(gbm, format, usage);
|
||||
}
|
||||
|
||||
/** Get the number of planes that are required for a given format+modifier
|
||||
*
|
||||
* \param gbm The gbm device returned from gbm_create_device()
|
||||
* \param format The format to query
|
||||
* \param modifier The modifier to query
|
||||
*/
|
||||
GBM_EXPORT int
|
||||
gbm_device_get_format_modifier_plane_count(struct gbm_device *gbm,
|
||||
uint32_t format,
|
||||
uint64_t modifier)
|
||||
{
|
||||
return gbm->get_format_modifier_plane_count(gbm, format, modifier);
|
||||
}
|
||||
|
||||
/** Destroy the gbm device and free all resources associated with it.
|
||||
*
|
||||
* \param gbm The device created using gbm_create_device()
|
||||
|
|
|
@ -238,6 +238,11 @@ int
|
|||
gbm_device_is_format_supported(struct gbm_device *gbm,
|
||||
uint32_t format, uint32_t usage);
|
||||
|
||||
int
|
||||
gbm_device_get_format_modifier_plane_count(struct gbm_device *gbm,
|
||||
uint32_t format,
|
||||
uint64_t modifier);
|
||||
|
||||
void
|
||||
gbm_device_destroy(struct gbm_device *gbm);
|
||||
|
||||
|
|
|
@ -61,6 +61,9 @@ struct gbm_device {
|
|||
int (*is_format_supported)(struct gbm_device *gbm,
|
||||
uint32_t format,
|
||||
uint32_t usage);
|
||||
int (*get_format_modifier_plane_count)(struct gbm_device *device,
|
||||
uint32_t format,
|
||||
uint64_t modifier);
|
||||
|
||||
struct gbm_bo *(*bo_create)(struct gbm_device *gbm,
|
||||
uint32_t width, uint32_t height,
|
||||
|
|
Loading…
Reference in New Issue