diff options
-rw-r--r-- | src/uxa/intel.h | 1 | ||||
-rw-r--r-- | src/uxa/intel_display.c | 20 | ||||
-rw-r--r-- | src/uxa/intel_dri.c | 28 | ||||
-rw-r--r-- | src/uxa/intel_present.c | 20 |
4 files changed, 39 insertions, 30 deletions
diff --git a/src/uxa/intel.h b/src/uxa/intel.h index a5e77af4..04d17f86 100644 --- a/src/uxa/intel.h +++ b/src/uxa/intel.h @@ -467,6 +467,7 @@ Bool intel_dri3_screen_init(ScreenPtr screen); extern Bool intel_crtc_on(xf86CrtcPtr crtc); int intel_crtc_to_pipe(xf86CrtcPtr crtc); +int intel_crtc_to_index(xf86CrtcPtr crtc); /* intel_memory.c */ unsigned long intel_get_fence_size(intel_screen_private *intel, unsigned long size); diff --git a/src/uxa/intel_display.c b/src/uxa/intel_display.c index ba4b8d87..409cbbcf 100644 --- a/src/uxa/intel_display.c +++ b/src/uxa/intel_display.c @@ -106,6 +106,7 @@ struct intel_crtc { drmModeModeInfo kmode; drmModeCrtcPtr mode_crtc; int pipe; + int index; dri_bo *cursor; dri_bo *rotate_bo; uint32_t rotate_pitch; @@ -755,6 +756,7 @@ intel_crtc_init(ScrnInfoPtr scrn, struct intel_mode *mode, drmModeResPtr mode_re intel_crtc->pipe = drm_intel_get_pipe_from_crtc_id(intel->bufmgr, crtc_id(intel_crtc)); + intel_crtc->index = num; intel_crtc->cursor = drm_intel_bo_alloc(intel->bufmgr, "ARGB cursor", 4*64*64, 4096); @@ -1768,7 +1770,7 @@ intel_do_pageflip(intel_screen_private *intel, /* Only the reference crtc will finally deliver its page flip * completion event. All other crtc's events will be discarded. */ - flip->dispatch_me = (intel_crtc_to_pipe(crtc->crtc) == ref_crtc_hw_id); + flip->dispatch_me = (intel_crtc_to_index(crtc->crtc) == ref_crtc_hw_id); flip->mode = mode; seq = intel_drm_queue_alloc(scrn, config->crtc[i], flip, intel_pageflip_handler, intel_pageflip_abort); @@ -1913,11 +1915,11 @@ intel_drm_abort_scrn(ScrnInfoPtr scrn) } } -static uint32_t pipe_select(int pipe) +static uint32_t crtc_select(int index) { - if (pipe > 1) - return pipe << DRM_VBLANK_HIGH_CRTC_SHIFT; - else if (pipe > 0) + if (index > 1) + return index << DRM_VBLANK_HIGH_CRTC_SHIFT; + else if (index > 0) return DRM_VBLANK_SECONDARY; else return 0; @@ -1933,7 +1935,7 @@ intel_get_msc_ust(ScrnInfoPtr scrn, xf86CrtcPtr crtc, uint32_t *msc, uint64_t *u drmVBlank vbl; /* Get current count */ - vbl.request.type = DRM_VBLANK_RELATIVE | pipe_select(intel_crtc_to_pipe(crtc)); + vbl.request.type = DRM_VBLANK_RELATIVE | crtc_select(intel_crtc_to_index(crtc)); vbl.request.sequence = 0; vbl.request.signal = 0; if (drmWaitVBlank(intel->drmSubFD, &vbl)) { @@ -2349,6 +2351,12 @@ int intel_crtc_to_pipe(xf86CrtcPtr crtc) return intel_crtc->pipe; } +int intel_crtc_to_index(xf86CrtcPtr crtc) +{ + struct intel_crtc *intel_crtc = crtc->driver_private; + return intel_crtc->index; +} + Bool intel_crtc_on(xf86CrtcPtr crtc) { struct intel_crtc *intel_crtc = crtc->driver_private; diff --git a/src/uxa/intel_dri.c b/src/uxa/intel_dri.c index e707b74f..d91ed295 100644 --- a/src/uxa/intel_dri.c +++ b/src/uxa/intel_dri.c @@ -94,11 +94,11 @@ static void I830DRI2FrameEventHandler(unsigned int frame, static void i830_dri2_del_frame_event(DRI2FrameEventPtr info); -static uint32_t pipe_select(int pipe) +static uint32_t crtc_select(int index) { - if (pipe > 1) - return pipe << DRM_VBLANK_HIGH_CRTC_SHIFT; - else if (pipe > 0) + if (index > 1) + return index << DRM_VBLANK_HIGH_CRTC_SHIFT; + else if (index > 0) return DRM_VBLANK_SECONDARY; else return 0; @@ -896,7 +896,7 @@ queue_flip(struct intel_screen_private *intel, return FALSE; if (!intel_do_pageflip(intel, old_back, - intel_crtc_to_pipe(crtc), + intel_crtc_to_index(crtc), FALSE, info, I830DRI2FlipComplete, I830DRI2FlipAbort)) return FALSE; @@ -940,7 +940,7 @@ queue_swap(struct intel_screen_private *intel, vbl.request.type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT | - pipe_select(intel_crtc_to_pipe(crtc)); + crtc_select(intel_crtc_to_index(crtc)); vbl.request.sequence = 1; vbl.request.signal = intel_drm_queue_alloc(intel->scrn, crtc, info, @@ -1096,7 +1096,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, drmVBlank vbl; int ret; xf86CrtcPtr crtc = I830DRI2DrawableCrtc(draw); - int pipe = crtc ? intel_crtc_to_pipe(crtc) : -1; + int index = crtc ? intel_crtc_to_index(crtc) : -1; int flip = 0; DRI2FrameEventPtr swap_info = NULL; uint64_t current_msc, current_ust; @@ -1104,7 +1104,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, uint32_t seq; /* Drawable not displayed... just complete the swap */ - if (pipe == -1) + if (index == -1) goto blit_fallback; swap_info = calloc(1, sizeof(DRI2FrameEventRec)); @@ -1162,7 +1162,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, */ if (divisor == 0 || current_msc < *target_msc) { vbl.request.type = - DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | pipe_select(pipe); + DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | crtc_select(index); /* If non-pageflipping, but blitting/exchanging, we need to use * DRM_VBLANK_NEXTONMISS to avoid unreliable timestamping later @@ -1207,7 +1207,7 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, * equation. */ vbl.request.type = - DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | pipe_select(pipe); + DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | crtc_select(index); if (flip == 0) vbl.request.type |= DRM_VBLANK_NEXTONMISS; @@ -1322,12 +1322,12 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc, drmVBlank vbl; int ret; xf86CrtcPtr crtc = I830DRI2DrawableCrtc(draw); - int pipe = crtc ? intel_crtc_to_pipe(crtc) : -1; + int index = crtc ? intel_crtc_to_index(crtc) : -1; CARD64 current_msc, current_ust, request_msc; uint32_t seq; /* Drawable not visible, return immediately */ - if (pipe == -1) + if (index == -1) goto out_complete; wait_info = calloc(1, sizeof(DRI2FrameEventRec)); @@ -1368,7 +1368,7 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc, if (current_msc >= target_msc) target_msc = current_msc; vbl.request.type = - DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | pipe_select(pipe); + DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | crtc_select(index); vbl.request.sequence = intel_crtc_msc_to_sequence(scrn, crtc, target_msc); vbl.request.signal = seq; @@ -1396,7 +1396,7 @@ I830DRI2ScheduleWaitMSC(ClientPtr client, DrawablePtr draw, CARD64 target_msc, * so we queue an event that will satisfy the divisor/remainder equation. */ vbl.request.type = - DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | pipe_select(pipe); + DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | crtc_select(index); request_msc = current_msc - (current_msc % divisor) + remainder; diff --git a/src/uxa/intel_present.c b/src/uxa/intel_present.c index ac028edd..b21e5c41 100644 --- a/src/uxa/intel_present.c +++ b/src/uxa/intel_present.c @@ -58,11 +58,11 @@ struct intel_present_vblank_event { uint64_t event_id; }; -static uint32_t pipe_select(int pipe) +static uint32_t crtc_select(int index) { - if (pipe > 1) - return pipe << DRM_VBLANK_HIGH_CRTC_SHIFT; - else if (pipe > 0) + if (index > 1) + return index << DRM_VBLANK_HIGH_CRTC_SHIFT; + else if (index > 0) return DRM_VBLANK_SECONDARY; else return 0; @@ -92,7 +92,7 @@ intel_present_get_crtc(WindowPtr window) } static int -intel_present_crtc_pipe(ScreenPtr screen, RRCrtcPtr randr_crtc) +intel_present_crtc_index(ScreenPtr screen, RRCrtcPtr randr_crtc) { xf86CrtcPtr crtc; @@ -100,7 +100,7 @@ intel_present_crtc_pipe(ScreenPtr screen, RRCrtcPtr randr_crtc) return 0; crtc = randr_crtc->devPrivate; - return intel_crtc_to_pipe(crtc); + return intel_crtc_to_index(crtc); } static int @@ -162,7 +162,7 @@ intel_present_queue_vblank(RRCrtcPtr crtc, ScreenPtr screen = crtc->pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); - int pipe = intel_present_crtc_pipe(screen, crtc); + int index = intel_present_crtc_index(screen, crtc); struct intel_present_vblank_event *event; drmVBlank vbl; int ret; @@ -180,7 +180,7 @@ intel_present_queue_vblank(RRCrtcPtr crtc, return BadAlloc; } - vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | pipe_select(pipe); + vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT | crtc_select(index); vbl.request.sequence = intel_crtc_msc_to_sequence(scrn, xf86_crtc, msc); vbl.request.signal = seq; for (;;) { @@ -315,7 +315,7 @@ intel_present_flip(RRCrtcPtr crtc, ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); struct intel_present_vblank_event *event; - int pipe = intel_present_crtc_pipe(screen, crtc); + int index = intel_present_crtc_index(screen, crtc); dri_bo *bo; Bool ret; @@ -332,7 +332,7 @@ intel_present_flip(RRCrtcPtr crtc, event->event_id = event_id; - ret = intel_do_pageflip(intel, bo, pipe, !sync_flip, + ret = intel_do_pageflip(intel, bo, index, !sync_flip, event, intel_present_flip_event, intel_present_flip_abort); |