blob: c7790bf91bd3ef1c2ceae8abc8267f34e71729c7 [file] [log] [blame]
From patchwork Thu Oct 3 18:39:17 2019
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: [RESEND,libdrm,v2] NOMERGE: Add drmModeGetFB2
From: Juston Li <juston.li@intel.com>
X-Patchwork-Id: 334265
Message-Id: <20191003183917.5817-1-juston.li@intel.com>
To: dri-devel@lists.freedesktop.org
Cc: Juston Li <juston.li@intel.com>, Daniel Stone <daniels@collabora.com>
Date: Thu, 3 Oct 2019 11:39:17 -0700
From: Daniel Stone <daniels@collabora.com>
Add a wrapper around the getfb2 ioctl, which returns extended
framebuffer information mirroring addfb2, including multiple planes and
modifiers.
This depends on unmerged kernel API so should not be merged.
Changes since v1:
- functions should be drm_public
- modifier for should 64 bits
- update ioctl number
Signed-off-by: Juston Li <juston.li@intel.com>
---
include/drm/drm.h | 2 ++
xf86drmMode.c | 40 ++++++++++++++++++++++++++++++++++++++++
xf86drmMode.h | 15 +++++++++++++++
3 files changed, 57 insertions(+)
diff --git a/include/drm/drm.h b/include/drm/drm.h
index 85c685a2..4380d711 100644
--- a/include/drm/drm.h
+++ b/include/drm/drm.h
@@ -903,6 +903,8 @@ extern "C" {
#define DRM_IOCTL_MODE_GET_LEASE DRM_IOWR(0xC8, struct drm_mode_get_lease)
#define DRM_IOCTL_MODE_REVOKE_LEASE DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
+#define DRM_IOCTL_MODE_GETFB2 DRM_IOWR(0xCE, struct drm_mode_fb_cmd2)
+
/**
* Device specific ioctls should only be in their respective headers
* The device specific ioctl range is from 0x40 to 0x9f.
diff --git a/xf86drmMode.c b/xf86drmMode.c
index 8f8633ed..1dca974b 100644
--- a/xf86drmMode.c
+++ b/xf86drmMode.c
@@ -1593,3 +1593,44 @@ drmModeRevokeLease(int fd, uint32_t lessee_id)
return 0;
return -errno;
}
+
+
+drm_public drmModeFB2Ptr
+drmModeGetFB2(int fd, uint32_t fb_id)
+{
+ struct drm_mode_fb_cmd2 get;
+ drmModeFB2Ptr ret;
+ int err;
+
+ memclear(get);
+ get.fb_id = fb_id;
+
+ err = DRM_IOCTL(fd, DRM_IOCTL_MODE_GETFB2, &get);
+ if (err != 0)
+ return NULL;
+
+ ret = drmMalloc(sizeof(drmModeFB2));
+ if (!ret)
+ return NULL;
+
+ ret->fb_id = fb_id;
+ ret->width = get.width;
+ ret->height = get.height;
+ ret->pixel_format = get.pixel_format;
+ ret->flags = get.flags;
+ ret->modifier = get.modifier[0];
+ memcpy(ret->handles, get.handles, sizeof(uint32_t) * 4);
+ memcpy(ret->pitches, get.pitches, sizeof(uint32_t) * 4);
+ memcpy(ret->offsets, get.offsets, sizeof(uint32_t) * 4);
+
+ return ret;
+}
+
+drm_public void drmModeFreeFB2(drmModeFB2Ptr ptr)
+{
+ if (!ptr)
+ return;
+
+ /* we might add more frees later. */
+ drmFree(ptr);
+}
diff --git a/xf86drmMode.h b/xf86drmMode.h
index 3cd27aee..c1472270 100644
--- a/xf86drmMode.h
+++ b/xf86drmMode.h
@@ -223,6 +223,19 @@ typedef struct _drmModeFB {
uint32_t handle;
} drmModeFB, *drmModeFBPtr;
+typedef struct _drmModeFB2 {
+ uint32_t fb_id;
+ uint32_t width, height;
+ uint32_t pixel_format; /* fourcc code from drm_fourcc.h */
+ uint64_t modifier; /* applies to all buffers */
+ uint32_t flags;
+
+ /* per-plane GEM handle; may be duplicate entries for multiple planes */
+ uint32_t handles[4];
+ uint32_t pitches[4]; /* bytes */
+ uint32_t offsets[4]; /* bytes */
+} drmModeFB2, *drmModeFB2Ptr;
+
typedef struct drm_clip_rect drmModeClip, *drmModeClipPtr;
typedef struct _drmModePropertyBlob {
@@ -341,6 +354,7 @@ typedef struct _drmModePlaneRes {
extern void drmModeFreeModeInfo( drmModeModeInfoPtr ptr );
extern void drmModeFreeResources( drmModeResPtr ptr );
extern void drmModeFreeFB( drmModeFBPtr ptr );
+extern void drmModeFreeFB2( drmModeFB2Ptr ptr );
extern void drmModeFreeCrtc( drmModeCrtcPtr ptr );
extern void drmModeFreeConnector( drmModeConnectorPtr ptr );
extern void drmModeFreeEncoder( drmModeEncoderPtr ptr );
@@ -360,7 +374,7 @@ extern drmModeResPtr drmModeGetResources(int fd);
* Retrive information about framebuffer bufferId
*/
extern drmModeFBPtr drmModeGetFB(int fd, uint32_t bufferId);
-
+extern drmModeFB2Ptr drmModeGetFB2(int fd, uint32_t bufferId);
/**
* Creates a new framebuffer with an buffer object as its scanout buffer.
*/