Update DRM based modesetting support

Just a checkpoint, still needs a lot of work to properly handle resize, rotate
& cursor handling.
This commit is contained in:
Jesse Barnes 2008-08-12 17:58:29 -07:00
parent 5d78cf7cf0
commit a1b334a4c8
2 changed files with 147 additions and 127 deletions

View File

@ -33,17 +33,18 @@
#include "i830.h"
#include "sarea.h"
static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width, int height);
static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode,
int width, int height);
static Bool
drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height)
{
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
drmmode_crtc_private_ptr drmmode_crtc = xf86_config->crtc[0]->driver_private;
drmmode_crtc_private_ptr drmmode_crtc =
xf86_config->crtc[0]->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode;
Bool ret;
ErrorF("resize called %d %d\n", width, height);
ret = drmmode_resize_fb(scrn, drmmode, width, height);
scrn->virtualX = width;
scrn->virtualY = height;
@ -51,21 +52,21 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height)
}
static void
drmmode_ConvertFromKMode(ScrnInfoPtr scrn,
struct drm_mode_modeinfo *kmode,
DisplayModePtr mode)
drmmode_ConvertFromKMode(ScrnInfoPtr scrn,
struct drm_mode_modeinfo *kmode,
DisplayModePtr mode)
{
memset(mode, 0, sizeof(DisplayModeRec));
mode->status = MODE_OK;
mode->Clock = kmode->clock;
mode->HDisplay = kmode->hdisplay;
mode->HSyncStart = kmode->hsync_start;
mode->HSyncEnd = kmode->hsync_end;
mode->HTotal = kmode->htotal;
mode->HSkew = kmode->hskew;
mode->VDisplay = kmode->vdisplay;
mode->VSyncStart = kmode->vsync_start;
mode->VSyncEnd = kmode->vsync_end;
@ -83,9 +84,9 @@ drmmode_ConvertFromKMode(ScrnInfoPtr scrn,
}
static void
drmmode_ConvertToKMode(ScrnInfoPtr scrn,
struct drm_mode_modeinfo *kmode,
DisplayModePtr mode)
drmmode_ConvertToKMode(ScrnInfoPtr scrn,
struct drm_mode_modeinfo *kmode,
DisplayModePtr mode)
{
memset(kmode, 0, sizeof(*kmode));
@ -95,7 +96,7 @@ drmmode_ConvertToKMode(ScrnInfoPtr scrn,
kmode->hsync_end = mode->HSyncEnd;
kmode->htotal = mode->HTotal;
kmode->hskew = mode->HSkew;
kmode->vdisplay = mode->VDisplay;
kmode->vsync_start = mode->VSyncStart;
kmode->vsync_end = mode->VSyncEnd;
@ -121,7 +122,7 @@ drmmode_crtc_dpms(xf86CrtcPtr drmmode_crtc, int mode)
static Bool
drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
Rotation rotation, int x, int y)
Rotation rotation, int x, int y)
{
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
@ -160,7 +161,8 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
continue;
drmmode_output = output->driver_private;
output_ids[output_count] = drmmode_output->mode_output->connector_id;
output_ids[output_count] =
drmmode_output->mode_output->connector_id;
output_count++;
}
@ -175,9 +177,13 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
if (drmmode_crtc->rotate_fb_id)
fb_id = drmmode_crtc->rotate_fb_id;
ErrorF("fb id is %d\n", fb_id);
drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
fb_id, x, y, output_ids, output_count, &kmode);
ret = drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
fb_id, x, y, output_ids, output_count, &kmode);
if (ret)
xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
"failed to set mode: %s", strerror(-ret));
else
ret = TRUE;
done:
if (!ret) {
@ -192,7 +198,7 @@ done:
static void
drmmode_set_cursor_colors (xf86CrtcPtr crtc, int bg, int fg)
{
}
static void
@ -208,10 +214,16 @@ static void
drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
{
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
ScrnInfoPtr pScrn = crtc->scrn;
I830Ptr pI830 = I830PTR(pScrn);
void *ptr;
/* cursor should be mapped already */
ptr = drmmode_crtc->cursor_map;
if (dri_bo_map(pI830->cursor_mem->bo, 1))
xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
"failed to map cursor");
ptr = pI830->cursor_mem->bo->virtual;
memcpy (ptr, image, 64 * 64 * 4);
@ -224,9 +236,9 @@ drmmode_hide_cursor (xf86CrtcPtr crtc)
{
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode;
drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0, 64, 64);
drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
0, 64, 64);
}
static void
@ -234,8 +246,11 @@ drmmode_show_cursor (xf86CrtcPtr crtc)
{
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode;
ScrnInfoPtr pScrn = crtc->scrn;
I830Ptr pI830 = I830PTR(pScrn);
drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, drmmode_crtc->cursor_handle, 64, 64);
drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
pI830->cursor_mem->bo->handle, 64, 64);
}
static void *
@ -250,23 +265,24 @@ drmmode_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height)
size = rotate_pitch * height;
#if 0
drmmode_crtc->rotate_bo = dri_bo_alloc(drmmode->bufmgr, "rotate",
size, 4096, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_CACHED | DRM_BO_FLAG_CACHED_MAPPED);
drmmode_crtc->rotate_bo =
dri_bo_alloc(drmmode->bufmgr, "rotate", size, 4096);
if (!drmmode_crtc->rotate_bo) {
xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
"Couldn't allocate shadow memory for rotated CRTC\n");
return NULL;
}
dri_bo_map(drmmode_crtc->rotate_bo, 1);
ret = drmModeAddFB(drmmode->fd, width, height, crtc->scrn->depth,
crtc->scrn->bitsPerPixel, rotate_pitch, dri_bo_get_handle(drmmode_crtc->rotate_bo), &drmmode_crtc->rotate_fb_id);
if (ret) {
crtc->scrn->bitsPerPixel, rotate_pitch,
drmmode_crtc->rotate_bo->handle,
&drmmode_crtc->rotate_fb_id);
if (ret)
ErrorF("failed to add rotate fb\n");
}
return drmmode_crtc->rotate_bo->virtual;
#endif
return NULL;
@ -280,19 +296,19 @@ drmmode_crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height)
drmmode_ptr drmmode = drmmode_crtc->drmmode;
unsigned long rotate_pitch;
PixmapPtr rotate_pixmap;
if (!data)
data = drmmode_crtc_shadow_allocate (crtc, width, height);
rotate_pitch = pScrn->displayWidth * drmmode->cpp;
rotate_pixmap = GetScratchPixmapHeader(pScrn->pScreen,
width, height,
pScrn->depth,
pScrn->bitsPerPixel,
rotate_pitch,
data);
if (rotate_pixmap == NULL) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Couldn't allocate shadow pixmap for rotated CRTC\n");
@ -307,8 +323,8 @@ drmmode_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *dat
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
if (rotate_pixmap)
FreeScratchPixmapHeader(rotate_pixmap);
FreeScratchPixmapHeader(rotate_pixmap);
if (data) {
#if 0
/* Be sure to sync acceleration before the memory gets unbound. */
@ -322,25 +338,25 @@ drmmode_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *dat
}
static const xf86CrtcFuncsRec drmmode_crtc_funcs = {
.dpms = drmmode_crtc_dpms,
.set_mode_major = drmmode_set_mode_major,
.set_cursor_colors = drmmode_set_cursor_colors,
.set_cursor_position = drmmode_set_cursor_position,
.show_cursor = drmmode_show_cursor,
.hide_cursor = drmmode_hide_cursor,
.load_cursor_argb = drmmode_load_cursor_argb,
.dpms = drmmode_crtc_dpms,
.set_mode_major = drmmode_set_mode_major,
.set_cursor_colors = drmmode_set_cursor_colors,
.set_cursor_position = drmmode_set_cursor_position,
.show_cursor = drmmode_show_cursor,
.hide_cursor = drmmode_hide_cursor,
.load_cursor_argb = drmmode_load_cursor_argb,
.shadow_create = drmmode_crtc_shadow_create,
.shadow_allocate = drmmode_crtc_shadow_allocate,
.shadow_destroy = drmmode_crtc_shadow_destroy,
.shadow_create = drmmode_crtc_shadow_create,
.shadow_allocate = drmmode_crtc_shadow_allocate,
.shadow_destroy = drmmode_crtc_shadow_destroy,
#if 0
.gamma_set = i830_crtc_gamma_set,
.shadow_create = i830_crtc_shadow_create,
.shadow_allocate = i830_crtc_shadow_allocate,
.shadow_destroy = i830_crtc_shadow_destroy,
.set_cursor_colors = i830_crtc_set_cursor_colors,
.gamma_set = i830_crtc_gamma_set,
.shadow_create = i830_crtc_shadow_create,
.shadow_allocate = i830_crtc_shadow_allocate,
.shadow_destroy = i830_crtc_shadow_destroy,
.set_cursor_colors = i830_crtc_set_cursor_colors,
#endif
.destroy = NULL, /* XXX */
.destroy = NULL, /* XXX */
};
@ -349,23 +365,19 @@ drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
{
xf86CrtcPtr crtc;
drmmode_crtc_private_ptr drmmode_crtc;
I830Ptr pI830 = I830PTR(pScrn);
int ret;
crtc = xf86CrtcCreate(pScrn, &drmmode_crtc_funcs);
if (crtc == NULL)
return;
drmmode_crtc = xnfcalloc(sizeof(drmmode_crtc_private_rec), 1);
drmmode_crtc->mode_crtc = drmModeGetCrtc(drmmode->fd, drmmode->mode_res->crtcs[num]);
drmmode_crtc->mode_crtc = drmModeGetCrtc(drmmode->fd,
drmmode->mode_res->crtcs[num]);
drmmode_crtc->drmmode = drmmode;
crtc->driver_private = drmmode_crtc;
#if 0
drmmode_crtc->cursor_handle = drmmode->alloc_cursor(pScrn, num, 64, 64, &drmmode_crtc->cursor_map);
if (!drmmode_crtc->cursor_handle) {
ErrorF("failed to allocate cursor for crtc\n");
return;
}
#endif
return;
}
@ -377,9 +389,10 @@ drmmode_output_detect(xf86OutputPtr output)
drmmode_ptr drmmode = drmmode_output->drmmode;
xf86OutputStatus status;
drmModeFreeConnector(drmmode_output->mode_output);
drmmode_output->mode_output = drmModeGetConnector(drmmode->fd, drmmode_output->output_id);
drmmode_output->mode_output =
drmModeGetConnector(drmmode->fd, drmmode_output->output_id);
switch (drmmode_output->mode_output->connection) {
case DRM_MODE_CONNECTED:
status = XF86OutputStatusConnected;
@ -414,26 +427,33 @@ drmmode_output_get_modes(xf86OutputPtr output)
/* look for an EDID property */
for (i = 0; i < koutput->count_props; i++) {
props = drmModeGetProperty(drmmode->fd, koutput->props[i]);
if (props && (props->flags & DRM_MODE_PROP_BLOB)) {
if (!strcmp(props->name, "EDID")) {
if (drmmode_output->edid_blob)
drmModeFreePropertyBlob(drmmode_output->edid_blob);
drmmode_output->edid_blob = drmModeGetPropertyBlob(drmmode->fd, koutput->prop_values[i]);
}
drmModeFreeProperty(props);
if (!props || !(props->flags & DRM_MODE_PROP_BLOB))
continue;
if (!strcmp(props->name, "EDID") && drmmode_output->edid_blob) {
drmModeFreePropertyBlob(drmmode_output->edid_blob);
drmmode_output->edid_blob =
drmModeGetPropertyBlob(drmmode->fd,
koutput->prop_values[i]);
}
drmModeFreeProperty(props);
}
if (drmmode_output->edid_blob)
xf86OutputSetEDID(output, xf86InterpretEDID(output->scrn->scrnIndex, drmmode_output->edid_blob->data));
xf86OutputSetEDID(output,
xf86InterpretEDID(output->scrn->scrnIndex,
drmmode_output->edid_blob->data));
else
xf86OutputSetEDID(output, xf86InterpretEDID(output->scrn->scrnIndex, NULL));
xf86OutputSetEDID(output,
xf86InterpretEDID(output->scrn->scrnIndex,
NULL));
/* modes should already be available */
for (i = 0; i < koutput->count_modes; i++) {
Mode = xnfalloc(sizeof(DisplayModeRec));
drmmode_ConvertFromKMode(output->scrn, &koutput->modes[i], Mode);
drmmode_ConvertFromKMode(output->scrn, &koutput->modes[i],
Mode);
Modes = xf86ModesAdd(Modes, Mode);
}
@ -459,21 +479,21 @@ drmmode_output_dpms(xf86OutputPtr output, int mode)
}
static const xf86OutputFuncsRec drmmode_output_funcs = {
.dpms = drmmode_output_dpms,
.dpms = drmmode_output_dpms,
#if 0
.save = drmmode_crt_save,
.restore = drmmode_crt_restore,
.mode_fixup = drmmode_crt_mode_fixup,
.prepare = drmmode_output_prepare,
.mode_set = drmmode_crt_mode_set,
.commit = drmmode_output_commit,
.save = drmmode_crt_save,
.restore = drmmode_crt_restore,
.mode_fixup = drmmode_crt_mode_fixup,
.prepare = drmmode_output_prepare,
.mode_set = drmmode_crt_mode_set,
.commit = drmmode_output_commit,
#endif
.detect = drmmode_output_detect,
.mode_valid = drmmode_output_mode_valid,
.detect = drmmode_output_detect,
.mode_valid = drmmode_output_mode_valid,
.get_modes = drmmode_output_get_modes,
.destroy = drmmode_output_destroy
.get_modes = drmmode_output_get_modes,
.destroy = drmmode_output_destroy
};
static int subpixel_conv_table[7] = { 0, SubPixelUnknown,
@ -497,7 +517,7 @@ const char *output_names[] = { "None",
"HDMI",
"HDMI",
};
static void
drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
@ -508,7 +528,8 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
drmmode_output_private_ptr drmmode_output;
char name[32];
koutput = drmModeGetConnector(drmmode->fd, drmmode->mode_res->connectors[num]);
koutput = drmModeGetConnector(drmmode->fd,
drmmode->mode_res->connectors[num]);
if (!koutput)
return;
@ -518,7 +539,8 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
return;
}
snprintf(name, 32, "%s%d", output_names[koutput->connector_type], koutput->connector_type_id);
snprintf(name, 32, "%s%d", output_names[koutput->connector_type],
koutput->connector_type_id);
output = xf86OutputCreate (pScrn, &drmmode_output_funcs, name);
if (!output) {
@ -550,7 +572,8 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
return;
}
Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, char *busId, char *driver_name, int cpp)
Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, char *busId,
char *driver_name, int cpp)
{
xf86CrtcConfigPtr xf86_config;
int i;
@ -576,7 +599,8 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, char *busId, char
if (!drmmode->mode_res)
return FALSE;
xf86CrtcSetSizeRange(pScrn, 320, 200, drmmode->mode_res->max_width, drmmode->mode_res->max_height);
xf86CrtcSetSizeRange(pScrn, 320, 200, drmmode->mode_res->max_width,
drmmode->mode_res->max_height);
for (i = 0; i < drmmode->mode_res->count_crtcs; i++)
drmmode_crtc_init(pScrn, drmmode, i);
@ -589,14 +613,16 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, char *busId, char
}
#if 0
Bool drmmode_set_bufmgr(ScrnInfoPtr pScrn, drmmode_ptr drmmode, dri_bufmgr *bufmgr)
Bool drmmode_set_bufmgr(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
dri_bufmgr *bufmgr)
{
drmmode->bufmgr = bufmgr;
return TRUE;
}
#endif
void drmmode_set_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width, int height, int pitch, dri_bo *bo)
void drmmode_set_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width,
int height, int pitch, dri_bo *bo)
{
int ret;
@ -616,23 +642,14 @@ void drmmode_set_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width, int height
ErrorF("Add fb id %d %d %d\n", drmmode->fb_id, width, height);
}
void drmmode_set_cursor(ScrnInfoPtr scrn, drmmode_ptr drmmode, int id, void *ptr, uint32_t handle)
{
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
xf86CrtcPtr crtc = xf86_config->crtc[id];
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_crtc->cursor_handle = handle;
drmmode_crtc->cursor_map = ptr;
}
#if 0
Bool drmmode_is_rotate_pixmap(ScrnInfoPtr pScrn, pointer pPixData, dri_bo **bo)
{
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (pScrn);
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (pScrn);
int i;
return FALSE;
#if 0
for (i = 0; i < config->num_crtc; i++) {
xf86CrtcPtr crtc = config->crtc[i];
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
@ -646,11 +663,11 @@ Bool drmmode_is_rotate_pixmap(ScrnInfoPtr pScrn, pointer pPixData, dri_bo **bo)
}
}
return FALSE;
}
#endif
}
static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width, int height)
static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width,
int height)
{
uint32_t handle;
int pitch;
@ -658,7 +675,8 @@ static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width,
return FALSE;
if (drmmode->mode_fb->width == width && drmmode->mode_fb->height == height)
if (drmmode->mode_fb->width == width &&
drmmode->mode_fb->height == height)
return TRUE;
if (!drmmode->create_new_fb)
@ -668,7 +686,7 @@ static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width,
if (handle == 0)
return FALSE;
ret = drmModeReplaceFB(drmmode->fd, drmmode->fb_id,
ret = drmModeReplaceFB(drmmode->fd, drmmode->fb_id,
width, height,
scrn->depth, scrn->bitsPerPixel, pitch,
handle);
@ -680,7 +698,7 @@ static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width,
drmmode->mode_fb = drmModeGetFB(drmmode->fd, drmmode->fb_id);
if (!drmmode->mode_fb)
return FALSE;
return TRUE;
}

View File

@ -33,23 +33,21 @@
#include "xf86drmMode.h"
typedef struct {
int fd;
uint32_t fb_id;
drmModeResPtr mode_res;
drmModeFBPtr mode_fb;
int cpp;
// dri_bufmgr *bufmgr;
uint32_t (*create_new_fb)(ScrnInfoPtr pScrn, int width, int height, int *pitch);
int fd;
uint32_t fb_id;
drmModeResPtr mode_res;
drmModeFBPtr mode_fb;
int cpp;
uint32_t (*create_new_fb)(ScrnInfoPtr pScrn, int width, int height,
int *pitch);
} drmmode_rec, *drmmode_ptr;
typedef struct {
drmmode_ptr drmmode;
drmModeCrtcPtr mode_crtc;
uint32_t cursor_handle;
void *cursor_map;
// dri_bo *rotate_bo;
dri_bo *cursor;
dri_bo *rotate_bo;
int rotate_fb_id;
} drmmode_crtc_private_rec, *drmmode_crtc_private_ptr;
@ -62,10 +60,14 @@ typedef struct {
} drmmode_output_private_rec, *drmmode_output_private_ptr;
extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, char *busId, char *driver_name, int cpp);
//extern Bool drmmode_set_bufmgr(ScrnInfoPtr pScrn, drmmode_ptr drmmode, dri_bufmgr *bufmgr);
extern void drmmode_set_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int width, int height, int pitch, dri_bo *bo);
//extern Bool drmmode_is_rotate_pixmap(ScrnInfoPtr pScrn, pointer pPixData, dri_bo **bo);
extern void drmmode_set_cursor(ScrnInfoPtr scrn, drmmode_ptr drmmode, int id, void *ptr, uint32_t handle);
#endif
#endif
extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
char *busId, char *driver_name, int cpp);
extern void drmmode_set_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int width,
int height, int pitch, dri_bo *bo);
extern Bool drmmode_is_rotate_pixmap(ScrnInfoPtr pScrn, pointer pPixData,
dri_bo **bo);
extern void drmmode_set_cursor(ScrnInfoPtr scrn, drmmode_ptr drmmode, int id,
void *ptr, uint32_t handle);
#endif /* XF86DRM_MODE */
#endif /* DRMMODE_DISPLAY_H */