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 *);