diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 4c35657b..92baae74 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -1047,14 +1047,22 @@ static void drmmode_show_cursor(xf86CrtcPtr crtc) info->cursor_w, info->cursor_h); } +/* Xorg passes the return value of drmmode_crtc_shadow_allocate to + * drmmode_crtc_scanout_create, but that's redundant for us; just check that + * we're not getting an unexpected value back. + */ +#define SHADOW_TOKEN(dmmode_crtc) (void*)(0UL - drmmode_crtc->hw_id - 1) + static void *drmmode_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height) { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - int pitch; - return drmmode_crtc_scanout_allocate(crtc, &drmmode_crtc->rotate, - width, height, &pitch); + if (!drmmode_crtc_scanout_create(crtc, &drmmode_crtc->rotate, width, + height)) + return NULL; + + return SHADOW_TOKEN(drmmode_crtc); } static PixmapPtr @@ -1062,11 +1070,13 @@ drmmode_crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height) { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - /* Xorg passes in the return value of drmmode_crtc_shadow_allocate - * for data, but that's redundant for drmmode_crtc_scanout_create. - */ - return drmmode_crtc_scanout_create(crtc, &drmmode_crtc->rotate, width, - height); + if (data != SHADOW_TOKEN(drmmode_crtc)) { + ErrorF("%s: Unexpected data parameter %p, expected %p\n", + __func__, data, SHADOW_TOKEN(drmmode_crtc)); + return FALSE; + } + + return drmmode_crtc->rotate.pixmap; } static void