summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2022-10-27 19:11:20 +0200
committerSimon Ser <contact@emersion.fr>2022-10-27 22:18:22 +0200
commit3be3b1a83f346a6b58f4a9f0846b48e3ee931533 (patch)
treedda3aff4720a04a166ae34b1b5ce7d534f287026
parent82b2b1e8987c182d14fcaf5a3a3b8ee1b4d5e1df (diff)
downloaddrm-3be3b1a83f346a6b58f4a9f0846b48e3ee931533.tar.gz
xf86drmMode: add helpers for dumb buffers
Up until now, DRM clients had to hand-roll their code to create, destroy and map dumb buffers. This is slightly inconvenient, a bit error-prone, and not easily discoverable. Introduce wrappers for these operations, just like we have for other KMS IOCTLs. Signed-off-by: Simon Ser <contact@emersion.fr>
-rw-r--r--core-symbols.txt3
-rw-r--r--xf86drmMode.c49
-rw-r--r--xf86drmMode.h32
3 files changed, 84 insertions, 0 deletions
diff --git a/core-symbols.txt b/core-symbols.txt
index 6c5a4af6..9f8a323b 100644
--- a/core-symbols.txt
+++ b/core-symbols.txt
@@ -105,10 +105,12 @@ drmModeAtomicSetCursor
drmModeAttachMode
drmModeConnectorGetPossibleCrtcs
drmModeConnectorSetProperty
+drmModeCreateDumbBuffer
drmModeCreateLease
drmModeCreatePropertyBlob
drmModeCrtcGetGamma
drmModeCrtcSetGamma
+drmModeDestroyDumbBuffer
drmModeDestroyPropertyBlob
drmModeDetachMode
drmModeDirtyFB
@@ -139,6 +141,7 @@ drmModeGetProperty
drmModeGetPropertyBlob
drmModeGetResources
drmModeListLessees
+drmModeMapDumbBuffer
drmModeMoveCursor
drmModeObjectGetProperties
drmModeObjectSetProperty
diff --git a/xf86drmMode.c b/xf86drmMode.c
index 9dc42451..22a8a7c2 100644
--- a/xf86drmMode.c
+++ b/xf86drmMode.c
@@ -1823,3 +1823,52 @@ drmModeGetConnectorTypeName(uint32_t connector_type)
return NULL;
}
}
+
+drm_public int
+drmModeCreateDumbBuffer(int fd, uint32_t width, uint32_t height, uint32_t bpp,
+ uint32_t flags, uint32_t *handle, uint32_t *pitch,
+ uint64_t *size)
+{
+ int ret;
+ struct drm_mode_create_dumb create = {
+ .width = width,
+ .height = height,
+ .bpp = bpp,
+ .flags = flags,
+ };
+
+ ret = DRM_IOCTL(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create);
+ if (ret != 0)
+ return ret;
+
+ *handle = create.handle;
+ *pitch = create.pitch;
+ *size = create.size;
+ return 0;
+}
+
+drm_public int
+drmModeDestroyDumbBuffer(int fd, uint32_t handle)
+{
+ struct drm_mode_destroy_dumb destroy = {
+ .handle = handle,
+ };
+
+ return DRM_IOCTL(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy);
+}
+
+drm_public int
+drmModeMapDumbBuffer(int fd, uint32_t handle, uint64_t *offset)
+{
+ int ret;
+ struct drm_mode_map_dumb map = {
+ .handle = handle,
+ };
+
+ ret = DRM_IOCTL(fd, DRM_IOCTL_MODE_MAP_DUMB, &map);
+ if (ret != 0)
+ return ret;
+
+ *offset = map.offset;
+ return 0;
+}
diff --git a/xf86drmMode.h b/xf86drmMode.h
index 4617d1e0..d911c9a1 100644
--- a/xf86drmMode.h
+++ b/xf86drmMode.h
@@ -497,6 +497,38 @@ extern int drmModeRevokeLease(int fd, uint32_t lessee_id);
extern const char *
drmModeGetConnectorTypeName(uint32_t connector_type);
+/**
+ * Create a dumb buffer.
+ *
+ * Given a width, height and bits-per-pixel, the kernel will return a buffer
+ * handle, pitch and size. The flags must be zero.
+ *
+ * Returns 0 on success, negative errno on error.
+ */
+extern int
+drmModeCreateDumbBuffer(int fd, uint32_t width, uint32_t height, uint32_t bpp,
+ uint32_t flags, uint32_t *handle, uint32_t *pitch,
+ uint64_t *size);
+
+/**
+ * Destroy a dumb buffer.
+ *
+ * Returns 0 on success, negative errno on error.
+ */
+extern int
+drmModeDestroyDumbBuffer(int fd, uint32_t handle);
+
+/**
+ * Prepare a dumb buffer for mapping.
+ *
+ * The kernel returns an offset which can be used as an argument to mmap(2) on
+ * the DRM FD.
+ *
+ * Returns 0 on success, negative errno on error.
+ */
+extern int
+drmModeMapDumbBuffer(int fd, uint32_t handle, uint64_t *offset);
+
#if defined(__cplusplus)
}
#endif