Submitted By: Douglas R. Reno Date: 2021-08-11 Initial Package Version: 19.1.0 Upstream Status: Applied Origin: Upstream commits after 19.1.0 release. Description: Fixes several performance regressions on some ATI graphics cards. Also rolls the fix for compiling with GCC-10 into the source tree, and adapts the driver to build with the next minor version of Xorg-Server (anything that uses master/slave terms will fail to build). On a SysV machine with an ATI card, this nets a 4x speed improvement, and the capability of running GNOME and KDE Plasma without problems. diff -Naurp xf86-video-ati-19.1.0.orig/man/radeon.man xf86-video-ati-19.1.0/man/radeon.man --- xf86-video-ati-19.1.0.orig/man/radeon.man 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/man/radeon.man 2021-07-29 16:27:10.685285445 -0500 @@ -290,7 +290,7 @@ on. If this option is set, the default v accordingly. If this option isn't set, the default value of the property is .B auto, which means that TearFree is on for rotated outputs, outputs with RandR -transforms applied and for RandR 1.4 slave outputs, otherwise off. +transforms applied and for RandR 1.4 secondary outputs, otherwise off. .TP .BI "Option \*qAccelMethod\*q \*q" "string" \*q Chooses between available acceleration architectures. Valid values are diff -Naurp xf86-video-ati-19.1.0.orig/src/compat-api.h xf86-video-ati-19.1.0/src/compat-api.h --- xf86-video-ati-19.1.0.orig/src/compat-api.h 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/src/compat-api.h 2021-07-29 16:27:49.721971221 -0500 @@ -34,4 +34,10 @@ #define BLOCKHANDLER_ARGS pScreen, pTimeout, pReadmask #endif +#if ABI_VIDEODRV_VERSION < SET_ABI_VERSION(25, 2) +#define current_primary current_master +#define primary_pixmap master_pixmap +#define secondary_dst slave_dst +#endif + #endif diff -Naurp xf86-video-ati-19.1.0.orig/src/drmmode_display.c xf86-video-ati-19.1.0/src/drmmode_display.c --- xf86-video-ati-19.1.0.orig/src/drmmode_display.c 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/src/drmmode_display.c 2021-07-29 16:40:03.226063398 -0500 @@ -45,7 +45,9 @@ #include "radeon_glamor.h" #include "radeon_reg.h" +#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,19,99,1,0) #include +#endif #include "drmmode_display.h" @@ -720,7 +722,7 @@ drmmode_crtc_prime_scanout_update(xf86Cr xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list, ent) { if (radeon_dirty_src_equals(dirty, drmmode_crtc->prime_scanout_pixmap)) { - dirty->slave_dst = + dirty->secondary_dst = drmmode_crtc->scanout[scanout_id].pixmap; break; } @@ -1275,7 +1277,7 @@ drmmode_show_cursor (xf86CrtcPtr crtc) arg.hot_y = yhot; ret = drmIoctl(pRADEONEnt->fd, DRM_IOCTL_MODE_CURSOR2, &arg); - if (ret == -EINVAL) + if (ret == -1 && errno == EINVAL) use_set_cursor2 = FALSE; else return; @@ -1356,7 +1358,7 @@ drmmode_set_scanout_pixmap(xf86CrtcPtr c xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list, ent) { if (radeon_dirty_src_equals(dirty, drmmode_crtc->prime_scanout_pixmap)) { - PixmapStopDirtyTracking(dirty->src, dirty->slave_dst); + PixmapStopDirtyTracking(dirty->src, dirty->secondary_dst); break; } } diff -Naurp xf86-video-ati-19.1.0.orig/src/drmmode_display.h xf86-video-ati-19.1.0/src/drmmode_display.h --- xf86-video-ati-19.1.0.orig/src/drmmode_display.h 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/src/drmmode_display.h 2021-07-29 16:24:44.570461234 -0500 @@ -262,7 +262,7 @@ Bool drmmode_wait_vblank(xf86CrtcPtr crt uint64_t *ust, uint32_t *result_seq); -miPointerSpriteFuncRec drmmode_sprite_funcs; +extern miPointerSpriteFuncRec drmmode_sprite_funcs; #endif diff -Naurp xf86-video-ati-19.1.0.orig/src/evergreen_state.h xf86-video-ati-19.1.0/src/evergreen_state.h --- xf86-video-ati-19.1.0.orig/src/evergreen_state.h 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/src/evergreen_state.h 2021-07-29 16:29:19.799246069 -0500 @@ -350,7 +350,7 @@ extern void *RADEONEXACreatePixmap2(Scre int *new_pitch); extern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv); extern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix); -extern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr slave, void **handle_p); +extern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr secondary, void **handle_p); extern Bool RADEONEXASetSharedPixmapBacking(PixmapPtr ppix, void *handle); #endif diff -Naurp xf86-video-ati-19.1.0.orig/src/r600_state.h xf86-video-ati-19.1.0/src/r600_state.h --- xf86-video-ati-19.1.0.orig/src/r600_state.h 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/src/r600_state.h 2021-07-29 16:29:36.132114565 -0500 @@ -321,6 +321,6 @@ extern void *RADEONEXACreatePixmap2(Scre int *new_pitch); extern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv); extern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix); -extern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr slave, void **handle_p); +extern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr secondary, void **handle_p); extern Bool RADEONEXASetSharedPixmapBacking(PixmapPtr ppix, void *handle); #endif diff -Naurp xf86-video-ati-19.1.0.orig/src/radeon_dri2.c xf86-video-ati-19.1.0/src/radeon_dri2.c --- xf86-video-ati-19.1.0.orig/src/radeon_dri2.c 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/src/radeon_dri2.c 2021-07-29 16:45:41.467337925 -0500 @@ -729,7 +729,9 @@ radeon_dri2_exchange_buffers(DrawablePtr struct dri2_buffer_priv *front_priv = front->driverPrivate; struct dri2_buffer_priv *back_priv = back->driverPrivate; ScreenPtr screen = draw->pScreen; +#ifdef USE_GLAMOR RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(screen)); +#endif RegionRec region; int tmp; diff -Naurp xf86-video-ati-19.1.0.orig/src/radeon_exa.c xf86-video-ati-19.1.0/src/radeon_exa.c --- xf86-video-ati-19.1.0.orig/src/radeon_exa.c 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/src/radeon_exa.c 2021-07-29 16:30:48.280533631 -0500 @@ -282,7 +282,7 @@ void RADEONEXADestroyPixmap(ScreenPtr pS free(driverPriv); } -Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr slave, void **fd_handle) +Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr secondary, void **fd_handle) { struct radeon_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(ppix); diff -Naurp xf86-video-ati-19.1.0.orig/src/radeon_glamor.c xf86-video-ati-19.1.0/src/radeon_glamor.c --- xf86-video-ati-19.1.0.orig/src/radeon_glamor.c 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/src/radeon_glamor.c 2021-07-29 16:31:05.112398098 -0500 @@ -366,7 +366,7 @@ radeon_glamor_set_pixmap_bo(DrawablePtr static Bool -radeon_glamor_share_pixmap_backing(PixmapPtr pixmap, ScreenPtr slave, +radeon_glamor_share_pixmap_backing(PixmapPtr pixmap, ScreenPtr secondary, void **handle_p) { ScreenPtr screen = pixmap->drawable.pScreen; diff -Naurp xf86-video-ati-19.1.0.orig/src/radeon.h xf86-video-ati-19.1.0/src/radeon.h --- xf86-video-ati-19.1.0.orig/src/radeon.h 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/src/radeon.h 2021-07-29 16:30:34.626643574 -0500 @@ -182,18 +182,18 @@ typedef enum { static inline ScreenPtr -radeon_master_screen(ScreenPtr screen) +radeon_primary_screen(ScreenPtr screen) { - if (screen->current_master) - return screen->current_master; + if (screen->current_primary) + return screen->current_primary; return screen; } static inline ScreenPtr -radeon_dirty_master(PixmapDirtyUpdatePtr dirty) +radeon_dirty_primary(PixmapDirtyUpdatePtr dirty) { - return radeon_master_screen(dirty->slave_dst->drawable.pScreen); + return radeon_primary_screen(dirty->secondary_dst->drawable.pScreen); } static inline DrawablePtr @@ -790,19 +790,18 @@ static inline Bool radeon_set_pixmap_bo( static inline struct radeon_buffer *radeon_get_pixmap_bo(PixmapPtr pPix) { -#ifdef USE_GLAMOR RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen)); - +#ifdef USE_GLAMOR if (info->use_glamor) { struct radeon_pixmap *priv; priv = radeon_get_pixmap_private(pPix); return priv ? priv->bo : NULL; } else #endif - { - struct radeon_exa_pixmap_priv *driver_priv; - driver_priv = exaGetPixmapDriverPrivate(pPix); - return driver_priv ? driver_priv->bo : NULL; + if (info->accelOn) { + struct radeon_exa_pixmap_priv *driver_priv; + driver_priv = exaGetPixmapDriverPrivate(pPix); + return driver_priv ? driver_priv->bo : NULL; } return NULL; @@ -896,7 +895,7 @@ radeon_pixmap_get_fb(PixmapPtr pix) handle); } - return *fb_ptr; + return fb_ptr ? *fb_ptr : NULL; } diff -Naurp xf86-video-ati-19.1.0.orig/src/radeon_kms.c xf86-video-ati-19.1.0/src/radeon_kms.c --- xf86-video-ati-19.1.0.orig/src/radeon_kms.c 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/src/radeon_kms.c 2021-07-29 16:37:14.531422523 -0500 @@ -559,8 +559,8 @@ dirty_region(PixmapDirtyUpdatePtr dirty) if (dirty->rotation != RR_Rotate_0) { dstregion = transform_region(damageregion, &dirty->f_inverse, - dirty->slave_dst->drawable.width, - dirty->slave_dst->drawable.height); + dirty->secondary_dst->drawable.width, + dirty->secondary_dst->drawable.height); } else #endif { @@ -568,7 +568,7 @@ dirty_region(PixmapDirtyUpdatePtr dirty) dstregion = RegionDuplicate(damageregion); RegionTranslate(dstregion, -dirty->x, -dirty->y); - PixmapRegionInit(&pixregion, dirty->slave_dst); + PixmapRegionInit(&pixregion, dirty->secondary_dst); RegionIntersect(dstregion, dstregion, &pixregion); RegionUninit(&pixregion); } @@ -585,8 +585,8 @@ redisplay_dirty(PixmapDirtyUpdatePtr dir if (RegionNil(region)) goto out; - if (dirty->slave_dst->master_pixmap) - DamageRegionAppend(&dirty->slave_dst->drawable, region); + if (dirty->secondary_dst->primary_pixmap) + DamageRegionAppend(&dirty->secondary_dst->drawable, region); #ifdef HAS_DIRTYTRACKING_ROTATION PixmapSyncDirtyHelper(dirty); @@ -595,8 +595,8 @@ redisplay_dirty(PixmapDirtyUpdatePtr dir #endif radeon_cs_flush_indirect(src_scrn); - if (dirty->slave_dst->master_pixmap) - DamageRegionProcessPending(&dirty->slave_dst->drawable); + if (dirty->secondary_dst->primary_pixmap) + DamageRegionProcessPending(&dirty->secondary_dst->drawable); out: DamageEmpty(dirty->damage); @@ -613,12 +613,12 @@ radeon_prime_scanout_update_abort(xf86Cr void radeon_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) { - ScreenPtr master_screen = radeon_dirty_master(dirty); + ScreenPtr primary_screen = radeon_dirty_primary(dirty); PixmapDirtyUpdatePtr ent; RegionPtr region; - xorg_list_for_each_entry(ent, &master_screen->pixmap_dirty_list, ent) { - if (!radeon_dirty_src_equals(dirty, ent->slave_dst)) + xorg_list_for_each_entry(ent, &primary_screen->pixmap_dirty_list, ent) { + if (!radeon_dirty_src_equals(dirty, ent->secondary_dst)) continue; region = dirty_region(ent); @@ -631,45 +631,45 @@ radeon_sync_shared_pixmap(PixmapDirtyUpd #if HAS_SYNC_SHARED_PIXMAP static Bool -master_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) +primary_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) { - ScreenPtr master_screen = radeon_dirty_master(dirty); + ScreenPtr primary_screen = radeon_dirty_primary(dirty); - return !!master_screen->SyncSharedPixmap; + return !!primary_screen->SyncSharedPixmap; } static Bool -slave_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) +secondary_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) { - ScreenPtr slave_screen = dirty->slave_dst->drawable.pScreen; + ScreenPtr secondary_screen = dirty->secondary_dst->drawable.pScreen; - return !!slave_screen->SyncSharedPixmap; + return !!secondary_screen->SyncSharedPixmap; } static void call_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) { - ScreenPtr master_screen = radeon_dirty_master(dirty); + ScreenPtr primary_screen = radeon_dirty_primary(dirty); - master_screen->SyncSharedPixmap(dirty); + primary_screen->SyncSharedPixmap(dirty); } #else /* !HAS_SYNC_SHARED_PIXMAP */ static Bool -master_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) +primary_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) { - ScrnInfoPtr master_scrn = xf86ScreenToScrn(radeon_dirty_master(dirty)); + ScrnInfoPtr primary_scrn = xf86ScreenToScrn(radeon_dirty_primary(dirty)); - return master_scrn->driverName == scrn->driverName; + return primary_scrn->driverName == scrn->driverName; } static Bool -slave_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) +secondary_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) { - ScrnInfoPtr slave_scrn = xf86ScreenToScrn(dirty->slave_dst->drawable.pScreen); + ScrnInfoPtr secondary_scrn = xf86ScreenToScrn(dirty->secondary_dst->drawable.pScreen); - return slave_scrn->driverName == scrn->driverName; + return secondary_scrn->driverName == scrn->driverName; } static void @@ -684,12 +684,12 @@ call_sync_shared_pixmap(PixmapDirtyUpdat static xf86CrtcPtr radeon_prime_dirty_to_crtc(PixmapDirtyUpdatePtr dirty) { - ScreenPtr screen = dirty->slave_dst->drawable.pScreen; + ScreenPtr screen = dirty->secondary_dst->drawable.pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); int c; - /* Find the CRTC which is scanning out from this slave pixmap */ + /* Find the CRTC which is scanning out from this secondary pixmap */ for (c = 0; c < xf86_config->num_crtc; c++) { xf86CrtcPtr xf86_crtc = xf86_config->crtc[c]; drmmode_crtc_private_ptr drmmode_crtc = xf86_crtc->driver_private; @@ -714,7 +714,7 @@ radeon_prime_scanout_do_update(xf86CrtcP if (radeon_dirty_src_equals(dirty, drmmode_crtc->prime_scanout_pixmap)) { RegionPtr region; - if (master_has_sync_shared_pixmap(scrn, dirty)) + if (primary_has_sync_shared_pixmap(scrn, dirty)) call_sync_shared_pixmap(dirty); region = dirty_region(dirty); @@ -727,7 +727,7 @@ radeon_prime_scanout_do_update(xf86CrtcP radeon_cs_flush_indirect(scrn); RegionCopy(&drmmode_crtc->scanout_last_region, region); RegionTranslate(region, -crtc->x, -crtc->y); - dirty->slave_dst = drmmode_crtc->scanout[scanout_id].pixmap; + dirty->secondary_dst = drmmode_crtc->scanout[scanout_id].pixmap; } redisplay_dirty(dirty, region); @@ -754,7 +754,7 @@ radeon_prime_scanout_update_handler(xf86 static void radeon_prime_scanout_update(PixmapDirtyUpdatePtr dirty) { - ScreenPtr screen = dirty->slave_dst->drawable.pScreen; + ScreenPtr screen = dirty->secondary_dst->drawable.pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn); xf86CrtcPtr xf86_crtc = radeon_prime_dirty_to_crtc(dirty); @@ -818,7 +818,7 @@ radeon_prime_scanout_update(PixmapDirtyU static void radeon_prime_scanout_flip(PixmapDirtyUpdatePtr ent) { - ScreenPtr screen = ent->slave_dst->drawable.pScreen; + ScreenPtr screen = ent->secondary_dst->drawable.pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn); xf86CrtcPtr crtc = radeon_prime_dirty_to_crtc(ent); @@ -893,11 +893,11 @@ radeon_dirty_update(ScrnInfoPtr scrn) if (screen->isGPU) { PixmapDirtyUpdatePtr region_ent = ent; - if (master_has_sync_shared_pixmap(scrn, ent)) { - ScreenPtr master_screen = radeon_dirty_master(ent); + if (primary_has_sync_shared_pixmap(scrn, ent)) { + ScreenPtr primary_screen = radeon_dirty_primary(ent); - xorg_list_for_each_entry(region_ent, &master_screen->pixmap_dirty_list, ent) { - if (radeon_dirty_src_equals(ent, region_ent->slave_dst)) + xorg_list_for_each_entry(region_ent, &primary_screen->pixmap_dirty_list, ent) { + if (radeon_dirty_src_equals(ent, region_ent->secondary_dst)) break; } } @@ -921,7 +921,7 @@ radeon_dirty_update(ScrnInfoPtr scrn) RegionDestroy(region); } else { - if (slave_has_sync_shared_pixmap(scrn, ent)) + if (secondary_has_sync_shared_pixmap(scrn, ent)) continue; region = dirty_region(ent); @@ -1216,7 +1216,7 @@ static void RADEONBlockHandler_KMS(BLOCK (*pScreen->BlockHandler) (BLOCKHANDLER_ARGS); pScreen->BlockHandler = RADEONBlockHandler_KMS; - if (!xf86ScreenToScrn(radeon_master_screen(pScreen))->vtSema) + if (!xf86ScreenToScrn(radeon_primary_screen(pScreen))->vtSema) return; if (!pScreen->isGPU) @@ -2584,7 +2584,7 @@ CARD32 cleanup_black_fb(OsTimerPtr timer xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); int c; - if (xf86ScreenToScrn(radeon_master_screen(screen))->vtSema) + if (xf86ScreenToScrn(radeon_primary_screen(screen))->vtSema) return 0; /* Unreference the all-black FB created by RADEONLeaveVT_KMS. After diff -Naurp xf86-video-ati-19.1.0.orig/src/radeon_present.c xf86-video-ati-19.1.0/src/radeon_present.c --- xf86-video-ati-19.1.0.orig/src/radeon_present.c 2019-10-15 11:16:29.000000000 -0500 +++ xf86-video-ati-19.1.0/src/radeon_present.c 2021-07-29 16:38:30.019814341 -0500 @@ -254,7 +254,9 @@ radeon_present_check_flip(RRCrtcPtr crtc xf86CrtcPtr xf86_crtc = crtc->devPrivate; ScreenPtr screen = window->drawable.pScreen; ScrnInfoPtr scrn = xf86_crtc->scrn; +#ifdef USE_GLAMOR struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); +#endif xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); RADEONInfoPtr info = RADEONPTR(scrn); PixmapPtr screen_pixmap = screen->GetScreenPixmap(screen); @@ -278,10 +280,13 @@ radeon_present_check_flip(RRCrtcPtr crtc return FALSE; #endif +#ifdef USE_GLAMOR if (priv && priv->fb_failed) return FALSE; +#endif if (!radeon_pixmap_get_fb(pixmap)) { +#ifdef USE_GLAMOR if (!priv) priv = radeon_get_pixmap_private(pixmap); @@ -291,6 +296,7 @@ radeon_present_check_flip(RRCrtcPtr crtc "normal if using PRIME render offloading)\n"); priv->fb_failed = TRUE; } +#endif return FALSE; }