summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVince Hsu <vince.h@nvidia.com>2016-05-23 10:32:25 +0800
committerchrome-bot <chrome-bot@chromium.org>2016-05-29 22:03:31 -0700
commita6878fe5ae60af2f3a2488665c71f5e7cdcad71f (patch)
tree5b6a77695d93283a91f870ba54b54a642c135ee6
parent58080dfa64598d295494d03a3b6332e351326f57 (diff)
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>
-rw-r--r--gbm.c13
-rw-r--r--gbm.h28
-rw-r--r--gbm_priv.h1
3 files changed, 42 insertions, 0 deletions
diff --git a/gbm.c b/gbm.c
index 06da310..5c501af 100644
--- a/gbm.c
+++ b/gbm.c
@@ -316,6 +316,12 @@ gbm_bo_get_format(struct gbm_bo *bo)
return bo->format;
}
+PUBLIC uint64_t
+gbm_bo_get_format_modifier(struct gbm_bo *bo)
+{
+ return gbm_bo_get_plane_format_modifier(bo, 0);
+}
+
PUBLIC struct gbm_device *
gbm_bo_get_device(struct gbm_bo *bo)
{
@@ -388,6 +394,13 @@ gbm_bo_get_plane_stride(struct gbm_bo *bo, size_t plane)
return bo->strides[plane];
}
+PUBLIC uint64_t
+gbm_bo_get_plane_format_modifier(struct gbm_bo *bo, size_t plane)
+{
+ assert(plane < bo->num_planes);
+ return bo->format_modifiers[plane];
+}
+
PUBLIC void
gbm_bo_set_user_data(struct gbm_bo *bo, void *data,
void (*destroy_user_data)(struct gbm_bo *, void *))
diff --git a/gbm.h b/gbm.h
index 47f4a4a..8ec9349 100644
--- a/gbm.h
+++ b/gbm.h
@@ -176,6 +176,28 @@ union gbm_bo_handle {
#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 @@ gbm_bo_get_stride_or_tiling(struct gbm_bo *bo);
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 @@ gbm_bo_get_plane_size(struct gbm_bo *bo, size_t plane);
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 *));
diff --git a/gbm_priv.h b/gbm_priv.h
index 5aaada1..f8373fc 100644
--- a/gbm_priv.h
+++ b/gbm_priv.h
@@ -37,6 +37,7 @@ struct gbm_bo
uint32_t offsets[GBM_MAX_PLANES];
uint32_t sizes[GBM_MAX_PLANES];
uint32_t strides[GBM_MAX_PLANES];
+ uint64_t format_modifiers[GBM_MAX_PLANES];
void *priv;
void *user_data;
void (*destroy_user_data)(struct gbm_bo *, void *);