minigbm: add format modifiers per plane

To pass the surface format parameters to EGL, we add format modifiers
which are used for dmabuf import. The vendor ID definitions are copied
from drm_fourcc.h.

BUG=chromium:478339
TEST=none

Change-Id: Ida3e6787b29af73ff534c054006f93c3bad4c5b9
Signed-off-by: Vince Hsu <vince.h@nvidia.com>
Reviewed-on: https://chromium-review.googlesource.com/346365
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
diff --git a/gbm.h b/gbm.h
index 47f4a4a..8ec9349 100644
--- a/gbm.h
+++ b/gbm.h
@@ -176,6 +176,28 @@
 #define GBM_FORMAT_YUV444	__gbm_fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */
 #define GBM_FORMAT_YVU444	__gbm_fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */
 
+/*
+ * Format Modifiers:
+ *
+ * Format modifiers describe, typically, a re-ordering or modification
+ * of the data in a plane of an FB.  This can be used to express tiled/
+ * swizzled formats, or compression, or a combination of the two.
+ *
+ * The upper 8 bits of the format modifier are a vendor-id as assigned
+ * below.  The lower 56 bits are assigned as vendor sees fit.
+ */
+
+/* Vendor Ids: */
+#define GBM_FORMAT_MOD_NONE           0
+#define GBM_FORMAT_MOD_VENDOR_INTEL   0x01
+#define GBM_FORMAT_MOD_VENDOR_AMD     0x02
+#define GBM_FORMAT_MOD_VENDOR_NV      0x03
+#define GBM_FORMAT_MOD_VENDOR_SAMSUNG 0x04
+#define GBM_FORMAT_MOD_VENDOR_QCOM    0x05
+/* add more to the end as needed */
+
+#define gbm_fourcc_mod_code(vendor, val) \
+	((((__u64)GBM_FORMAT_MOD_VENDOR_## vendor) << 56) | (val & 0x00ffffffffffffffULL))
 
 /**
  * Flags to indicate the intended use for the buffer - these are passed into
@@ -269,6 +291,9 @@
 uint32_t
 gbm_bo_get_format(struct gbm_bo *bo);
 
+uint64_t
+gbm_bo_get_format_modifier(struct gbm_bo *bo);
+
 struct gbm_device *
 gbm_bo_get_device(struct gbm_bo *bo);
 
@@ -296,6 +321,9 @@
 uint32_t
 gbm_bo_get_plane_stride(struct gbm_bo *bo, size_t plane);
 
+uint64_t
+gbm_bo_get_plane_format_modifier(struct gbm_bo *bo, size_t plane);
+
 void
 gbm_bo_set_user_data(struct gbm_bo *bo, void *data,
 		     void (*destroy_user_data)(struct gbm_bo *, void *));