gbm: Add a gbm_device_get_format_modifier_plane_count function
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 16 Aug 2017 18:54:11 +0000 (11:54 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 14 Sep 2017 21:47:39 +0000 (14:47 -0700)
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>
src/gbm/backends/dri/gbm_dri.c
src/gbm/main/gbm.c
src/gbm/main/gbm.h
src/gbm/main/gbmint.h

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;
index df61ff677482d4c710319375ca815c22b5088d67..0bf2922bacdd408035049111cf30a464d3dfc010 100644 (file)
@@ -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()
index aed26a0162106b7794935717ae1df3efb740e4e9..7710e61b1324b8b5fd0266931cba0d73963566dd 100644 (file)
@@ -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);
 
index c27a7a560aee468056d127e172e2f5a98a41d2a6..9220a4ae87da8e9bd485498cb38ec6a53a08c754 100644 (file)
@@ -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,