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:
parent
7d33ab0f8c
commit
a586bf9ccf
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user