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: