OSDN Git Service

minigbm: add format modifiers per plane
authorVince Hsu <vince.h@nvidia.com>
Mon, 23 May 2016 02:32:25 +0000 (10:32 +0800)
committerchrome-bot <chrome-bot@chromium.org>
Mon, 30 May 2016 05:03:31 +0000 (22:03 -0700)
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>
gbm.c
gbm.h
gbm_priv.h

diff --git a/gbm.c b/gbm.c
index 06da310..5c501af 100644 (file)
--- 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 (file)
--- 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 *));
index 5aaada1..f8373fc 100644 (file)
@@ -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 *);