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 <[email protected]> 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 <[email protected]> Thu, 20 Aug 2015 14:27:02 +0300 + -- Timo Aaltonen <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> -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 <[email protected]> - ---- 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! ([email protected]) */ ---- 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 <[email protected]> - */ - -+#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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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);

