diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2014-06-20 09:04:30 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2014-06-20 14:28:39 +1000 |
commit | 36dda1341008dd87a6b5459f0616776097d11d9f (patch) | |
tree | 212bd9ca793410443bdc712165c5d3488be534b5 | |
parent | 8bdec8ebd68ba5eaa696d8a666e18774bff3b2ad (diff) |
dri2: shuffle some functions around
Nothing to see here...
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | src/nouveau_dri2.c | 246 |
1 files changed, 125 insertions, 121 deletions
diff --git a/src/nouveau_dri2.c b/src/nouveau_dri2.c index 778ecee..b4294b9 100644 --- a/src/nouveau_dri2.c +++ b/src/nouveau_dri2.c @@ -295,6 +295,131 @@ can_sync_to_vblank(DrawablePtr draw) draw->width, draw->height); } +#if DRI2INFOREC_VERSION >= 6 +static Bool +nouveau_dri2_swap_limit_validate(DrawablePtr draw, int swap_limit) +{ + ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen); + NVPtr pNv = NVPTR(scrn); + + if ((swap_limit < 1 ) || (swap_limit > pNv->max_swap_limit)) + return FALSE; + + return TRUE; +} +#endif + +/* Shall we intentionally violate the OML_sync_control spec to + * get some sort of triple-buffering behaviour on a pre 1.12.0 + * x-server? + */ +static Bool violate_oml(DrawablePtr draw) +{ + ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen); + NVPtr pNv = NVPTR(scrn); + + return (DRI2INFOREC_VERSION < 6) && (pNv->swap_limit > 1); +} + +void +nouveau_dri2_flip_event_handler(unsigned int frame, unsigned int tv_sec, + unsigned int tv_usec, void *event_data) +{ + struct nouveau_dri2_vblank_state *flip = event_data; + DrawablePtr draw; + ScreenPtr screen; + ScrnInfoPtr scrn; + int status; + + status = dixLookupDrawable(&draw, flip->draw, serverClient, + M_ANY, DixWriteAccess); + if (status != Success) { + free(flip); + return; + } + + screen = draw->pScreen; + scrn = xf86ScreenToScrn(screen); + + /* We assume our flips arrive in order, so we don't check the frame */ + switch (flip->action) { + case SWAP: + /* Check for too small vblank count of pageflip completion, + * taking wraparound into account. This usually means some + * defective kms pageflip completion, causing wrong (msc, ust) + * return values and possible visual corruption. + * Skip test for frame == 0, as this is a valid constant value + * reported by all Linux kernels at least up to Linux 3.0. + */ + if ((frame != 0) && + (frame < flip->frame) && (flip->frame - frame < 5)) { + xf86DrvMsg(scrn->scrnIndex, X_WARNING, + "%s: Pageflip has impossible msc %d < target_msc %d\n", + __func__, frame, flip->frame); + /* All-Zero values signal failure of (msc, ust) + * timestamping to client. + */ + frame = tv_sec = tv_usec = 0; + } + + DRI2SwapComplete(flip->client, draw, frame, tv_sec, tv_usec, + DRI2_FLIP_COMPLETE, flip->func, + flip->data); + break; + default: + xf86DrvMsg(scrn->scrnIndex, X_WARNING, + "%s: unknown vblank event received\n", __func__); + /* Unknown type */ + break; + } + + free(flip); +} + +static void +nouveau_dri2_finish_swap(DrawablePtr draw, unsigned int frame, + unsigned int tv_sec, unsigned int tv_usec, + struct nouveau_dri2_vblank_state *s); + +void +nouveau_dri2_vblank_handler(int fd, unsigned int frame, + unsigned int tv_sec, unsigned int tv_usec, + void *event_data) +{ + struct nouveau_dri2_vblank_state *s = event_data; + DrawablePtr draw; + int ret; + + ret = dixLookupDrawable(&draw, s->draw, serverClient, + M_ANY, DixWriteAccess); + if (ret) { + free(s); + return; + } + + switch (s->action) { + case SWAP: + nouveau_dri2_finish_swap(draw, frame, tv_sec, tv_usec, s); +#if DRI2INFOREC_VERSION >= 6 + /* Restore real swap limit on drawable, now that it is safe. */ + ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen); + DRI2SwapLimit(draw, NVPTR(scrn)->swap_limit); +#endif + break; + + case WAIT: + DRI2WaitMSCComplete(s->client, draw, frame, tv_sec, tv_usec); + free(s); + break; + + case BLIT: + DRI2SwapComplete(s->client, draw, frame, tv_sec, tv_usec, + DRI2_BLIT_COMPLETE, s->func, s->data); + free(s); + break; + } +} + static int nouveau_wait_vblank(DrawablePtr draw, int type, CARD64 msc, CARD64 *pmsc, CARD64 *pust, void *data) @@ -325,32 +450,6 @@ nouveau_wait_vblank(DrawablePtr draw, int type, CARD64 msc, return 0; } -#if DRI2INFOREC_VERSION >= 6 -static Bool -nouveau_dri2_swap_limit_validate(DrawablePtr draw, int swap_limit) -{ - ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen); - NVPtr pNv = NVPTR(scrn); - - if ((swap_limit < 1 ) || (swap_limit > pNv->max_swap_limit)) - return FALSE; - - return TRUE; -} -#endif - -/* Shall we intentionally violate the OML_sync_control spec to - * get some sort of triple-buffering behaviour on a pre 1.12.0 - * x-server? - */ -static Bool violate_oml(DrawablePtr draw) -{ - ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen); - NVPtr pNv = NVPTR(scrn); - - return (DRI2INFOREC_VERSION < 6) && (pNv->swap_limit > 1); -} - static void nouveau_dri2_finish_swap(DrawablePtr draw, unsigned int frame, unsigned int tv_sec, unsigned int tv_usec, @@ -671,101 +770,6 @@ nouveau_dri2_get_msc(DrawablePtr draw, CARD64 *ust, CARD64 *msc) return TRUE; } -void -nouveau_dri2_vblank_handler(int fd, unsigned int frame, - unsigned int tv_sec, unsigned int tv_usec, - void *event_data) -{ - struct nouveau_dri2_vblank_state *s = event_data; - DrawablePtr draw; - int ret; - - ret = dixLookupDrawable(&draw, s->draw, serverClient, - M_ANY, DixWriteAccess); - if (ret) { - free(s); - return; - } - - switch (s->action) { - case SWAP: - nouveau_dri2_finish_swap(draw, frame, tv_sec, tv_usec, s); -#if DRI2INFOREC_VERSION >= 6 - /* Restore real swap limit on drawable, now that it is safe. */ - ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen); - DRI2SwapLimit(draw, NVPTR(scrn)->swap_limit); -#endif - - break; - - case WAIT: - DRI2WaitMSCComplete(s->client, draw, frame, tv_sec, tv_usec); - free(s); - break; - - case BLIT: - DRI2SwapComplete(s->client, draw, frame, tv_sec, tv_usec, - DRI2_BLIT_COMPLETE, s->func, s->data); - free(s); - break; - } -} - -void -nouveau_dri2_flip_event_handler(unsigned int frame, unsigned int tv_sec, - unsigned int tv_usec, void *event_data) -{ - struct nouveau_dri2_vblank_state *flip = event_data; - DrawablePtr draw; - ScreenPtr screen; - ScrnInfoPtr scrn; - int status; - - status = dixLookupDrawable(&draw, flip->draw, serverClient, - M_ANY, DixWriteAccess); - if (status != Success) { - free(flip); - return; - } - - screen = draw->pScreen; - scrn = xf86ScreenToScrn(screen); - - /* We assume our flips arrive in order, so we don't check the frame */ - switch (flip->action) { - case SWAP: - /* Check for too small vblank count of pageflip completion, - * taking wraparound into account. This usually means some - * defective kms pageflip completion, causing wrong (msc, ust) - * return values and possible visual corruption. - * Skip test for frame == 0, as this is a valid constant value - * reported by all Linux kernels at least up to Linux 3.0. - */ - if ((frame != 0) && - (frame < flip->frame) && (flip->frame - frame < 5)) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "%s: Pageflip has impossible msc %d < target_msc %d\n", - __func__, frame, flip->frame); - /* All-Zero values signal failure of (msc, ust) - * timestamping to client. - */ - frame = tv_sec = tv_usec = 0; - } - - DRI2SwapComplete(flip->client, draw, frame, tv_sec, tv_usec, - DRI2_FLIP_COMPLETE, flip->func, - flip->data); - break; - default: - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "%s: unknown vblank event received\n", __func__); - /* Unknown type */ - break; - } - - free(flip); -} - Bool nouveau_dri2_init(ScreenPtr pScreen) { |