summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/uxa/intel.h1
-rw-r--r--src/uxa/intel_display.c20
-rw-r--r--src/uxa/intel_dri.c28
-rw-r--r--src/uxa/intel_present.c20
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);