Add drmModeGetFB2

Add a wrapper around the getfb2 ioctl, which returns extended
framebuffer information mirroring addfb2, including multiple planes and
modifiers.

Changes since v7:
 - add new symbols to core-symbol.txt (Eric Engestrom)

Changes since v5:
 - style change

Changes since v4:
 - Set fb_id at init instead of memclear() and set (Eric Engestrom)

Changes since v3:
 - remove unnecessary null check in drmModeFreeFB2 (Daniel Stone)

Changes since v2:
 - getfb2 ioctl has been merged upstream
 - sync include/drm/drm.h in a seperate patch

Changes since v1:
 - functions should be drm_public
 - modifier should be 64 bits
 - update ioctl number

Signed-off-by: Juston Li <juston.li@intel.com>
Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Eric Engestrom <eric@engestrom.ch>
main
Daniel Stone 2020-02-11 12:19:16 -08:00
parent 63d914d479
commit d8731e9eec
3 changed files with 52 additions and 0 deletions

View File

@ -112,6 +112,7 @@ drmModeFreeConnector
drmModeFreeCrtc
drmModeFreeEncoder
drmModeFreeFB
drmModeFreeFB2
drmModeFreeModeInfo
drmModeFreeObjectProperties
drmModeFreePlane
@ -124,6 +125,7 @@ drmModeGetConnectorCurrent
drmModeGetCrtc
drmModeGetEncoder
drmModeGetFB
drmModeGetFB2
drmModeGetLease
drmModeGetPlane
drmModeGetPlaneResources

View File

@ -1594,3 +1594,38 @@ 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 = {
.fb_id = fb_id,
};
drmModeFB2Ptr ret;
int err;
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)
{
drmFree(ptr);
}

View File

@ -225,6 +225,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 {
@ -343,6 +356,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 );
@ -362,6 +376,7 @@ extern drmModeResPtr drmModeGetResources(int fd);
* Retrieve 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.