gbm: Add a gbm_device_get_format_modifier_plane_count function
[mesa.git] / src / gbm / backends / dri / gbm_dri.c
index 462852456584ac5289775ceb4d184952230c0d1f..0a4853bf63d035dc28f4476cfb6374ae8db3b082 100644 (file)
@@ -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;