modesetting: make ms_do_pageflip generic for share with DRI2

Signed-off-by: Qiang Yu <Qiang.Yu@amd.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
This commit is contained in:
Qiang Yu 2016-08-22 18:14:15 +08:00 committed by Adam Jackson
parent 7d33ab0f8c
commit a586bf9ccf

View File

@ -235,7 +235,7 @@ ms_present_flush(WindowPtr window)
*/ */
struct ms_flipdata { struct ms_flipdata {
ScreenPtr screen; ScreenPtr screen;
struct ms_present_vblank_event *event; void *event;
/* number of CRTC events referencing this */ /* number of CRTC events referencing this */
int flip_count; int flip_count;
uint64_t fe_msc; uint64_t fe_msc;
@ -254,6 +254,12 @@ struct ms_crtc_pageflip {
struct ms_flipdata *flipdata; struct ms_flipdata *flipdata;
}; };
typedef void (*ms_pageflip_handler_proc)(uint64_t frame,
uint64_t usec,
void *data);
typedef void (*ms_pageflip_abort_proc)(void *data);
/** /**
* Free an ms_crtc_pageflip. * Free an ms_crtc_pageflip.
* *
@ -277,7 +283,7 @@ ms_present_flip_free(struct ms_crtc_pageflip *flip)
* extension code telling it when that happened * extension code telling it when that happened
*/ */
static void static void
ms_flip_handler(uint64_t msc, uint64_t ust, void *data) ms_present_flip_handler(uint64_t msc, uint64_t ust, void *data)
{ {
struct ms_crtc_pageflip *flip = data; struct ms_crtc_pageflip *flip = data;
ScreenPtr screen = flip->flipdata->screen; ScreenPtr screen = flip->flipdata->screen;
@ -331,7 +337,9 @@ ms_present_flip_abort(void *data)
static Bool static Bool
queue_flip_on_crtc(ScreenPtr screen, xf86CrtcPtr crtc, queue_flip_on_crtc(ScreenPtr screen, xf86CrtcPtr crtc,
struct ms_flipdata *flipdata, struct ms_flipdata *flipdata,
int ref_crtc_vblank_pipe, uint32_t flags) int ref_crtc_vblank_pipe, uint32_t flags,
ms_pageflip_handler_proc pageflip_handler,
ms_pageflip_abort_proc pageflip_abort)
{ {
ScrnInfoPtr scrn = xf86ScreenToScrn(screen); ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
modesettingPtr ms = modesettingPTR(scrn); modesettingPtr ms = modesettingPTR(scrn);
@ -353,17 +361,12 @@ queue_flip_on_crtc(ScreenPtr screen, xf86CrtcPtr crtc,
flip->on_reference_crtc = (drmmode_crtc->vblank_pipe == ref_crtc_vblank_pipe); flip->on_reference_crtc = (drmmode_crtc->vblank_pipe == ref_crtc_vblank_pipe);
flip->flipdata = flipdata; flip->flipdata = flipdata;
seq = ms_drm_queue_alloc(crtc, flip, ms_flip_handler, ms_present_flip_abort); seq = ms_drm_queue_alloc(crtc, flip, pageflip_handler, pageflip_abort);
if (!seq) { if (!seq) {
free(flip); free(flip);
return FALSE; return FALSE;
} }
DebugPresent(("\t\tms:fq %lld c %d -> %d seq %llu\n",
(long long) flipdata->event->event_id,
flipdata->flip_count, flipdata->flip_count + 1,
(long long) seq));
/* take a reference on flipdata for use in flip */ /* take a reference on flipdata for use in flip */
flipdata->flip_count++; flipdata->flip_count++;
@ -394,9 +397,11 @@ queue_flip_on_crtc(ScreenPtr screen, xf86CrtcPtr crtc,
static Bool static Bool
ms_do_pageflip(ScreenPtr screen, ms_do_pageflip(ScreenPtr screen,
PixmapPtr new_front, PixmapPtr new_front,
struct ms_present_vblank_event *event, void *event,
int ref_crtc_vblank_pipe, int ref_crtc_vblank_pipe,
Bool async) Bool async,
ms_pageflip_handler_proc pageflip_handler,
ms_pageflip_abort_proc pageflip_abort)
{ {
#ifndef GLAMOR_HAS_GBM #ifndef GLAMOR_HAS_GBM
return FALSE; return FALSE;
@ -470,7 +475,8 @@ ms_do_pageflip(ScreenPtr screen,
if (!queue_flip_on_crtc(screen, crtc, flipdata, if (!queue_flip_on_crtc(screen, crtc, flipdata,
ref_crtc_vblank_pipe, ref_crtc_vblank_pipe,
flags)) { flags, pageflip_handler,
pageflip_abort)) {
goto error_undo; goto error_undo;
} }
} }
@ -588,8 +594,12 @@ ms_present_flip(RRCrtcPtr crtc,
if (!event) if (!event)
return FALSE; return FALSE;
DebugPresent(("\t\tms:pf %lld msc %llu\n",
(long long) event_id, (long long) target_msc));
event->event_id = event_id; event->event_id = event_id;
ret = ms_do_pageflip(screen, pixmap, event, drmmode_crtc->vblank_pipe, !sync_flip); ret = ms_do_pageflip(screen, pixmap, event, drmmode_crtc->vblank_pipe, !sync_flip,
ms_present_flip_handler, ms_present_flip_abort);
if (!ret) if (!ret)
xf86DrvMsg(scrn->scrnIndex, X_ERROR, "present flip failed\n"); xf86DrvMsg(scrn->scrnIndex, X_ERROR, "present flip failed\n");
@ -615,7 +625,8 @@ ms_present_unflip(ScreenPtr screen, uint64_t event_id)
event->event_id = event_id; event->event_id = event_id;
if (ms_present_check_flip(NULL, screen->root, pixmap, TRUE) && if (ms_present_check_flip(NULL, screen->root, pixmap, TRUE) &&
ms_do_pageflip(screen, pixmap, event, -1, FALSE)) { ms_do_pageflip(screen, pixmap, event, -1, FALSE,
ms_present_flip_handler, ms_present_flip_abort)) {
return; return;
} }