summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sna/sna.h5
-rw-r--r--src/sna/sna_display.c12
-rw-r--r--src/sna/sna_dri2.c43
-rw-r--r--src/sna/sna_present.c32
4 files changed, 52 insertions, 40 deletions
diff --git a/src/sna/sna.h b/src/sna/sna.h
index f08f4d23..cbebea0d 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -670,6 +670,11 @@ static inline unsigned sna_crtc_pipe(xf86CrtcPtr crtc)
return *sna_crtc_flags(crtc) >> 8 & 0xff;
}
+static inline unsigned sna_crtc_index(xf86CrtcPtr crtc)
+{
+ return *sna_crtc_flags(crtc) >> 16 & 0xff;
+}
+
static inline bool sna_crtc_is_on(xf86CrtcPtr crtc)
{
return *sna_crtc_flags(crtc) & CRTC_ON;
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 15df51f6..508c35e9 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -434,6 +434,11 @@ static inline unsigned __sna_crtc_pipe(struct sna_crtc *crtc)
return crtc->public.flags >> 8 & 0xff;
}
+static inline unsigned __sna_crtc_index(struct sna_crtc *crtc)
+{
+ return crtc->public.flags >> 16 & 0xff;
+}
+
static inline unsigned __sna_crtc_id(struct sna_crtc *crtc)
{
return crtc->id;
@@ -3777,7 +3782,7 @@ sna_crtc_init__cursor(struct sna *sna, struct sna_crtc *crtc)
}
static bool
-sna_crtc_add(ScrnInfoPtr scrn, unsigned id)
+sna_crtc_add(ScrnInfoPtr scrn, unsigned id, int index)
{
struct sna *sna = to_sna(scrn);
xf86CrtcPtr crtc;
@@ -3804,9 +3809,10 @@ sna_crtc_add(ScrnInfoPtr scrn, unsigned id)
}
assert((unsigned)get_pipe.pipe < 256);
sna_crtc->public.flags |= get_pipe.pipe << 8;
+ sna_crtc->public.flags |= index << 16;
if (is_zaphod(scrn) &&
- (get_zaphod_crtcs(sna) & (1 << get_pipe.pipe)) == 0) {
+ (get_zaphod_crtcs(sna) & (1 << index)) == 0) {
free(sna_crtc);
return true;
}
@@ -7891,7 +7897,7 @@ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
xf86_config->compat_output = 0;
for (i = 0; i < res->count_crtcs; i++)
- if (!sna_crtc_add(scrn, res->crtcs[i]))
+ if (!sna_crtc_add(scrn, res->crtcs[i], i))
return false;
sna->mode.num_real_crtc = xf86_config->num_crtc;
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index 4361af71..82c855a0 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -118,7 +118,7 @@ struct sna_dri2_event {
ClientPtr client;
enum event_type type;
xf86CrtcPtr crtc;
- int pipe;
+ int index;
bool queued;
bool sync;
bool chained;
@@ -1459,17 +1459,17 @@ sna_dri2_copy_region(DrawablePtr draw,
__sna_dri2_copy_region(sna, draw, region, src, dst, DRI2_DAMAGE);
}
-inline static uint32_t pipe_select(int pipe)
+inline static uint32_t crtc_select(int index)
{
/* The third pipe was introduced with IvyBridge long after
* multiple pipe support was added to the kernel, hence
* we can safely ignore the capability check - if we have more
* than two pipes, we can assume that they are fully supported.
*/
- assert(pipe < _DRM_VBLANK_HIGH_CRTC_MASK);
- if (pipe > 1)
- return pipe << DRM_VBLANK_HIGH_CRTC_SHIFT;
- else if (pipe > 0)
+ assert(index < _DRM_VBLANK_HIGH_CRTC_MASK);
+ if (index > 1)
+ return index << DRM_VBLANK_HIGH_CRTC_SHIFT;
+ else if (index > 0)
return DRM_VBLANK_SECONDARY;
else
return 0;
@@ -1479,15 +1479,15 @@ static inline bool sna_next_vblank(struct sna_dri2_event *info)
{
union drm_wait_vblank vbl;
- DBG(("%s(pipe=%d, waiting until next vblank)\n",
- __FUNCTION__, info->pipe));
- assert(info->pipe != -1);
+ DBG(("%s(crtc=%d, waiting until next vblank)\n",
+ __FUNCTION__, info->index));
+ assert(info->index != -1);
VG_CLEAR(vbl);
vbl.request.type =
DRM_VBLANK_RELATIVE |
DRM_VBLANK_EVENT |
- pipe_select(info->pipe);
+ crtc_select(info->index);
vbl.request.sequence = 1;
vbl.request.signal = (uintptr_t)info;
@@ -1504,15 +1504,15 @@ static inline bool sna_wait_vblank(struct sna_dri2_event *info,
{
union drm_wait_vblank vbl;
- DBG(("%s(pipe=%d, waiting until vblank %u)\n",
- __FUNCTION__, info->pipe, seq));
- assert(info->pipe != -1);
+ DBG(("%s(crtc=%d, waiting until vblank %u)\n",
+ __FUNCTION__, info->index, seq));
+ assert(info->index != -1);
VG_CLEAR(vbl);
vbl.request.type =
DRM_VBLANK_ABSOLUTE |
DRM_VBLANK_EVENT |
- pipe_select(info->pipe);
+ crtc_select(info->index);
vbl.request.sequence = seq;
vbl.request.signal = (uintptr_t)info;
@@ -1610,8 +1610,8 @@ static void frame_swap_complete(struct sna_dri2_event *frame, int type)
assert(frame->draw);
swap = sna_crtc_last_swap(frame->crtc);
- DBG(("%s(type=%d): draw=%ld, pipe=%d, frame=%lld [msc=%lld], tv=%d.%06d\n",
- __FUNCTION__, type, (long)frame->draw->id, frame->pipe,
+ DBG(("%s(type=%d): draw=%ld, crtc=%d, frame=%lld [msc=%lld], tv=%d.%06d\n",
+ __FUNCTION__, type, (long)frame->draw->id, frame->index,
(long long)swap->msc,
(long long)draw_current_msc(frame->draw, frame->crtc, swap->msc),
swap->tv_sec, swap->tv_usec));
@@ -1809,7 +1809,7 @@ sna_dri2_add_event(struct sna *sna,
info->sna = sna;
info->draw = draw;
info->crtc = crtc;
- info->pipe = sna_crtc_pipe(crtc);
+ info->index = sna_crtc_index(crtc);
info->keepalive = 1;
if (!add_event_to_client(info, sna, client)) {
@@ -2749,8 +2749,8 @@ sna_dri2_immediate_blit(struct sna *sna,
if (sna->flags & SNA_NO_WAIT)
sync = false;
- DBG(("%s: emitting immediate blit, throttling client, synced? %d, chained? %d, pipe %d\n",
- __FUNCTION__, sync, chain != info, info->pipe));
+ DBG(("%s: emitting immediate blit, throttling client, synced? %d, chained? %d, crtc %d\n",
+ __FUNCTION__, sync, chain != info, info->index));
assert(chain);
info->type = SWAP_COMPLETE;
@@ -2925,7 +2925,8 @@ static void sna_dri2_flip_event(struct sna_dri2_event *flip)
{
struct sna *sna = flip->sna;
- DBG(("%s flip=%p (pipe=%d, event=%d, queued?=%d)\n", __FUNCTION__, flip, flip->pipe, flip->type, flip->queued));
+ DBG(("%s flip=%p (crtc=%d, event=%d, queued?=%d)\n",
+ __FUNCTION__, flip, flip->index, flip->type, flip->queued));
if (!flip->queued) /* pageflip died whilst being queued */
return;
flip->queued = false;
@@ -2995,7 +2996,7 @@ sna_query_vblank(struct sna *sna, xf86CrtcPtr crtc, union drm_wait_vblank *vbl)
{
VG_CLEAR(*vbl);
vbl->request.type =
- _DRM_VBLANK_RELATIVE | pipe_select(sna_crtc_pipe(crtc));
+ _DRM_VBLANK_RELATIVE | crtc_select(sna_crtc_index(crtc));
vbl->request.sequence = 0;
return drmIoctl(sna->kgem.fd, DRM_IOCTL_WAIT_VBLANK, vbl);
diff --git a/src/sna/sna_present.c b/src/sna/sna_present.c
index 96be088a..b4f62566 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -104,27 +104,27 @@ static inline bool has_vblank(xf86CrtcPtr crtc)
return (uintptr_t)crtc & 1;
}
-static inline int pipe_from_crtc(RRCrtcPtr crtc)
+static inline int crtc_index_from_crtc(RRCrtcPtr crtc)
{
- return crtc ? sna_crtc_pipe(crtc->devPrivate) : -1;
+ return crtc ? sna_crtc_index(crtc->devPrivate) : -1;
}
-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;
}
-static inline int sna_wait_vblank(struct sna *sna, union drm_wait_vblank *vbl, int pipe)
+static inline int sna_wait_vblank(struct sna *sna, union drm_wait_vblank *vbl, int index)
{
- DBG(("%s(pipe=%d, waiting until seq=%u%s)\n",
- __FUNCTION__, pipe, vbl->request.sequence,
+ DBG(("%s(crtc=%d, waiting until seq=%u%s)\n",
+ __FUNCTION__, index, vbl->request.sequence,
vbl->request.type & DRM_VBLANK_RELATIVE ? " [relative]" : ""));
- vbl->request.type |= pipe_select(pipe);
+ vbl->request.type |= crtc_select(index);
return drmIoctl(sna->kgem.fd, DRM_IOCTL_WAIT_VBLANK, vbl);
}
@@ -228,7 +228,7 @@ static CARD32 sna_fake_vblank_handler(OsTimerPtr timer, CARD32 now, void *data)
VG_CLEAR(vbl);
vbl.request.type = (uint32_t)DRM_VBLANK_RELATIVE;
vbl.request.sequence = 0;
- if (sna_wait_vblank(info->sna, &vbl, sna_crtc_pipe(info->crtc)) == 0) {
+ if (sna_wait_vblank(info->sna, &vbl, sna_crtc_index(info->crtc)) == 0) {
ust = ust64(vbl.reply.tval_sec, vbl.reply.tval_usec);
msc = sna_crtc_record_vblank(info->crtc, &vbl);
DBG(("%s: event=%lld, target msc=%lld, now %lld\n",
@@ -243,7 +243,7 @@ static CARD32 sna_fake_vblank_handler(OsTimerPtr timer, CARD32 now, void *data)
vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
vbl.request.sequence = info->target_msc;
vbl.request.signal = (uintptr_t)MARK_PRESENT(info);
- if (sna_wait_vblank(info->sna, &vbl, sna_crtc_pipe(info->crtc)) == 0) {
+ if (sna_wait_vblank(info->sna, &vbl, sna_crtc_index(info->crtc)) == 0) {
DBG(("%s: scheduled new vblank event for %lld\n", __FUNCTION__, (long long)info->target_msc));
add_to_crtc_vblank(info, delta);
free(timer);
@@ -263,7 +263,7 @@ static CARD32 sna_fake_vblank_handler(OsTimerPtr timer, CARD32 now, void *data)
DBG(("%s: blocking wait!\n", __FUNCTION__));
vbl.request.type = (uint32_t)DRM_VBLANK_ABSOLUTE;
vbl.request.sequence = info->target_msc;
- if (sna_wait_vblank(info->sna, &vbl, sna_crtc_pipe(info->crtc)) == 0) {
+ if (sna_wait_vblank(info->sna, &vbl, sna_crtc_index(info->crtc)) == 0) {
ust = ust64(vbl.reply.tval_sec, vbl.reply.tval_usec);
msc = sna_crtc_record_vblank(info->crtc, &vbl);
} else {
@@ -337,7 +337,7 @@ static bool sna_present_queue(struct sna_present_event *info,
vbl.request.sequence = info->target_msc;
vbl.request.signal = (uintptr_t)MARK_PRESENT(info);
if (delta > 2 ||
- sna_wait_vblank(info->sna, &vbl, sna_crtc_pipe(info->crtc))) {
+ sna_wait_vblank(info->sna, &vbl, sna_crtc_index(info->crtc))) {
DBG(("%s: vblank enqueue failed, faking delta=%d\n", __FUNCTION__, delta));
if (!sna_fake_vblank(info))
return false;
@@ -408,7 +408,7 @@ static void add_keepalive(struct sna *sna, xf86CrtcPtr crtc, uint64_t msc)
vbl.request.sequence = msc;
vbl.request.signal = (uintptr_t)MARK_PRESENT(info);
- if (sna_wait_vblank(info->sna, &vbl, sna_crtc_pipe(crtc)) == 0) {
+ if (sna_wait_vblank(info->sna, &vbl, sna_crtc_index(crtc)) == 0) {
list_add_tail(&info->link, &tmp->link);
add_to_crtc_vblank(info, 1);
info->queued = true;
@@ -432,7 +432,7 @@ sna_present_get_ust_msc(RRCrtcPtr crtc, CARD64 *ust, CARD64 *msc)
VG_CLEAR(vbl);
vbl.request.type = (uint32_t)DRM_VBLANK_RELATIVE;
vbl.request.sequence = 0;
- if (sna_wait_vblank(sna, &vbl, sna_crtc_pipe(crtc->devPrivate)) == 0) {
+ if (sna_wait_vblank(sna, &vbl, sna_crtc_index(crtc->devPrivate)) == 0) {
*ust = ust64(vbl.reply.tval_sec, vbl.reply.tval_usec);
*msc = sna_crtc_record_vblank(crtc->devPrivate, &vbl);