[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-video-ati: Changes to 'debian-unstable'



 configure.ac                      |   53 +-
 debian/changelog                  |    6 
 man/radeon.man                    |   28 +
 src/Makefile.am                   |   10 
 src/ati_pciids_gen.h              |    2 
 src/drmmode_display.c             |  970 +++++++++++++++++++++++++++----------
 src/drmmode_display.h             |   46 +
 src/evergreen_accel.c             |    2 
 src/pcidb/ati_pciids.csv          |    2 
 src/radeon.h                      |  107 +++-
 src/radeon_accel.c                |    1 
 src/radeon_bo_helper.c            |  135 ++++-
 src/radeon_bo_helper.h            |    6 
 src/radeon_chipinfo_gen.h         |    2 
 src/radeon_chipset_gen.h          |    2 
 src/radeon_dri2.c                 |  695 ++++++++++++--------------
 src/radeon_dri2.h                 |   37 -
 src/radeon_dri3.c                 |  215 ++++++++
 src/radeon_drm_queue.c            |  181 ++++++
 src/radeon_drm_queue.h            |   56 ++
 src/radeon_exa.c                  |    1 
 src/radeon_glamor.c               |  121 ++--
 src/radeon_glamor.h               |   71 +-
 src/radeon_glamor_wrappers.c      |  994 ++++++++++++++++++++++++++++++++++++++
 src/radeon_kms.c                  |  396 ++++++++++++++-
 src/radeon_list.h                 |   39 +
 src/radeon_pci_chipset_gen.h      |    2 
 src/radeon_pci_device_match_gen.h |    2 
 src/radeon_present.c              |  465 +++++++++++++++++
 src/radeon_probe.c                |   11 
 src/radeon_probe.h                |    5 
 src/radeon_sync.c                 |  145 +++++
 src/radeon_video.c                |    7 
 src/radeon_video.h                |    1 
 34 files changed, 3983 insertions(+), 833 deletions(-)

New commits:
commit 578aa428eeaad72a9dc25bb04acb0f59cc23d731
Author: Timo Aaltonen <tjaalton@debian.org>
Date:   Thu Aug 20 14:26:42 2015 +0300

    update the changelog

diff --git a/debian/changelog b/debian/changelog
index 073b9bf..5ce07a2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+xserver-xorg-video-ati (1:7.5.0+git20150819-1) UNRELEASED; urgency=medium
+
+  * New upstream snapshot.
+
+ -- Timo Aaltonen <tjaalton@debian.org>  Thu, 20 Aug 2015 14:25:34 +0300
+
 xserver-xorg-video-ati (1:7.5.0-1) unstable; urgency=medium
 
   [ Andreas Boll ]

commit 0288a4b87b65ba54f37fbeeea3cb32238deee92e
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Wed Aug 19 16:54:14 2015 +0900

    DRI2: Keep MSC monotonic when moving window between CRTCs
    
    This mirrors the DRI3 implementation in xserver. Fixes VDPAU video
    playback hanging when moving the window between CRTCs.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=66384
    
    (Ported from amdgpu commit 63948ea091a9b324327ade7ec4fc5d67ca7e6f6f)
    
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index 09a84b5..b29d88b 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -65,6 +65,28 @@ struct dri2_buffer_priv {
 };
 
 
+struct dri2_window_priv {
+    xf86CrtcPtr crtc;
+    int vblank_delta;
+};
+
+#if HAS_DEVPRIVATEKEYREC
+
+static DevPrivateKeyRec dri2_window_private_key_rec;
+#define dri2_window_private_key (&dri2_window_private_key_rec)
+
+#else
+
+static int dri2_window_private_key_index;
+DevPrivateKey dri2_window_private_key = &dri2_window_private_key_index;
+
+#endif /* HAS_DEVPRIVATEKEYREC */
+
+#define get_dri2_window_priv(window) \
+    ((struct dri2_window_priv*) \
+     dixLookupPrivate(&(window)->devPrivates, dri2_window_private_key))
+
+
 static PixmapPtr get_drawable_pixmap(DrawablePtr drawable)
 {
     if (drawable->type == DRAWABLE_PIXMAP)
@@ -554,17 +576,80 @@ radeon_dri2_client_state_changed(CallbackListPtr *ClientStateCallback, pointer d
     }
 }
 
+/*
+ * Get current frame count delta for the specified drawable and CRTC
+ */
+static uint32_t radeon_get_msc_delta(DrawablePtr pDraw, xf86CrtcPtr crtc)
+{
+    drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+
+    if (pDraw && pDraw->type == DRAWABLE_WINDOW)
+	return drmmode_crtc->interpolated_vblanks +
+	    get_dri2_window_priv((WindowPtr)pDraw)->vblank_delta;
+
+    return drmmode_crtc->interpolated_vblanks;
+}
+
+/*
+ * Get current frame count and timestamp of the specified CRTC
+ */
+static Bool radeon_dri2_get_crtc_msc(xf86CrtcPtr crtc, CARD64 *ust, CARD64 *msc)
+{
+    if (!radeon_crtc_is_enabled(crtc) ||
+	 drmmode_crtc_get_ust_msc(crtc, ust, msc) != Success) {
+	/* CRTC is not running, extrapolate MSC and timestamp */
+	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+	ScrnInfoPtr scrn = crtc->scrn;
+	RADEONInfoPtr info = RADEONPTR(scrn);
+	CARD64 now, delta_t, delta_seq;
+
+	if (!drmmode_crtc->dpms_last_ust)
+	    return FALSE;
+
+	if (drmmode_get_current_ust(info->dri2.drm_fd, &now) != 0) {
+	    xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+		       "%s cannot get current time\n", __func__);
+	    return FALSE;
+	}
+
+	delta_t = now - drmmode_crtc->dpms_last_ust;
+	delta_seq = delta_t * drmmode_crtc->dpms_last_fps;
+	delta_seq /= 1000000;
+	*ust = drmmode_crtc->dpms_last_ust;
+	delta_t = delta_seq * 1000000;
+	delta_t /= drmmode_crtc->dpms_last_fps;
+	*ust += delta_t;
+	*msc = drmmode_crtc->dpms_last_seq;
+	*msc += delta_seq;
+    }
+
+    return TRUE;
+}
+
 static
 xf86CrtcPtr radeon_dri2_drawable_crtc(DrawablePtr pDraw, Bool consider_disabled)
 {
     ScreenPtr pScreen = pDraw->pScreen;
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+    xf86CrtcPtr crtc = radeon_pick_best_crtc(pScrn, consider_disabled,
+					      pDraw->x, pDraw->x + pDraw->width,
+					      pDraw->y, pDraw->y + pDraw->height);
+
+    if (crtc && pDraw->type == DRAWABLE_WINDOW) {
+	struct dri2_window_priv *priv = get_dri2_window_priv((WindowPtr)pDraw);
+
+	if (priv->crtc && priv->crtc != crtc) {
+	    CARD64 ust, mscold, mscnew;
 
-    return radeon_pick_best_crtc(pScrn, consider_disabled,
-				 pDraw->x,
-				 pDraw->x + pDraw->width,
-				 pDraw->y,
-				 pDraw->y + pDraw->height);
+	    radeon_dri2_get_crtc_msc(priv->crtc, &ust, &mscold);
+	    radeon_dri2_get_crtc_msc(crtc, &ust, &mscnew);
+	    priv->vblank_delta += mscold - mscnew;
+	}
+
+	priv->crtc = crtc;
+    }
+
+    return crtc;
 }
 
 static void
@@ -592,7 +677,7 @@ radeon_dri2_flip_event_handler(ScrnInfoPtr scrn, uint32_t frame, uint64_t usec,
 
     if (!flip->crtc)
 	goto abort;
-    frame += radeon_get_interpolated_vblanks(flip->crtc);
+    frame += radeon_get_msc_delta(drawable, flip->crtc);
 
     screen = scrn->pScreen;
     pixmap = screen->GetScreenPixmap(screen);
@@ -825,7 +910,7 @@ static void radeon_dri2_frame_event_handler(ScrnInfoPtr scrn, uint32_t seq,
     if (status != Success)
         goto cleanup;
 
-    seq += radeon_get_interpolated_vblanks(event->crtc);
+    seq += radeon_get_msc_delta(drawable, event->crtc);
 
     switch (event->type) {
     case DRI2_FLIP:
@@ -912,8 +997,6 @@ CARD32 radeon_dri2_extrapolate_msc_delay(xf86CrtcPtr crtc, CARD64 *target_msc,
     int nominal_frame_rate = drmmode_crtc->dpms_last_fps;
     CARD64 last_vblank_ust = drmmode_crtc->dpms_last_ust;
     uint32_t last_vblank_seq = drmmode_crtc->dpms_last_seq;
-    int interpolated_vblanks = drmmode_crtc->interpolated_vblanks;
-    int target_seq;
     CARD64 now, target_time, delta_t;
     int64_t d, delta_seq;
     int ret;
@@ -930,16 +1013,15 @@ CARD32 radeon_dri2_extrapolate_msc_delay(xf86CrtcPtr crtc, CARD64 *target_msc,
 	*target_msc = 0;
 	return FALLBACK_SWAP_DELAY;
     }
-    target_seq = (int)*target_msc - interpolated_vblanks;
-    delta_seq = (int64_t)target_seq - (int64_t)last_vblank_seq;
+    delta_seq = *target_msc - last_vblank_seq;
     delta_seq *= 1000000;
     target_time = last_vblank_ust;
     target_time += delta_seq / nominal_frame_rate;
     d = target_time - now;
     if (d < 0) {
 	/* we missed the event, adjust target_msc, do the divisor magic */
-	CARD64 current_msc;
-	current_msc = last_vblank_seq + interpolated_vblanks;
+	CARD64 current_msc = last_vblank_seq;
+
 	delta_t = now - last_vblank_ust;
 	delta_seq = delta_t * nominal_frame_rate;
 	current_msc += delta_seq / 1000000;
@@ -952,8 +1034,7 @@ CARD32 radeon_dri2_extrapolate_msc_delay(xf86CrtcPtr crtc, CARD64 *target_msc,
 	    if ((current_msc % divisor) >= remainder)
 		*target_msc += divisor;
 	    *target_msc &= 0xffffffff;
-	    target_seq = (int)*target_msc - interpolated_vblanks;
-	    delta_seq = (int64_t)target_seq - (int64_t)last_vblank_seq;
+	    delta_seq = *target_msc - last_vblank_seq;
 	    delta_seq *= 1000000;
 	    target_time = last_vblank_ust;
 	    target_time += delta_seq / nominal_frame_rate;
@@ -980,7 +1061,6 @@ CARD32 radeon_dri2_extrapolate_msc_delay(xf86CrtcPtr crtc, CARD64 *target_msc,
 static int radeon_dri2_get_msc(DrawablePtr draw, CARD64 *ust, CARD64 *msc)
 {
     xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw, TRUE);
-    int ret;
 
     /* Drawable not displayed, make up a value */
     if (crtc == NULL) {
@@ -989,43 +1069,12 @@ static int radeon_dri2_get_msc(DrawablePtr draw, CARD64 *ust, CARD64 *msc)
         return TRUE;
     }
 
-    if (radeon_crtc_is_enabled(crtc)) {
-	/* CRTC is running, read vblank counter and timestamp */
-	ret = drmmode_crtc_get_ust_msc(crtc, ust, msc);
-	if (ret != Success)
-	    return FALSE;
-
-	*msc += radeon_get_interpolated_vblanks(crtc);
-	*msc &= 0xffffffff;
-    } else {
-	/* CRTC is not running, extrapolate MSC and timestamp */
-	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
-	ScrnInfoPtr scrn = crtc->scrn;
-	RADEONInfoPtr info = RADEONPTR(scrn);
-	CARD64 now, delta_t, delta_seq;
-
-	if (!drmmode_crtc->dpms_last_ust)
-	    return FALSE;
-	ret = drmmode_get_current_ust(info->dri2.drm_fd, &now);
-	if (ret) {
-	    xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-		       "%s cannot get current time\n", __func__);
-	    return FALSE;
-	}
-	delta_t = now - drmmode_crtc->dpms_last_ust;
-	delta_seq = delta_t * drmmode_crtc->dpms_last_fps;
-	delta_seq /= 1000000;
-	*ust = drmmode_crtc->dpms_last_ust;
-	delta_t = delta_seq * 1000000;
-	delta_t /= drmmode_crtc->dpms_last_fps;
-	*ust += delta_t;
-	*msc = drmmode_crtc->dpms_last_seq;
-	*msc += drmmode_crtc->interpolated_vblanks;
-	*msc += delta_seq;
-	*msc &= 0xffffffff;
-    }
+    if (!radeon_dri2_get_crtc_msc(crtc, ust, msc))
+	return FALSE;
 
-    return ret == Success;
+    *msc += radeon_get_msc_delta(draw, crtc);
+    *msc &= 0xffffffff;
+    return TRUE;
 }
 
 static
@@ -1113,6 +1162,7 @@ static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw,
     DRI2FrameEventPtr wait_info = NULL;
     struct radeon_drm_queue_entry *wait = NULL;
     xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw, TRUE);
+    uint32_t msc_delta;
     drmVBlank vbl;
     int ret;
     CARD64 current_msc;
@@ -1127,6 +1177,8 @@ static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw,
     if (crtc == NULL)
         goto out_complete;
 
+    msc_delta = radeon_get_msc_delta(draw, crtc);
+
     wait_info = calloc(1, sizeof(DRI2FrameEventRec));
     if (!wait_info)
         goto out_complete;
@@ -1142,6 +1194,7 @@ static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw,
      */
     if (!radeon_crtc_is_enabled(crtc)) {
 	CARD32 delay;
+	target_msc -= msc_delta;
 	delay = radeon_dri2_extrapolate_msc_delay(crtc, &target_msc,
 						  divisor, remainder);
 	radeon_dri2_schedule_event(delay, wait_info);
@@ -1160,7 +1213,7 @@ static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw,
         goto out_complete;
     }
 
-    current_msc = vbl.reply.sequence + radeon_get_interpolated_vblanks(crtc);
+    current_msc = vbl.reply.sequence + msc_delta;
     current_msc &= 0xffffffff;
 
     wait = radeon_drm_queue_alloc(scrn, client, RADEON_DRM_QUEUE_ID_DEFAULT,
@@ -1189,8 +1242,7 @@ static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw,
             target_msc = current_msc;
         vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
 	vbl.request.type |= radeon_populate_vbl_request_type(crtc);
-        vbl.request.sequence = target_msc;
-	vbl.request.sequence -= radeon_get_interpolated_vblanks(crtc);
+        vbl.request.sequence = target_msc - msc_delta;
         vbl.request.signal = (unsigned long)wait;
         ret = drmWaitVBlank(info->dri2.drm_fd, &vbl);
         if (ret) {
@@ -1211,7 +1263,7 @@ static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw,
     vbl.request.type |= radeon_populate_vbl_request_type(crtc);
 
     vbl.request.sequence = current_msc - (current_msc % divisor) +
-        remainder;
+        remainder - msc_delta;
 
     /*
      * If calculated remainder is larger than requested remainder,
@@ -1221,7 +1273,6 @@ static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw,
      */
     if ((current_msc % divisor) >= remainder)
         vbl.request.sequence += divisor;
-    vbl.request.sequence -= radeon_get_interpolated_vblanks(crtc);
 
     vbl.request.signal = (unsigned long)wait;
     ret = drmWaitVBlank(info->dri2.drm_fd, &vbl);
@@ -1271,6 +1322,7 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
     ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
     RADEONInfoPtr info = RADEONPTR(scrn);
     xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw, TRUE);
+    uint32_t msc_delta;
     drmVBlank vbl;
     int ret, flip = 0;
     DRI2FrameEventPtr swap_info = NULL;
@@ -1296,6 +1348,8 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
     if (crtc == NULL)
         goto blit_fallback;
 
+    msc_delta = radeon_get_msc_delta(draw, crtc);
+
     swap_info = calloc(1, sizeof(DRI2FrameEventRec));
     if (!swap_info)
         goto blit_fallback;
@@ -1326,8 +1380,11 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
      */
     if (!radeon_crtc_is_enabled(crtc)) {
 	CARD32 delay;
+	*target_msc -= msc_delta;
 	delay = radeon_dri2_extrapolate_msc_delay(crtc, target_msc,
 						  divisor, remainder);
+	*target_msc += msc_delta;
+	*target_msc &= 0xffffffff;
 	radeon_dri2_schedule_event(delay, swap_info);
 	return TRUE;
     }
@@ -1344,7 +1401,7 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
 	goto blit_fallback;
     }
 
-    current_msc = vbl.reply.sequence + radeon_get_interpolated_vblanks(crtc);
+    current_msc = vbl.reply.sequence + msc_delta;
     current_msc &= 0xffffffff;
 
     /* Flips need to be submitted one frame before */
@@ -1382,8 +1439,7 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
         if (current_msc >= *target_msc)
             *target_msc = current_msc;
 
-        vbl.request.sequence = *target_msc;
-	vbl.request.sequence -= radeon_get_interpolated_vblanks(crtc);
+        vbl.request.sequence = *target_msc - msc_delta;
         vbl.request.signal = (unsigned long)swap;
         ret = drmWaitVBlank(info->dri2.drm_fd, &vbl);
         if (ret) {
@@ -1393,8 +1449,7 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
 	    goto blit_fallback;
         }
 
-        *target_msc = vbl.reply.sequence + flip;
-	*target_msc += radeon_get_interpolated_vblanks(crtc);
+        *target_msc = vbl.reply.sequence + flip + msc_delta;
         swap_info->frame = *target_msc;
 
         return TRUE;
@@ -1411,7 +1466,7 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
     vbl.request.type |= radeon_populate_vbl_request_type(crtc);
 
     vbl.request.sequence = current_msc - (current_msc % divisor) +
-        remainder;
+        remainder - msc_delta;
 
     /*
      * If the calculated deadline vbl.request.sequence is smaller than
@@ -1426,7 +1481,6 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
      */
     if (vbl.request.sequence <= current_msc)
         vbl.request.sequence += divisor;
-    vbl.request.sequence -= radeon_get_interpolated_vblanks(crtc);
 
     /* Account for 1 frame extra pageflip delay if flip > 0 */
     vbl.request.sequence -= flip;
@@ -1441,8 +1495,8 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
     }
 
     /* Adjust returned value for 1 fame pageflip offset of flip > 0 */
-    *target_msc = vbl.reply.sequence + flip;
-    *target_msc += radeon_get_interpolated_vblanks(crtc);
+    *target_msc = vbl.reply.sequence + flip + msc_delta;
+    *target_msc &= 0xffffffff;
     swap_info->frame = *target_msc;
 
     return TRUE;
@@ -1544,6 +1598,19 @@ radeon_dri2_screen_init(ScreenPtr pScreen)
             driverNames[1] = NULL; /* no VDPAU support */
 
 	if (DRI2InfoCnt == 0) {
+#if HAS_DIXREGISTERPRIVATEKEY
+	    if (!dixRegisterPrivateKey(dri2_window_private_key,
+				       PRIVATE_WINDOW,
+				       sizeof(struct dri2_window_priv))) {
+#else
+	    if (!dixRequestPrivate(dri2_window_private_key,
+				   sizeof(struct dri2_window_priv))) {
+#endif
+		xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+			   "Failed to get DRI2 window private\n");
+		return FALSE;
+	    }
+
 	    AddCallback(&ClientStateCallback, radeon_dri2_client_state_changed, 0);
 	}
 
diff --git a/src/radeon_video.c b/src/radeon_video.c
index f66ba55..9b714e9 100644
--- a/src/radeon_video.c
+++ b/src/radeon_video.c
@@ -74,12 +74,6 @@ Bool radeon_crtc_is_enabled(xf86CrtcPtr crtc)
     return drmmode_crtc->dpms_mode == DPMSModeOn;
 }
 
-uint32_t radeon_get_interpolated_vblanks(xf86CrtcPtr crtc)
-{
-    drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
-    return drmmode_crtc->interpolated_vblanks;
-}
-
 xf86CrtcPtr
 radeon_pick_best_crtc(ScrnInfoPtr pScrn, Bool consider_disabled,
 		      int x1, int x2, int y1, int y2)
diff --git a/src/radeon_video.h b/src/radeon_video.h
index 2a09295..e6068e8 100644
--- a/src/radeon_video.h
+++ b/src/radeon_video.h
@@ -101,6 +101,5 @@ RADEONCopyMungedData(ScrnInfoPtr pScrn,
 		     unsigned int dstPitch, unsigned int h, unsigned int w);
 
 Bool radeon_crtc_is_enabled(xf86CrtcPtr crtc);
-uint32_t radeon_get_interpolated_vblanks(xf86CrtcPtr crtc);
 
 #endif

commit 1d886b526dc49f32dc6744b7a882894bdac4e846
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Wed Aug 19 18:11:45 2015 +0900

    DRI2: Don't ignore rotated CRTCs in amdgpu_dri2_drawable_crtc
    
    Waiting for vblank interrupts works fine with rotated CRTCs. The only
    case we can't handle with rotation is page flipping, which is handled
    in can_exchange().
    
    This fixes gnome-shell hanging on rotation, probably because
    amdgpu_dri2_get_msc returned MSC/UST 0 for rotated CRTCs.
    
    (Ported from amdgpu commit 7b3212e33cd36fb6f122774df27b56ec4e1a22b8)
    
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index 7587a0c..09a84b5 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -559,19 +559,12 @@ xf86CrtcPtr radeon_dri2_drawable_crtc(DrawablePtr pDraw, Bool consider_disabled)
 {
     ScreenPtr pScreen = pDraw->pScreen;
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
-    xf86CrtcPtr crtc;
 
-    crtc = radeon_pick_best_crtc(pScrn, consider_disabled,
+    return radeon_pick_best_crtc(pScrn, consider_disabled,
 				 pDraw->x,
 				 pDraw->x + pDraw->width,
 				 pDraw->y,
 				 pDraw->y + pDraw->height);
-
-    /* Make sure the CRTC is valid and this is the real front buffer */
-    if (crtc != NULL && !crtc->rotatedData)
-	return crtc;
-    else
-	return NULL;
 }
 
 static void

commit 270da55340766074cabff8af4258e29fe2f0fc81
Author: Alex Deucher <alexander.deucher@amd.com>
Date:   Mon Aug 10 15:32:34 2015 -0400

    add new OLAND pci id
    
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

diff --git a/src/ati_pciids_gen.h b/src/ati_pciids_gen.h
index 1055dce..c6216a5 100644
--- a/src/ati_pciids_gen.h
+++ b/src/ati_pciids_gen.h
@@ -692,6 +692,7 @@
 #define PCI_CHIP_OLAND_6610 0x6610
 #define PCI_CHIP_OLAND_6611 0x6611
 #define PCI_CHIP_OLAND_6613 0x6613
+#define PCI_CHIP_OLAND_6617 0x6617
 #define PCI_CHIP_OLAND_6620 0x6620
 #define PCI_CHIP_OLAND_6621 0x6621
 #define PCI_CHIP_OLAND_6623 0x6623
diff --git a/src/pcidb/ati_pciids.csv b/src/pcidb/ati_pciids.csv
index c2a52fc..55d7b1d 100644
--- a/src/pcidb/ati_pciids.csv
+++ b/src/pcidb/ati_pciids.csv
@@ -693,6 +693,7 @@
 "0x6610","OLAND_6610","OLAND",,,,,,"OLAND"
 "0x6611","OLAND_6611","OLAND",,,,,,"OLAND"
 "0x6613","OLAND_6613","OLAND",,,,,,"OLAND"
+"0x6617","OLAND_6617","OLAND",1,,,,,"OLAND"
 "0x6620","OLAND_6620","OLAND",1,,,,,"OLAND"
 "0x6621","OLAND_6621","OLAND",1,,,,,"OLAND"
 "0x6623","OLAND_6623","OLAND",1,,,,,"OLAND"
diff --git a/src/radeon_chipinfo_gen.h b/src/radeon_chipinfo_gen.h
index 0673f9a..91ef8df 100644
--- a/src/radeon_chipinfo_gen.h
+++ b/src/radeon_chipinfo_gen.h
@@ -612,6 +612,7 @@ static RADEONCardInfo RADEONCards[] = {
  { 0x6610, CHIP_FAMILY_OLAND, 0, 0, 0, 0, 0 },
  { 0x6611, CHIP_FAMILY_OLAND, 0, 0, 0, 0, 0 },
  { 0x6613, CHIP_FAMILY_OLAND, 0, 0, 0, 0, 0 },
+ { 0x6617, CHIP_FAMILY_OLAND, 1, 0, 0, 0, 0 },
  { 0x6620, CHIP_FAMILY_OLAND, 1, 0, 0, 0, 0 },
  { 0x6621, CHIP_FAMILY_OLAND, 1, 0, 0, 0, 0 },
  { 0x6623, CHIP_FAMILY_OLAND, 1, 0, 0, 0, 0 },
diff --git a/src/radeon_chipset_gen.h b/src/radeon_chipset_gen.h
index 6b56eb6..5d6d233 100644
--- a/src/radeon_chipset_gen.h
+++ b/src/radeon_chipset_gen.h
@@ -612,6 +612,7 @@ SymTabRec RADEONChipsets[] = {
   { PCI_CHIP_OLAND_6610, "OLAND" },
   { PCI_CHIP_OLAND_6611, "OLAND" },
   { PCI_CHIP_OLAND_6613, "OLAND" },
+  { PCI_CHIP_OLAND_6617, "OLAND" },
   { PCI_CHIP_OLAND_6620, "OLAND" },
   { PCI_CHIP_OLAND_6621, "OLAND" },
   { PCI_CHIP_OLAND_6623, "OLAND" },
diff --git a/src/radeon_pci_chipset_gen.h b/src/radeon_pci_chipset_gen.h
index 61cc50c..4b4b8e4 100644
--- a/src/radeon_pci_chipset_gen.h
+++ b/src/radeon_pci_chipset_gen.h
@@ -612,6 +612,7 @@ static PciChipsets RADEONPciChipsets[] = {
  { PCI_CHIP_OLAND_6610, PCI_CHIP_OLAND_6610, RES_SHARED_VGA },
  { PCI_CHIP_OLAND_6611, PCI_CHIP_OLAND_6611, RES_SHARED_VGA },
  { PCI_CHIP_OLAND_6613, PCI_CHIP_OLAND_6613, RES_SHARED_VGA },
+ { PCI_CHIP_OLAND_6617, PCI_CHIP_OLAND_6617, RES_SHARED_VGA },
  { PCI_CHIP_OLAND_6620, PCI_CHIP_OLAND_6620, RES_SHARED_VGA },
  { PCI_CHIP_OLAND_6621, PCI_CHIP_OLAND_6621, RES_SHARED_VGA },
  { PCI_CHIP_OLAND_6623, PCI_CHIP_OLAND_6623, RES_SHARED_VGA },
diff --git a/src/radeon_pci_device_match_gen.h b/src/radeon_pci_device_match_gen.h
index 0b821b2..6dfe1e4 100644
--- a/src/radeon_pci_device_match_gen.h
+++ b/src/radeon_pci_device_match_gen.h
@@ -612,6 +612,7 @@ static const struct pci_id_match radeon_device_match[] = {
  ATI_DEVICE_MATCH( PCI_CHIP_OLAND_6610, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_OLAND_6611, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_OLAND_6613, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_OLAND_6617, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_OLAND_6620, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_OLAND_6621, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_OLAND_6623, 0 ),

commit f123096877f0a0044f3d0315285441f2b5790c29
Author: Mario Kleiner <mario.kleiner.de@gmail.com>
Date:   Mon Aug 10 23:34:39 2015 +0200

    Make selection between DRI2 and DRI3 consistent with other drivers. (v2)
    
    Add Option "DRI" to allow selection of maximum DRI level.
    
    This allows the user to select the maximum level of DRI
    implementation to use, DRI2 or DRI3. It replaces the old
    option "DRI3" which had exactly the same purpose, but
    differs from the method used in both intel ddx and nouveau ddx.
    Make this consistent before a new stable driver is released.
    
    v2: Retain handling of old Option "DRI3" for backwards
        compatibility, but Option "DRI" will take precedence
        over "DRI3" if both are provided.
    
    Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
    Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>

diff --git a/man/radeon.man b/man/radeon.man
index f0a6be1..fa55c6d 100644
--- a/man/radeon.man
+++ b/man/radeon.man
@@ -267,9 +267,10 @@ The default value is
 for R/RV6XX, R/RV7XX, RS780, RS880, EVERGREEN, CAYMAN, ARUBA, Southern Islands, and
 Sea Islands.
 .TP
-.BI "Option \*qDRI3\*q \*q" boolean \*q
-Enable the DRI3 extension. The default is
-.B off.
+.BI "Option \*qDRI\*q \*q" integer \*q
+Define the maximum level of DRI to enable. Valid values are 2 for DRI2 or 3 for DRI3.
+The default is
+.B 2 for DRI2.
 .TP
 .BI "Option \*qEnablePageFlip\*q \*q" boolean \*q
 Enable DRI2 page flipping.  The default is
diff --git a/src/radeon.h b/src/radeon.h
index 88df93f..e2fd41c 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -151,6 +151,7 @@ typedef enum {
     OPTION_SWAPBUFFERS_WAIT,
     OPTION_DELETE_DP12,
     OPTION_DRI3,
+    OPTION_DRI,
     OPTION_SHADOW_PRIMARY,
     OPTION_TEAR_FREE,
 } RADEONOpts;
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index c75aa97..8aa7633 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -78,6 +78,7 @@ const OptionInfoRec RADEONOptions_KMS[] = {
     { OPTION_SWAPBUFFERS_WAIT,"SwapbuffersWait", OPTV_BOOLEAN, {0}, FALSE },
     { OPTION_DELETE_DP12,    "DeleteUnusedDP12Displays", OPTV_BOOLEAN, {0}, FALSE},
     { OPTION_DRI3,           "DRI3",             OPTV_BOOLEAN, {0}, FALSE },
+    { OPTION_DRI,            "DRI",              OPTV_INTEGER, {0}, FALSE },
     { OPTION_TEAR_FREE,      "TearFree",         OPTV_BOOLEAN, {0}, FALSE },
     { -1,                    NULL,               OPTV_NONE,    {0}, FALSE }
 };
@@ -1518,6 +1519,7 @@ Bool RADEONScreenInit_KMS(SCREEN_INIT_ARGS_DECL)
     int            subPixelOrder = SubPixelUnknown;
     MessageType from;
     Bool value;
+    int driLevel;
     const char *s;
     void *front_ptr;
 
@@ -1629,10 +1631,15 @@ Bool RADEONScreenInit_KMS(SCREEN_INIT_ARGS_DECL)
 #endif
 
     value = FALSE;
+    from = X_DEFAULT;
     if (xf86GetOptValBool(info->Options, OPTION_DRI3, &value))
 	from = X_CONFIG;
-    else
-	from = X_DEFAULT;
+
+    if (xf86GetOptValInteger(info->Options, OPTION_DRI, &driLevel) &&
+	(driLevel == 2 || driLevel == 3)) {
+	from = X_CONFIG;
+	value = driLevel == 3;
+    }
 
     if (value) {
 	value = radeon_sync_init(pScreen) &&
@@ -1642,6 +1649,7 @@ Bool RADEONScreenInit_KMS(SCREEN_INIT_ARGS_DECL)
 	if (!value)
 	    from = X_WARNING;
     }
+
     xf86DrvMsg(pScrn->scrnIndex, from, "DRI3 %sabled\n", value ? "en" : "dis");
 
     pScrn->vtSema = TRUE;

commit 3791fceabf2cb037467dc41c15364e9f9ec1e47e
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Thu Aug 6 16:27:01 2015 +0900

    Wait for scanout BO initialization to finish before setting mode
    
    This should avoid intermittent artifacts which could sometimes be visible
    when setting a new scanout pixmap, e.g. on server startup or when
    changing resolutions.
    
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index a769013..efc35f0 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -467,6 +467,7 @@ void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
 	FreeScratchGC(gc);
 
 	radeon_cs_flush_indirect(pScrn);
+	radeon_bo_wait(info->front_bo);
 
 	pScreen->canDoBGNoneRoot = TRUE;
 	destroy_pixmap_for_fbcon(pScrn);
@@ -757,6 +758,7 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 				x = y = 0;
 
 				radeon_scanout_update_handler(pScrn, 0, 0, crtc);
+				radeon_bo_wait(drmmode_crtc->scanout[0].bo);
 			}
 		}
 		ret = drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
@@ -1959,6 +1961,7 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height)
 	FreeScratchGC(gc);
 	info->accel_state->force = force;
 	radeon_cs_flush_indirect(scrn);
+	radeon_bo_wait(info->front_bo);
 
 	for (i = 0; i < xf86_config->num_crtc; i++) {
 		xf86CrtcPtr crtc = xf86_config->crtc[i];

commit 4e3dfa69e4630df2e0ec0f5b81d61159757c4664
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Thu Aug 6 16:16:38 2015 +0900

    Only call drmmode_copy_fb (at most) once on server startup
    
    It doesn't make sense to copy the screen contents from console when VT
    switching back to Xorg or when Xorg resets.
    
    Fixes intermittent artifacts when VT switching back from console to the
    gdm login screen.
    
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 14de0eb..c75aa97 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -1037,7 +1037,7 @@ static void RADEONSetupCapabilities(ScrnInfoPtr pScrn)
 /* When the root window is created, initialize the screen contents from
  * console if -background none was specified on the command line
  */
-static Bool RADEONCreateWindow(WindowPtr pWin)
+static Bool RADEONCreateWindow_oneshot(WindowPtr pWin)
 {
     ScreenPtr pScreen = pWin->drawable.pScreen;
     ScrnInfoPtr pScrn;
@@ -1714,9 +1714,9 @@ Bool RADEONScreenInit_KMS(SCREEN_INIT_ARGS_DECL)
     pScrn->pScreen = pScreen;
 
 #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 10
-    if (bgNoneRoot && info->accelOn) {
+    if (serverGeneration == 1 && bgNoneRoot && info->accelOn) {
 	info->CreateWindow = pScreen->CreateWindow;
-	pScreen->CreateWindow = RADEONCreateWindow;
+	pScreen->CreateWindow = RADEONCreateWindow_oneshot;
     }
 #endif
 
@@ -1779,11 +1779,6 @@ Bool RADEONEnterVT_KMS(VT_FUNC_ARGS_DECL)
 
     pScrn->vtSema = TRUE;
 
-#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 10
-    if (bgNoneRoot && info->accelOn)
-	drmmode_copy_fb(pScrn, &info->drmmode);
-#endif
-
     if (!drmmode_set_desired_modes(pScrn, &info->drmmode, TRUE))
 	return FALSE;
 

commit 09c7cdb923965f9a1ea11d2f449bc02114408938
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Thu Jul 30 15:58:54 2015 +0900

    glamor: Move declaration of struct radeon_pixmap out of #if/#else blocks
    
    Reviewed-by: Dave Airlie <airlied@redhat.com>

diff --git a/src/radeon_glamor.h b/src/radeon_glamor.h
index c77466e..246336b 100644
--- a/src/radeon_glamor.h
+++ b/src/radeon_glamor.h
@@ -28,6 +28,9 @@
 #define RADEON_GLAMOR_H
 
 #include "xf86xv.h"
+
+struct radeon_pixmap;
+
 #ifdef USE_GLAMOR
 
 #define GLAMOR_FOR_XORG  1
@@ -43,8 +46,6 @@
 	(((usage) & ~RADEON_CREATE_PIXMAP_TILING_FLAGS) == RADEON_CREATE_PIXMAP_DRI2 || \
 	 (usage) == CREATE_PIXMAP_USAGE_SHARED)
 
-struct radeon_pixmap;
-
 #ifndef GLAMOR_NO_DRI3
 #define GLAMOR_NO_DRI3 0
 #define glamor_fd_from_pixmap glamor_dri3_fd_from_pixmap
@@ -74,8 +75,6 @@ XF86VideoAdaptorPtr radeon_glamor_xv_init(ScreenPtr pScreen, int num_adapt);
 
 #else
 
-struct radeon_pixmap;
-
 static inline Bool radeon_glamor_pre_init(ScrnInfoPtr scrn) { return FALSE; }
 static inline Bool radeon_glamor_init(ScreenPtr screen) { return FALSE; }
 static inline Bool radeon_glamor_create_screen_resources(ScreenPtr screen) { return FALSE; }

commit 936582fde0db461c5c3d78ce4f5f4c93a88a489d
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Thu Jul 30 15:56:36 2015 +0900

    Remove unused local variable pRADEONEnt
    
    ../../src/radeon_probe.c: In function 'radeon_get_scrninfo':
    ../../src/radeon_probe.c:157:22: warning: variable 'pRADEONEnt' set but not used [-Wunused-but-set-variable]
             RADEONEntPtr pRADEONEnt;
                          ^
    
    Reviewed-by: Dave Airlie <airlied@redhat.com>

diff --git a/src/radeon_probe.c b/src/radeon_probe.c
index f81ed13..65cf0c9 100644
--- a/src/radeon_probe.c
+++ b/src/radeon_probe.c
@@ -154,7 +154,6 @@ radeon_get_scrninfo(int entity_num, void *pci_dev)
      */
     {
         DevUnion    *pPriv;
-        RADEONEntPtr pRADEONEnt;
 
         xf86SetEntitySharable(entity_num);
 
@@ -166,12 +165,8 @@ radeon_get_scrninfo(int entity_num, void *pci_dev)
 
 	xf86SetEntityInstanceForScreen(pScrn, pEnt->index, xf86GetNumEntityInstances(pEnt->index) - 1);
 
-        if (!pPriv->ptr) {
+        if (!pPriv->ptr)
             pPriv->ptr = xnfcalloc(sizeof(RADEONEntRec), 1);
-            pRADEONEnt = pPriv->ptr;
-        } else {
-            pRADEONEnt = pPriv->ptr;
-        }
     }
 
     free(pEnt);

commit 5510cd6027d2387efdf33575e3bfc424cb11bfd8
Author: Dave Airlie <airlied@redhat.com>
Date:   Mon Jul 27 09:22:57 2015 +1000

    radeon: move radeon_pixmap forward declaration into other block
    
    There is already a radeon_pixmap forward decl here, the #else
    block is missing one.
    
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Dave Airlie <airlied@redhat.com>

diff --git a/src/radeon_glamor.h b/src/radeon_glamor.h
index 1ba7049..c77466e 100644
--- a/src/radeon_glamor.h
+++ b/src/radeon_glamor.h
@@ -61,8 +61,6 @@ struct radeon_pixmap;
 #define GLAMOR_USE_PICTURE_SCREEN 0
 #endif
 
-struct radeon_pixmap;
-
 Bool radeon_glamor_pre_init(ScrnInfoPtr scrn);
 Bool radeon_glamor_init(ScreenPtr screen);
 void radeon_glamor_screen_init(ScreenPtr screen);
@@ -76,6 +74,8 @@ XF86VideoAdaptorPtr radeon_glamor_xv_init(ScreenPtr pScreen, int num_adapt);
 
 #else
 
+struct radeon_pixmap;
+
 static inline Bool radeon_glamor_pre_init(ScrnInfoPtr scrn) { return FALSE; }
 static inline Bool radeon_glamor_init(ScreenPtr screen) { return FALSE; }
 static inline Bool radeon_glamor_create_screen_resources(ScreenPtr screen) { return FALSE; }

commit b32a0a3de84a44b9af4f1ca8be19f10d7fa31b12
Author: Dave Airlie <airlied@redhat.com>
Date:   Wed Jul 22 13:35:07 2015 +1000

    radeon: cleanup the entity rec
    
    Some of these were set, some of them were
    always opposites, so clean things up.
    
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Dave Airlie <airlied@redhat.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 337ee55..a769013 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -1561,7 +1561,7 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr mode_r
 			if (!RADEONZaphodStringMatches(pScrn, s, name))
 				goto out_free_encoders;
 		} else {
-			if (info->IsPrimary && (num != 0))
+			if (!info->IsSecondary && (num != 0))
 				goto out_free_encoders;
 			else if (info->IsSecondary && (num != 1))
 				goto out_free_encoders;
diff --git a/src/radeon.h b/src/radeon.h
index d6f18fa..88df93f 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -499,7 +499,6 @@ typedef struct {
 #endif
 
     Bool              IsSecondary;
-    Bool              IsPrimary;
 
     Bool              r600_shadow_fb;
     void *fb_shadow;
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 2dad0e6..14de0eb 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -1079,7 +1079,6 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
 
     info               = RADEONPTR(pScrn);
     info->IsSecondary  = FALSE;
-    info->IsPrimary = FALSE;
     info->pEnt         = xf86GetEntityInfo(pScrn->entityList[pScrn->numEntities - 1]);
     if (info->pEnt->location.type != BUS_PCI
 #ifdef XSERVER_PLATFORM_BUS
@@ -1097,14 +1096,10 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
         if(xf86IsPrimInitDone(pScrn->entityList[0]))
         {
             info->IsSecondary = TRUE;
-            pRADEONEnt->pSecondaryScrn = pScrn;
         }
         else
         {
-	    info->IsPrimary = TRUE;
             xf86SetPrimInitDone(pScrn->entityList[0]);
-            pRADEONEnt->pPrimaryScrn = pScrn;
-            pRADEONEnt->HasSecondary = FALSE;
         }
     }
 
diff --git a/src/radeon_probe.c b/src/radeon_probe.c
index ad1e96e..f81ed13 100644
--- a/src/radeon_probe.c


Reply to: