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

xserver-xorg-video-ati: Changes to 'ubuntu'



 configure.ac                      |   53 +-
 debian/changelog                  |   19 
 debian/patches/series             |    2 
 debian/patches/xmir.patch         |  607 -----------------------
 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 
 36 files changed, 3997 insertions(+), 1441 deletions(-)

New commits:
commit 89467bf2c09de5e193a2d2f361fb09a0013612a0
Author: Timo Aaltonen <tjaalton@debian.org>
Date:   Thu Aug 20 15:59:55 2015 +0300

    release to wily

diff --git a/debian/changelog b/debian/changelog
index d61bfe5..0b976be 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,8 @@
-xserver-xorg-video-ati (1:7.5.0+git20150819-0ubuntu1) UNRELEASED; urgency=medium
+xserver-xorg-video-ati (1:7.5.0+git20150819-0ubuntu1) wily; urgency=medium
 
   * Merge from unreleased Debian git.
 
- -- Timo Aaltonen <tjaalton@debian.org>  Thu, 20 Aug 2015 14:27:02 +0300
+ -- Timo Aaltonen <tjaalton@debian.org>  Thu, 20 Aug 2015 15:59:30 +0300
 
 xserver-xorg-video-ati (1:7.5.0+git20150819-1) UNRELEASED; urgency=medium
 

commit 70d1f01945d9966c955d41e95fb53d6799bc87d7
Author: Timo Aaltonen <tjaalton@debian.org>
Date:   Thu Aug 20 14:31:08 2015 +0300

    import changes from 1:7.5.0-1ubuntu3

diff --git a/debian/changelog b/debian/changelog
index eeff0de..d61bfe5 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -10,6 +10,13 @@ xserver-xorg-video-ati (1:7.5.0+git20150819-1) UNRELEASED; urgency=medium
 
  -- Timo Aaltonen <tjaalton@debian.org>  Thu, 20 Aug 2015 14:25:34 +0300
 
+xserver-xorg-video-ati (1:7.5.0-1ubuntu3) wily; urgency=medium
+
+  * debian/patches/xmir.patch:
+    - Drop XMir patch, we don't need it with new glamor based XMir (LP: #1462994)
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Tue, 09 Jun 2015 15:16:34 +1200
+
 xserver-xorg-video-ati (1:7.5.0-1ubuntu2) vivid; urgency=medium
 
   * Bump build-depends to xorg 1.17.
diff --git a/debian/patches/series b/debian/patches/series
index 51683fa..a82d1b4 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1 @@
-xmir.patch
+#placeholder
diff --git a/debian/patches/xmir.patch b/debian/patches/xmir.patch
deleted file mode 100644
index fe8489a..0000000
--- a/debian/patches/xmir.patch
+++ /dev/null
@@ -1,607 +0,0 @@
-commit 8f7b9d5d20e8fe9dd718d0ab1d82a21dbbcd215d
-Author: Christopher James Halse Rogers <raof@ubuntu.com>
-Date:   Mon Jul 22 17:02:17 2013 +1000
-
-    radeon/kms: Support running nested in a Mir compositor
-    
-    Signed-off-by: Christopher James Halse Rogers <raof@ubuntu.com>
-
---- a/src/drmmode_display.c
-+++ b/src/drmmode_display.c
-@@ -1958,7 +1958,7 @@
- 	if (!miCreateDefColormap(pScreen))
- 	    return FALSE;
- 	/* all radeons support 10 bit CLUTs */
--	if (!xf86HandleColormaps(pScreen, 256, 10,
-+	if (!xorgMir && !xf86HandleColormaps(pScreen, 256, 10,
- 				 drmmode_load_palette, NULL,
- 				 CMAP_PALETTED_TRUECOLOR
- #if 0 /* This option messes up text mode! (eich@suse.de) */
---- a/src/radeon.h
-+++ b/src/radeon.h
-@@ -87,6 +87,18 @@
- #include "picturestr.h"
- #endif
- 
-+#ifdef XMIR
-+#include "xmir.h"
-+#include "xf86Priv.h"
-+#else
-+#define xorgMir 0
-+typedef struct xmir_screen xmir_screen;
-+typedef struct xmir_window xmir_window;
-+void xmir_screen_for_each_damaged_window(void *, void *);
-+int xmir_get_drm_fd(const char *busid);
-+void xmir_screen_init(ScreenPtr screen, void *);
-+#endif
-+
- #include "compat-api.h"
- 
- #include "simple_list.h"
-@@ -480,9 +492,12 @@
-     /* Perform vsync'ed SwapBuffers? */
-     Bool swapBuffersWait;
- 
-+
-     /* cursor size */
-     int cursor_w;
-     int cursor_h;
-+
-+    xmir_screen *xmir;
- } RADEONInfoRec, *RADEONInfoPtr;
- 
- /* radeon_accel.c */
---- a/src/radeon_bo_helper.c
-+++ b/src/radeon_bo_helper.c
-@@ -201,19 +201,25 @@
- }
- 
- Bool radeon_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle,
--				      struct radeon_surface *surface)
-+				      struct radeon_surface *surface,
-+				      uint32_t *tiling_flags, uint32_t *pitch)
- {
-     ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
-     RADEONInfoPtr info = RADEONPTR(pScrn);
-     struct radeon_bo *bo;
-     int ihandle = (int)(long)fd_handle;
--    uint32_t size = ppix->devKind * ppix->drawable.height;
-+    uint32_t size;
- 
--    bo = radeon_gem_bo_open_prime(info->bufmgr, ihandle, size);
-+    bo = radeon_gem_bo_open_prime(info->bufmgr, ihandle, 0);
-     if (!bo)
-         return FALSE;
- 
-     memset(surface, 0, sizeof(struct radeon_surface));
-+    radeon_bo_get_tiling(bo, tiling_flags, pitch);
-+    if (*tiling_flags & RADEON_TILING_MACRO)
-+	bo->size = *pitch * ppix->drawable.height;
-+    else
-+        bo->size = ppix->devKind * ppix->drawable.height;
- 
-     if (info->ChipFamily >= CHIP_FAMILY_R600 && info->surf_man) {
- 
-@@ -229,7 +235,14 @@
- 	/* we are requiring a recent enough libdrm version */
- 	surface->flags |= RADEON_SURF_HAS_TILE_MODE_INDEX;
- 	surface->flags |= RADEON_SURF_SET(RADEON_SURF_TYPE_2D, TYPE);
--	surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_LINEAR, MODE);
-+
-+	if (*tiling_flags & RADEON_TILING_MACRO)
-+	    surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_2D, MODE);
-+	else if (*tiling_flags & RADEON_TILING_MICRO)
-+	    surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_1D, MODE);
-+	else
-+	    surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_LINEAR, MODE);
-+
- 	if (radeon_surface_best(info->surf_man, surface)) {
- 	    return FALSE;
- 	}
-@@ -238,8 +251,11 @@
- 	}
- 	/* we have to post hack the surface to reflect the actual size
- 	   of the shared pixmap */
--	surface->level[0].pitch_bytes = ppix->devKind;
--	surface->level[0].nblk_x = ppix->devKind / surface->bpe;
-+	if (*tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))
-+		surface->level[0].pitch_bytes = *pitch;
-+	else
-+		surface->level[0].pitch_bytes = *pitch = ppix->devKind;
-+	surface->level[0].nblk_x = surface->level[0].pitch_bytes / surface->bpe;
-     }
-     radeon_set_pixmap_bo(ppix, bo);
- 
---- a/src/radeon_bo_helper.h
-+++ b/src/radeon_bo_helper.h
-@@ -33,6 +33,7 @@
- 
- extern Bool
- radeon_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle,
--				 struct radeon_surface *surface);
-+				 struct radeon_surface *surface,
-+				 uint32_t *tiling_flags, uint32_t *pitch);
- 
- #endif /* RADEON_BO_HELPER_H */
---- a/src/radeon_dri2.c
-+++ b/src/radeon_dri2.c
-@@ -1539,6 +1539,18 @@
- 
- #endif /* USE_DRI2_SCHEDULING */
- 
-+#if DRI2INFOREC_VERSION >= 8 && defined(XMIR)
-+static int radeon_dri2_auth_magic(ScreenPtr pScreen, uint32_t magic)
-+{
-+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
-+    RADEONInfoPtr info = RADEONPTR(pScrn);
-+
-+    if (xorgMir)
-+	return xmir_auth_drm_magic(info->xmir, magic);
-+    else
-+	return drmAuthMagic(info->dri2.drm_fd, magic);
-+}
-+#endif
- 
- Bool
- radeon_dri2_screen_init(ScreenPtr pScreen)
-@@ -1548,7 +1560,7 @@
-     DRI2InfoRec dri2_info = { 0 };
- #ifdef USE_DRI2_SCHEDULING
-     const char *driverNames[2];
--    Bool scheduling_works = TRUE;
-+    Bool scheduling_works = !xorgMir;
- #endif
- 
-     if (!info->dri2.available)
-@@ -1634,6 +1646,11 @@
-     }
- #endif
- 
-+#if DRI2INFOREC_VERSION >= 9 && defined(XMIR)
-+    dri2_info.version = 8;
-+    dri2_info.AuthMagic2 = radeon_dri2_auth_magic;
-+#endif
-+
- #if DRI2INFOREC_VERSION >= 9
-     dri2_info.version = 9;
-     dri2_info.CreateBuffer2 = radeon_dri2_create_buffer2;
---- a/src/radeon_exa.c
-+++ b/src/radeon_exa.c
-@@ -325,12 +325,12 @@
- Bool RADEONEXASetSharedPixmapBacking(PixmapPtr ppix, void *fd_handle)
- {
-     struct radeon_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(ppix);
-+    uint32_t tiling_flags, pitch;
- 
--    if (!radeon_set_shared_pixmap_backing(ppix, fd_handle, &driver_priv->surface))
-+    if (!radeon_set_shared_pixmap_backing(ppix, fd_handle, &driver_priv->surface, &tiling_flags, &pitch))
- 	return FALSE;
- 
-     driver_priv->shared = TRUE;
--    driver_priv->tiling_flags = 0;
-     return TRUE;
- }
- #endif
---- a/src/radeon_glamor.c
-+++ b/src/radeon_glamor.c
-@@ -297,14 +297,15 @@
- 	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- 	struct radeon_surface surface;
- 	struct radeon_pixmap *priv;
-+	uint32_t tiling_flags, pitch;
- 
--	if (!radeon_set_shared_pixmap_backing(pixmap, handle, &surface))
-+	if (!radeon_set_shared_pixmap_backing(pixmap, handle, &surface, &tiling_flags, &pitch))
- 		return FALSE;
- 
- 	priv = radeon_get_pixmap_private(pixmap);
--	priv->stride = pixmap->devKind;
-+	priv->stride = pitch;
- 	priv->surface = surface;
--	priv->tiling_flags = 0;
-+	priv->tiling_flags = tiling_flags;
- 
- 	if (!radeon_glamor_create_textured_pixmap(pixmap)) {
- 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
---- a/src/radeon_kms.c
-+++ b/src/radeon_kms.c
-@@ -230,10 +230,15 @@
- 	return FALSE;
-     pScreen->CreateScreenResources = RADEONCreateScreenResources_KMS;
- 
--    if (!drmmode_set_desired_modes(pScrn, &info->drmmode))
-+    if (xorgMir) {
-+	if (!xf86SetDesiredModes(pScrn))
-+	    return FALSE;
-+    }
-+    else if (!drmmode_set_desired_modes(pScrn, &info->drmmode))
- 	return FALSE;
- 
--    drmmode_uevent_init(pScrn, &info->drmmode);
-+    if (!xorgMir)
-+	drmmode_uevent_init(pScrn, &info->drmmode);
- 
-     if (info->r600_shadow_fb) {
- 	pixmap = pScreen->GetScreenPixmap(pScreen);
-@@ -295,6 +300,66 @@
- }
- #endif
- 
-+#ifdef XMIR
-+static void
-+radeon_xmir_copy_to_mir(xmir_window *xmir_win, RegionPtr region)
-+{
-+    WindowPtr win = xmir_window_to_windowptr(xmir_win);
-+    PixmapPtr src = (*win->drawable.pScreen->GetWindowPixmap)(win);
-+    ScreenPtr pScreen = src->drawable.pScreen;
-+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
-+    RADEONInfoPtr info = RADEONPTR(pScrn);
-+    BoxPtr output_box = xmir_window_get_drawable_region(xmir_win);
-+    BoxPtr damage_box = RegionExtents(region);
-+    if (info->accel_state->exa) {
-+	PixmapPtr dst;
-+	int ret;
-+        int fd_copy = dup(xmir_window_get_fd(xmir_win));
-+	/* TODO: Create this scratch pixmap once to avoid allocation overhead */
-+	dst = pScreen->CreatePixmap(pScreen, 0, 0, pScrn->depth, 0);
-+	if (dst == NullPixmap)
-+            return;
-+
-+	if (!pScreen->ModifyPixmapHeader(dst,
-+					 output_box->x2 - output_box->x1,
-+					 output_box->y2 - output_box->y1,
-+					 pScrn->depth, pScrn->bitsPerPixel,
-+					 xmir_window_get_stride(xmir_win), NULL))
-+		goto cleanup_dst;
-+
-+
-+        info->accel_state->exa->SetSharedPixmapBacking(dst, (void*)(size_t)fd_copy);
-+
-+	ret = info->accel_state->exa->PrepareCopy (src, dst,
-+						   -1, -1, GXcopy, FB_ALLONES);
-+	if (!ret)
-+	    goto cleanup_dst;
-+	info->accel_state->exa->Copy (dst,
-+				      damage_box->x1, damage_box->y1,
-+				      damage_box->x1 - output_box->x1,
-+				      damage_box->y1 - output_box->y1,
-+				      output_box->x2 - output_box->x1,
-+                                      output_box->y2 - output_box->y1);
-+	info->accel_state->exa->DoneCopy (dst);
-+
-+	radeon_cs_flush_indirect(pScrn);
-+
-+	xmir_submit_rendering_for_window(xmir_win, region);
-+cleanup_dst:
-+	pScreen->DestroyPixmap(dst);
-+    } else if (0) {
-+	/* TODO: glamor accel */
-+    } else {
-+    /* Software copy; let's just give up */
-+    }
-+}
-+
-+static xmir_driver xmir_radeon_driver = {
-+    XMIR_DRIVER_VERSION,
-+    radeon_xmir_copy_to_mir
-+};
-+#endif
-+
- static void RADEONBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL)
- {
-     SCREEN_PTR(arg);
-@@ -312,6 +377,10 @@
- #ifdef RADEON_PIXMAP_SHARING
-     radeon_dirty_update(pScreen);
- #endif
-+#ifdef XMIR
-+    if(info->xmir)
-+	xmir_screen_for_each_damaged_window(info->xmir, radeon_xmir_copy_to_mir);
-+#endif
- }
- 
- static void
-@@ -608,6 +677,17 @@
- 		      dev->domain, dev->bus, dev->dev, dev->func);
- #endif
- 
-+    if (xorgMir) {
-+        fd = xmir_get_drm_fd(busid);
-+
-+        if (fd == -1)
-+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-+                       "[drm] Failed to retrieve DRM device %s from Mir\n",
-+                       busid);
-+        free(busid);
-+        return fd;
-+    }
-+
-     fd = drmOpen(NULL, busid);
-     if (fd == -1)
- 	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-@@ -638,6 +718,9 @@
-     if (info->dri2.drm_fd == -1)
- 	return FALSE;
- 
-+    if (xorgMir)
-+        return TRUE;
-+
-     /* Check that what we opened was a master or a master-capable FD,
-      * by setting the version of the interface we'll use to talk to it.
-      * (see DRIOpenDRMMaster() in DRI1)
-@@ -854,6 +937,14 @@
-     if (!RADEONPreInitChipType_KMS(pScrn))
-         goto fail;
- 
-+#ifdef XMIR
-+    if (xorgMir) {
-+	info->xmir = xmir_screen_create(pScrn);
-+	if (info->xmir == NULL)
-+	    goto fail;
-+    }
-+#endif
-+
-     if (radeon_open_drm_master(pScrn) == FALSE) {
- 	xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Kernel modesetting setup failed\n");
- 	goto fail;
-@@ -928,10 +1019,14 @@
-     }
- 
-     info->swapBuffersWait = xf86ReturnOptValBool(info->Options,
--						 OPTION_SWAPBUFFERS_WAIT, TRUE);
-+						 OPTION_SWAPBUFFERS_WAIT, !xorgMir);
-     xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- 	       "SwapBuffers wait for vsync: %sabled\n", info->swapBuffersWait ? "en" : "dis");
- 
-+
-+#ifdef XMIR
-+    if(!info->xmir) {
-+#endif
-     if (drmmode_pre_init(pScrn, &info->drmmode, pScrn->bitsPerPixel / 8) == FALSE) {
- 	xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Kernel modesetting setup failed\n");
- 	goto fail;
-@@ -941,7 +1036,10 @@
-         pRADEONEnt->HasCRTC2 = FALSE;
-     else
-         pRADEONEnt->HasCRTC2 = TRUE;
--
-+#ifdef XMIR
-+    } else if (!xmir_screen_pre_init(pScrn, info->xmir, &xmir_radeon_driver))
-+	goto fail;
-+#endif
- 
-     /* fix up cloning on rn50 cards
-      * since they only have one crtc sometimes the xserver doesn't assign
-@@ -1121,7 +1219,7 @@
- #ifdef XF86_PDEV_SERVER_FD
-     RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
- #endif
--    int err;
-+    int err = 0;
- 
- #ifdef XF86_PDEV_SERVER_FD
-     if (pRADEONEnt->platform_dev &&
-@@ -1129,7 +1227,8 @@
-         return TRUE;
- #endif
- 
--    err = drmSetMaster(info->dri2.drm_fd);
-+    if (!xorgMir)
-+        err = drmSetMaster(info->dri2.drm_fd);
-     if (err)
-         ErrorF("Unable to retrieve master\n");
- 
-@@ -1147,6 +1246,11 @@
-         return;
- #endif
- 
-+#ifdef XMIR
-+    if (info->xmir) {
-+/*	xmir_screen_close(pScreen, info->xmir);*/
-+    } else
-+#endif
-     drmDropMaster(info->dri2.drm_fd);
- }
- 
-@@ -1204,6 +1308,21 @@
-     RADEONFreeRec(pScrn);
- }
- 
-+static void
-+RADEONSetScreenPixmap_KMS(PixmapPtr pixmap)
-+{
-+    ScrnInfoPtr   pScrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
-+    RADEONInfoPtr info  = RADEONPTR(pScrn);
-+
-+    if (info->accel_state->exa)
-+	exaMoveInPixmap(pixmap);
-+
-+    info->front_bo = radeon_get_pixmap_bo(pixmap);
-+    memmove(&info->front_surface, radeon_get_pixmap_surface(pixmap), sizeof info->front_surface);
-+
-+    pixmap->drawable.pScreen->devPrivate = pixmap;
-+}
-+
- Bool RADEONScreenInit_KMS(SCREEN_INIT_ARGS_DECL)
- {
-     ScrnInfoPtr    pScrn = xf86ScreenToScrn(pScreen);
-@@ -1236,7 +1355,8 @@
- 		   "failed to initialise GEM buffer manager");
- 	return FALSE;
-     }
--    drmmode_set_bufmgr(pScrn, &info->drmmode, info->bufmgr);
-+    if (!info->xmir)
-+	drmmode_set_bufmgr(pScrn, &info->drmmode, info->bufmgr);
- 
-     if (!info->csm)
-         info->csm = radeon_cs_manager_gem_ctor(info->dri2.drm_fd);
-@@ -1360,7 +1480,10 @@
-     /* Cursor setup */
-     miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
- 
--    if (!xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE)) {
-+    if (info->xmir)
-+        xmir_screen_init(pScreen, info->xmir);
-+
-+    if (!info->xmir && !xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE)) {
- 	if (RADEONCursorInit_KMS(pScreen)) {
- 	}
-     }
-@@ -1402,6 +1525,8 @@
-     info->CreateScreenResources = pScreen->CreateScreenResources;
-     pScreen->CreateScreenResources = RADEONCreateScreenResources_KMS;
- 
-+    pScreen->SetScreenPixmap = RADEONSetScreenPixmap_KMS;
-+
- #ifdef RADEON_PIXMAP_SHARING
-     pScreen->StartPixmapTracking = PixmapStartDirtyTracking;
-     pScreen->StopPixmapTracking = PixmapStopDirtyTracking;
-@@ -1447,7 +1572,9 @@
- 
-     pScrn->vtSema = TRUE;
- 
--    if (!drmmode_set_desired_modes(pScrn, &info->drmmode))
-+    if (xorgMir)
-+        return xf86SetDesiredModes(pScrn);
-+    else if (!drmmode_set_desired_modes(pScrn, &info->drmmode))
- 	return FALSE;
- 
-     return TRUE;
-@@ -1588,6 +1715,7 @@
- 		}
- 		info->front_surface = surface;
- 	}
-+    if(!xorgMir)
-     {
- 	int cursor_size;
- 	int c;
---- a/src/radeon_probe.c
-+++ b/src/radeon_probe.c
-@@ -40,6 +40,7 @@
-  * KMS support - Dave Airlie <airlied@redhat.com>
-  */
- 
-+#include "radeon.h"
- #include "radeon_probe.h"
- #include "radeon_version.h"
- #include "atipciids.h"
-@@ -58,6 +59,11 @@
- #include <xf86platformBus.h>
- #endif
- 
-+#ifdef XMIR
-+#include <xf86Priv.h>
-+#include <xmir.h>
-+#endif
-+
- #include "radeon_chipset_gen.h"
- 
- #include "radeon_pci_chipset_gen.h"
-@@ -115,6 +121,33 @@
- }
- 
- static Bool
-+radeon_check_mir_support(ScrnInfoPtr pScrn, struct pci_device *pci_dev)
-+{
-+    char *busIdString;
-+    int fd;
-+
-+    if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) {
-+        xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
-+           "[XMir] No DRICreatePCIBusID symbol, unable to find Radeon device.\n");
-+        return FALSE;
-+    }
-+
-+    busIdString = DRICreatePCIBusID(pci_dev);
-+    fd = xmir_get_drm_fd(busIdString);
-+    free(busIdString);
-+
-+    if (fd < 0) {
-+        xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
-+           "[XMir] Radeon device not managed by Mir.\n");
-+        return FALSE;
-+    }
-+
-+    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
-+           "[XMir] Using Radeon device from Mir.\n");
-+    return TRUE;
-+}
-+
-+static Bool
- radeon_get_scrninfo(int entity_num, void *pci_dev)
- {
-     ScrnInfoPtr   pScrn = NULL;
-@@ -128,7 +161,13 @@
-         return FALSE;
- 
-     if (pci_dev) {
-+#ifdef XMIR
-+        if (xorgMir && !radeon_check_mir_support(pScrn, pci_dev))
-+            return FALSE;
-+        else if (!radeon_kernel_mode_enabled(pScrn, pci_dev)) {
-+#else
-       if (!radeon_kernel_mode_enabled(pScrn, pci_dev)) {
-+#endif
- 	return FALSE;
-       }
-     }
-@@ -201,6 +240,12 @@
- 	case GET_REQUIRED_HW_INTERFACES:
- 	    flag = (CARD32 *)data;
- 	    (*flag) = 0;
-+
-+#ifdef XMIR
-+        if (xorgMir)
-+            (*flag) |= HW_SKIP_CONSOLE;
-+#endif
-+
- 	    return TRUE;
- #if XORG_VERSION_CURRENT > XORG_VERSION_NUMERIC(1,15,99,0,0)
- 	case SUPPORTS_SERVER_FDS:
-@@ -225,14 +270,20 @@
-     if (!dev->pdev)
- 	return FALSE;
- 
--    if (flags & PLATFORM_PROBE_GPU_SCREEN)
--	scr_flags = XF86_ALLOCATE_GPU_SCREEN;
-+    if (flags & PLATFORM_PROBE_GPU_SCREEN) {
-+        scr_flags = XF86_ALLOCATE_GPU_SCREEN;
-+    }
-+
-+
- 
-     pScrn = xf86AllocateScreen(pDriver, scr_flags);
-     if (xf86IsEntitySharable(entity_num))
- 	xf86SetEntityShared(entity_num);
-     xf86AddEntityToScreen(pScrn, entity_num);
- 
-+    if (xorgMir && !radeon_check_mir_support(pScrn, dev->pdev))
-+        return FALSE;
-+
-     if (!radeon_kernel_mode_enabled(pScrn, dev->pdev))
- 	return FALSE;
- 
---- a/src/radeon_video.c
-+++ b/src/radeon_video.c
-@@ -70,7 +70,10 @@
- Bool radeon_crtc_is_enabled(xf86CrtcPtr crtc)
- {
-     drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
--    return drmmode_crtc->dpms_mode == DPMSModeOn;
-+    if (drmmode_crtc != NULL)
-+	return drmmode_crtc->dpms_mode == DPMSModeOn;
-+    else /* We're not in control; bail */
-+	return FALSE;
- }
- 
- uint32_t radeon_get_interpolated_vblanks(xf86CrtcPtr crtc)
-@@ -92,6 +95,9 @@
-     if (!pScrn->vtSema)
- 	return NULL;
- 
-+    if (xorgMir)
-+	return NULL;
-+
-     box.x1 = x1;
-     box.x2 = x2;
-     box.y1 = y1;

commit 9e8abe837a30ce8d8703f18678f51e7510a2bd44
Author: Timo Aaltonen <tjaalton@debian.org>
Date:   Thu Aug 20 14:30:04 2015 +0300

    update the changelog

diff --git a/debian/changelog b/debian/changelog
index 46249f8..eeff0de 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+xserver-xorg-video-ati (1:7.5.0+git20150819-0ubuntu1) UNRELEASED; urgency=medium
+
+  * Merge from unreleased Debian git.
+
+ -- Timo Aaltonen <tjaalton@debian.org>  Thu, 20 Aug 2015 14:27:02 +0300
+
 xserver-xorg-video-ati (1:7.5.0+git20150819-1) UNRELEASED; urgency=medium
 
   * New upstream snapshot.

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);


Reply to: