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>tags/17.3-branchpoint
| @@ -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, | |||