[RFC 2/4] drm: add inline helper funcs for NVIDIA modifiers
James Jones
jajones at nvidia.com
Thu Jul 3 22:36:56 UTC 2025
Code parsing the fields of the NVIDIA block-linear
format modifiers frequently needs to use magic
values defined within the
DRM_FORMAT_MOD_NVIDIA_BLOCK_LINEAR_2D() macro and
document in the comment above it. Such code is
error prone and hard to read. See for example,
nouveau_decode_mod() in the nouveau driver.
This change adds macros using the previously added
field definition macros to extract values from
individual fields in a valid NVIDIA block-linear
format modifier.
Signed-off-by: James Jones <jajones at nvidia.com>
---
include/uapi/drm/drm_fourcc.h | 44 ++++++++++++++++++++++++++++++++---
1 file changed, 41 insertions(+), 3 deletions(-)
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
index 4240a4a146b6..052e5fdd1d3b 100644
--- a/include/uapi/drm/drm_fourcc.h
+++ b/include/uapi/drm/drm_fourcc.h
@@ -1011,6 +1011,46 @@ extern "C" {
(((c) & __fourcc_mod_nvidia_comp_mask) << \
__fourcc_mod_nvidia_comp_shift)))
+#define __DRM_FOURCC_MKNVHELPER_FUNC(f__) \
+ static inline __u64 \
+ drm_fourcc_nvidia_format_mod_##f__(__u64 mod) \
+{ \
+ return (mod >> __fourcc_mod_nvidia_##f__##_shift) & \
+ __fourcc_mod_nvidia_##f__##_mask; \
+}
+
+/*
+ * Get log2 of the block height in gobs specified by mod:
+ * static inline __u64 drm_fourcc_nvidia_format_mod_l2gpbh(__u64 mod)
+ */
+__DRM_FOURCC_MKNVHELPER_FUNC(l2gpbh)
+
+/*
+ * Get the page kind specified by mod:
+ * static inline __u64 drm_fourcc_nvidia_format_mod_pkind(__u64 mod)
+ */
+__DRM_FOURCC_MKNVHELPER_FUNC(pkind)
+
+/*
+ * Get the page kind generation specified by mod:
+ * static inline __u64 drm_fourcc_nvidia_format_mod_kgen(__u64 mod)
+ */
+__DRM_FOURCC_MKNVHELPER_FUNC(kgen)
+
+/*
+ * Get the sector layout specified by mod:
+ * static inline __u64 drm_fourcc_nvidia_format_mod_slayout(__u64 mod)
+ */
+__DRM_FOURCC_MKNVHELPER_FUNC(slayout)
+
+/*
+ * Get the lossless framebuffer compression specified by mod:
+ * static inline __u64 drm_fourcc_nvidia_format_mod_kgen(__u64 mod)
+ */
+__DRM_FOURCC_MKNVHELPER_FUNC(comp)
+
+#undef __DRM_FOURCC_MKNVHELPER_FUNC
+
/* To grandfather in prior block linear format modifiers to the above layout,
* the page kind "0", which corresponds to "pitch/linear" and hence is unusable
* with block-linear layouts, is remapped within drivers to the value 0xfe,
@@ -1020,9 +1060,7 @@ extern "C" {
static inline __u64
drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)
{
- if (!(modifier & 0x10) ||
- (modifier & (__fourcc_mod_nvidia_pkind_mask <<
- __fourcc_mod_nvidia_pkind_shift)))
+ if (!(modifier & 0x10) || drm_fourcc_nvidia_format_mod_pkind(modifier))
return modifier;
else
return modifier | (0xfeULL << __fourcc_mod_nvidia_pkind_shift);
--
2.49.0
More information about the dri-devel
mailing list