summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Vlad <marius.vlad@collabora.com>2021-02-01 13:45:58 +0200
committerDaniel Stone <daniels@collabora.com>2021-06-22 11:16:04 +0000
commit99a0522aef04e08c6e0be7a7a020f12c51d24c47 (patch)
tree3b388e35bf4a24392d77476e340ba9dd321cba8d
parenta04b674887586bf05594abaf7c55fd8d630898db (diff)
xf86drm: Add support for decoding Nvidia format modifiers
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
-rw-r--r--xf86drm.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/xf86drm.c b/xf86drm.c
index 3f063b29..91155010 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -61,6 +61,7 @@
#include <sys/sysctl.h>
#endif
#include <math.h>
+#include <inttypes.h>
#if defined(__FreeBSD__)
#include <sys/param.h>
@@ -165,8 +166,12 @@ struct drmFormatVendorModifierInfo {
static char *
drmGetFormatModifierNameFromArm(uint64_t modifier);
+static char *
+drmGetFormatModifierNameFromNvidia(uint64_t modifier);
+
static const struct drmVendorInfo modifier_format_vendor_table[] = {
{ DRM_FORMAT_MOD_VENDOR_ARM, drmGetFormatModifierNameFromArm },
+ { DRM_FORMAT_MOD_VENDOR_NVIDIA, drmGetFormatModifierNameFromNvidia },
};
#ifndef AFBC_FORMAT_MOD_MODE_VALUE_MASK
@@ -250,6 +255,31 @@ drmGetFormatModifierNameFromArm(uint64_t modifier)
return modifier_name;
}
+static char *
+drmGetFormatModifierNameFromNvidia(uint64_t modifier)
+{
+ uint64_t height, kind, gen, sector, compression;
+
+ height = modifier & 0xf;
+ kind = (modifier >> 12) & 0xff;
+
+ gen = (modifier >> 20) & 0x3;
+ sector = (modifier >> 22) & 0x1;
+ compression = (modifier >> 23) & 0x7;
+
+ /* just in case there could other simpler modifiers, not yet added, avoid
+ * testing against TEGRA_TILE */
+ if ((modifier & 0x10) == 0x10) {
+ char *mod_nvidia;
+ asprintf(&mod_nvidia, "BLOCK_LINEAR_2D,HEIGHT=%"PRIu64",KIND=%"PRIu64","
+ "GEN=%"PRIu64",SECTOR=%"PRIu64",COMPRESSION=%"PRIu64"", height,
+ kind, gen, sector, compression);
+ return mod_nvidia;
+ }
+
+ return NULL;
+}
+
static unsigned log2_int(unsigned x)
{
unsigned l;