modesetting: move common page flip handle to pageflip.c
The common page flip handle framework can be shared with DRI2 page flip. Signed-off-by: Qiang Yu <Qiang.Yu@amd.com> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
This commit is contained in:
parent
4f1eb7864b
commit
4a839da627
|
@ -156,34 +156,6 @@ Bool ms_present_screen_init(ScreenPtr screen);
|
|||
|
||||
#ifdef GLAMOR
|
||||
|
||||
/*
|
||||
* Event data for an in progress flip.
|
||||
* This contains a pointer to the vblank event,
|
||||
* and information about the flip in progress.
|
||||
* a reference to this is stored in the per-crtc
|
||||
* flips.
|
||||
*/
|
||||
struct ms_flipdata {
|
||||
ScreenPtr screen;
|
||||
void *event;
|
||||
/* number of CRTC events referencing this */
|
||||
int flip_count;
|
||||
uint64_t fe_msc;
|
||||
uint64_t fe_usec;
|
||||
uint32_t old_fb_id;
|
||||
};
|
||||
|
||||
/*
|
||||
* Per crtc pageflipping infomation,
|
||||
* These are submitted to the queuing code
|
||||
* one of them per crtc per flip.
|
||||
*/
|
||||
struct ms_crtc_pageflip {
|
||||
Bool on_reference_crtc;
|
||||
/* reference to the ms_flipdata */
|
||||
struct ms_flipdata *flipdata;
|
||||
};
|
||||
|
||||
typedef void (*ms_pageflip_handler_proc)(uint64_t frame,
|
||||
uint64_t usec,
|
||||
void *data);
|
||||
|
|
|
@ -31,6 +31,97 @@
|
|||
|
||||
#ifdef GLAMOR
|
||||
|
||||
/*
|
||||
* Event data for an in progress flip.
|
||||
* This contains a pointer to the vblank event,
|
||||
* and information about the flip in progress.
|
||||
* a reference to this is stored in the per-crtc
|
||||
* flips.
|
||||
*/
|
||||
struct ms_flipdata {
|
||||
ScreenPtr screen;
|
||||
void *event;
|
||||
ms_pageflip_handler_proc event_handler;
|
||||
ms_pageflip_abort_proc abort_handler;
|
||||
/* number of CRTC events referencing this */
|
||||
int flip_count;
|
||||
uint64_t fe_msc;
|
||||
uint64_t fe_usec;
|
||||
uint32_t old_fb_id;
|
||||
};
|
||||
|
||||
/*
|
||||
* Per crtc pageflipping infomation,
|
||||
* These are submitted to the queuing code
|
||||
* one of them per crtc per flip.
|
||||
*/
|
||||
struct ms_crtc_pageflip {
|
||||
Bool on_reference_crtc;
|
||||
/* reference to the ms_flipdata */
|
||||
struct ms_flipdata *flipdata;
|
||||
};
|
||||
|
||||
/**
|
||||
* Free an ms_crtc_pageflip.
|
||||
*
|
||||
* Drops the reference count on the flipdata.
|
||||
*/
|
||||
static void
|
||||
ms_pageflip_free(struct ms_crtc_pageflip *flip)
|
||||
{
|
||||
struct ms_flipdata *flipdata = flip->flipdata;
|
||||
|
||||
free(flip);
|
||||
if (--flipdata->flip_count > 0)
|
||||
return;
|
||||
free(flipdata);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for the DRM event queue when a single flip has completed
|
||||
*
|
||||
* Once the flip has been completed on all pipes, notify the
|
||||
* extension code telling it when that happened
|
||||
*/
|
||||
static void
|
||||
ms_pageflip_handler(uint64_t msc, uint64_t ust, void *data)
|
||||
{
|
||||
struct ms_crtc_pageflip *flip = data;
|
||||
struct ms_flipdata *flipdata = flip->flipdata;
|
||||
ScreenPtr screen = flipdata->screen;
|
||||
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
|
||||
modesettingPtr ms = modesettingPTR(scrn);
|
||||
|
||||
if (flip->on_reference_crtc) {
|
||||
flipdata->fe_msc = msc;
|
||||
flipdata->fe_usec = ust;
|
||||
}
|
||||
|
||||
if (flipdata->flip_count == 1) {
|
||||
flipdata->event_handler(flipdata->fe_msc,
|
||||
flipdata->fe_usec,
|
||||
flipdata->event);
|
||||
|
||||
drmModeRmFB(ms->fd, flipdata->old_fb_id);
|
||||
}
|
||||
ms_pageflip_free(flip);
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback for the DRM queue abort code. A flip has been aborted.
|
||||
*/
|
||||
static void
|
||||
ms_pageflip_abort(void *data)
|
||||
{
|
||||
struct ms_crtc_pageflip *flip = data;
|
||||
struct ms_flipdata *flipdata = flip->flipdata;
|
||||
|
||||
if (flipdata->flip_count == 1)
|
||||
flipdata->abort_handler(flipdata->event);
|
||||
|
||||
ms_pageflip_free(flip);
|
||||
}
|
||||
|
||||
/*
|
||||
* Flush the DRM event queue when full; makes space for new events.
|
||||
*
|
||||
|
@ -68,9 +159,7 @@ ms_flush_drm_events(ScreenPtr screen)
|
|||
static Bool
|
||||
queue_flip_on_crtc(ScreenPtr screen, xf86CrtcPtr crtc,
|
||||
struct ms_flipdata *flipdata,
|
||||
int ref_crtc_vblank_pipe, uint32_t flags,
|
||||
ms_pageflip_handler_proc pageflip_handler,
|
||||
ms_pageflip_abort_proc pageflip_abort)
|
||||
int ref_crtc_vblank_pipe, uint32_t flags)
|
||||
{
|
||||
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
|
||||
modesettingPtr ms = modesettingPTR(scrn);
|
||||
|
@ -92,7 +181,7 @@ queue_flip_on_crtc(ScreenPtr screen, xf86CrtcPtr crtc,
|
|||
flip->on_reference_crtc = (drmmode_crtc->vblank_pipe == ref_crtc_vblank_pipe);
|
||||
flip->flipdata = flipdata;
|
||||
|
||||
seq = ms_drm_queue_alloc(crtc, flip, pageflip_handler, pageflip_abort);
|
||||
seq = ms_drm_queue_alloc(crtc, flip, ms_pageflip_handler, ms_pageflip_abort);
|
||||
if (!seq) {
|
||||
free(flip);
|
||||
return FALSE;
|
||||
|
@ -164,6 +253,8 @@ ms_do_pageflip(ScreenPtr screen,
|
|||
|
||||
flipdata->event = event;
|
||||
flipdata->screen = screen;
|
||||
flipdata->event_handler = pageflip_handler;
|
||||
flipdata->abort_handler = pageflip_abort;
|
||||
|
||||
/*
|
||||
* Take a local reference on flipdata.
|
||||
|
@ -206,8 +297,7 @@ ms_do_pageflip(ScreenPtr screen,
|
|||
|
||||
if (!queue_flip_on_crtc(screen, crtc, flipdata,
|
||||
ref_crtc_vblank_pipe,
|
||||
flags, pageflip_handler,
|
||||
pageflip_abort)) {
|
||||
flags)) {
|
||||
goto error_undo;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -192,60 +192,20 @@ ms_present_flush(WindowPtr window)
|
|||
#ifdef GLAMOR
|
||||
|
||||
/**
|
||||
* Free an ms_crtc_pageflip.
|
||||
* Callback for the DRM event queue when a flip has completed on all pipes
|
||||
*
|
||||
* Drops the reference count on the flipdata.
|
||||
*/
|
||||
static void
|
||||
ms_present_flip_free(struct ms_crtc_pageflip *flip)
|
||||
{
|
||||
struct ms_flipdata *flipdata = flip->flipdata;
|
||||
|
||||
free(flip);
|
||||
if (--flipdata->flip_count > 0)
|
||||
return;
|
||||
free(flipdata);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for the DRM event queue when a single flip has completed
|
||||
*
|
||||
* Once the flip has been completed on all pipes, notify the
|
||||
* extension code telling it when that happened
|
||||
* Notify the extension code
|
||||
*/
|
||||
static void
|
||||
ms_present_flip_handler(uint64_t msc, uint64_t ust, void *data)
|
||||
{
|
||||
struct ms_crtc_pageflip *flip = data;
|
||||
ScreenPtr screen = flip->flipdata->screen;
|
||||
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
|
||||
modesettingPtr ms = modesettingPTR(scrn);
|
||||
struct ms_flipdata *flipdata = flip->flipdata;
|
||||
struct ms_present_vblank_event *event = data;
|
||||
|
||||
DebugPresent(("\t\tms:fh %lld c %d msc %llu ust %llu\n",
|
||||
(long long) flipdata->event->event_id,
|
||||
flipdata->flip_count,
|
||||
DebugPresent(("\t\tms:fc %lld msc %llu ust %llu\n",
|
||||
(long long) event->event_id,
|
||||
(long long) msc, (long long) ust));
|
||||
|
||||
if (flip->on_reference_crtc) {
|
||||
flipdata->fe_msc = msc;
|
||||
flipdata->fe_usec = ust;
|
||||
}
|
||||
|
||||
if (flipdata->flip_count == 1) {
|
||||
DebugPresent(("\t\tms:fc %lld c %d msc %llu ust %llu\n",
|
||||
(long long) flipdata->event->event_id,
|
||||
flipdata->flip_count,
|
||||
(long long) flipdata->fe_msc, (long long) flipdata->fe_usec));
|
||||
|
||||
|
||||
ms_present_vblank_handler(flipdata->fe_msc,
|
||||
flipdata->fe_usec,
|
||||
flipdata->event);
|
||||
|
||||
drmModeRmFB(ms->fd, flipdata->old_fb_id);
|
||||
}
|
||||
ms_present_flip_free(flip);
|
||||
ms_present_vblank_handler(msc, ust, event);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -254,15 +214,11 @@ ms_present_flip_handler(uint64_t msc, uint64_t ust, void *data)
|
|||
static void
|
||||
ms_present_flip_abort(void *data)
|
||||
{
|
||||
struct ms_crtc_pageflip *flip = data;
|
||||
struct ms_flipdata *flipdata = flip->flipdata;
|
||||
struct ms_present_vblank_event *event = data;
|
||||
|
||||
DebugPresent(("\t\tms:fa %lld c %d\n", (long long) flipdata->event->event_id, flipdata->flip_count));
|
||||
DebugPresent(("\t\tms:fa %lld\n", (long long) event->event_id));
|
||||
|
||||
if (flipdata->flip_count == 1)
|
||||
free(flipdata->event);
|
||||
|
||||
ms_present_flip_free(flip);
|
||||
free(event);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue
Block a user