From 0999e0299df6d2d9057d29954e76c5e2c83f9432 Mon Sep 17 00:00:00 2001 From: matthieu Date: Sat, 26 Oct 2019 09:36:38 +0000 Subject: [PATCH] Update to xf86-video-amdgpu 19.1.0. Tested by mortimer@ and jsg@ --- driver/xf86-video-amdgpu/ChangeLog | 153 ++++++++++++++++++ driver/xf86-video-amdgpu/configure | 20 +-- driver/xf86-video-amdgpu/configure.ac | 2 +- driver/xf86-video-amdgpu/src/amdgpu_dri2.c | 19 ++- driver/xf86-video-amdgpu/src/amdgpu_dri3.c | 26 +-- driver/xf86-video-amdgpu/src/amdgpu_kms.c | 46 +++--- driver/xf86-video-amdgpu/src/amdgpu_pixmap.h | 26 +-- driver/xf86-video-amdgpu/src/amdgpu_present.c | 33 +++- 8 files changed, 251 insertions(+), 74 deletions(-) diff --git a/driver/xf86-video-amdgpu/ChangeLog b/driver/xf86-video-amdgpu/ChangeLog index 83bc43e48..d99e9f9f1 100644 --- a/driver/xf86-video-amdgpu/ChangeLog +++ b/driver/xf86-video-amdgpu/ChangeLog @@ -1,3 +1,156 @@ +commit b467d2569a003da05ad222b0dc095bee5eec450a +Author: Michel Dänzer +Date: Fri Oct 11 17:10:10 2019 +0200 + + Bump version for the 19.1.0 release + +commit a1b7263277c033e109629829c370c0e95978e061 +Author: Michel Dänzer +Date: Thu Sep 26 15:56:59 2019 +0200 + + Don't unreference FBs of pixmaps from different screens in LeaveVT + + FindClientResourcesByType finds pixmaps from all screens, but trying to + process ones from other screens here makes no sense and likely results + in a crash or memory corruption. + + Fixes: c16ff42f927d ("Make all active CRTCs scan out an all-black + framebuffer in LeaveVT") + (Ported from radeon commit 2faaecc69b127248718e759c6c98c84d56dd1b6b) + +commit 5b8bc9fc505c551dcd9b0ed5ab835a49fa4f9fda +Author: Michel Dänzer +Date: Wed Sep 18 12:55:45 2019 +0200 + + Don't set up black scanout buffer if LeaveVT is called from CloseScreen + + Avoids a crash described in + https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/merge_requests/43#note_223718 + + Reviewed-by: Alex Deucher + +commit e6fce59a071220967fcd4e2c9e4a262c72870761 +Author: Michel Dänzer +Date: Wed Jul 24 16:05:05 2019 +0200 + + present: Don't check pixmap pitch in check_flip with non-DC >= 3.34 + + The current non-DC kernel driver also handles flipping between different + pitches correctly. + + Reviewed-by: Nicholas Kazlauskas + +commit 5bb2580b266468f87843b5585ae64e056b63bb88 +Author: Michel Dänzer +Date: Wed Jul 24 15:55:19 2019 +0200 + + present: Don't check pixmap pitch in check_flip with current DC + + Current DC handles flipping between different pitches correctly. + + Reviewed-by: Nicholas Kazlauskas + +commit ac66086613cbd0974b421cd5eda872adc15242ed +Author: Michel Dänzer +Date: Wed Jul 24 15:45:21 2019 +0200 + + present: Also check pixmap pitch in check_flip with current xserver + + The corresponding check in the xserver Present code was removed again, + because flipping between different pitches can work in some cases. + + Reviewed-by: Nicholas Kazlauskas + +commit 98f172eb2d2353e19edd8167f22215ce596811f8 +Author: Michel Dänzer +Date: Mon Jul 29 18:54:24 2019 +0200 + + gitlab-ci: Use templates from wayland/ci-templates + + These are already used by xserver, Mesa and some other projects. + + Current Debian testing brings e.g. GCC 8.3.0 and clang 7.0.1. + +commit 87f41ace4920fd2069794211683659eb25b025a6 +Author: Michel Dänzer +Date: Fri Jul 5 12:43:53 2019 +0200 + + Don't disable page flipping completely with SW cursor + + Even with SW cursor, page flipping can be used while no X cursor is + visible. + + Occurred to me in the context of xorg/xserver#828. + +commit 7d3fef72e0c871e1677e9e544f4cae5e238b5c52 +Author: Michel Dänzer +Date: Thu May 9 17:39:49 2019 +0200 + + present: Check that we can get a KMS FB for flipping + + This can legitimately fail if the pixmap's storage is shared from + another device, e.g. when using PRIME render offloading. + +commit ea19a5207054bb159fc7fb6d88e0ceb10c3da010 +Author: Michel Dänzer +Date: Thu Jun 6 11:02:15 2019 +0200 + + Remove dri2_drawable_crtc parameter consider_disabled + + All callers were passing TRUE. + + Reviewed-and-tested-by: Flora Cui + +commit 3109f088fdbd89c2ee8078625d4f073852492656 +Author: Michel Dänzer +Date: Thu Jun 6 11:22:09 2019 +0200 + + dri2: Re-use previous CRTC when possible if pick_best_crtc returns NULL + + This way, the MSC will continue ticking at the rate of (the last mode + which was enabled for) that CRTC, instead of the client running + unthrottled. + + Reviewed-and-tested-by: Flora Cui + +commit fb06fb814700a47464abd756e1111dcc76d0d776 +Author: Flora Cui +Date: Wed May 29 14:18:50 2019 +0800 + + dri2: reply to client for WaitMSC request in any case + + otherwise client would wait for reply forever and desktop appears hang. + + Signed-off-by: Flora Cui + Acked-by: Feifei Xu + Reviewed-by: Michel Dänzer + +commit 4b17533fcb30842caf0035ba593b7d986520cc85 +Author: Michel Dänzer +Date: Tue Apr 30 17:50:15 2019 +0200 + + dri3: Always flush glamor before sharing pixmap storage with clients + + Even if glamor_gbm_bo_from_pixmap / glamor_fd_from_pixmap themselves + don't trigger any drawing, there could already be unflushed drawing to + the pixmap whose storage we share with a client. + +commit bf61e6d7ac1a5754b1026d7f80acf25ef622c491 +Author: Michel Dänzer +Date: Thu Apr 18 19:21:40 2019 +0200 + + Retry get_fb_ptr in get_fb + + If get_fb_ptr returns NULL, try again after pixmap_get_handle, it should + work then. + + Fixes spurious Present page flipping failures using "normal" pixmaps + which aren't shared with direct rendering clients, e.g. with a + compositor using the RENDER extension. + + Bugzilla: https://bugs.freedesktop.org/110417 + Reviewed-by: Alex Deucher + commit bd4ffd4ebbdf1c43ab9e1ef9ba8b812fd2dde4a4 Author: Michel Dänzer Date: Tue Mar 19 18:44:31 2019 +0100 diff --git a/driver/xf86-video-amdgpu/configure b/driver/xf86-video-amdgpu/configure index 0ad1872fd..5bc18031d 100755 --- a/driver/xf86-video-amdgpu/configure +++ b/driver/xf86-video-amdgpu/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for xf86-video-amdgpu 19.0.1. +# Generated by GNU Autoconf 2.69 for xf86-video-amdgpu 19.1.0. # # Report bugs to . # @@ -591,8 +591,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='xf86-video-amdgpu' PACKAGE_TARNAME='xf86-video-amdgpu' -PACKAGE_VERSION='19.0.1' -PACKAGE_STRING='xf86-video-amdgpu 19.0.1' +PACKAGE_VERSION='19.1.0' +PACKAGE_STRING='xf86-video-amdgpu 19.1.0' PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu' PACKAGE_URL='' @@ -1394,7 +1394,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures xf86-video-amdgpu 19.0.1 to adapt to many kinds of systems. +\`configure' configures xf86-video-amdgpu 19.1.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1465,7 +1465,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of xf86-video-amdgpu 19.0.1:";; + short | recursive ) echo "Configuration of xf86-video-amdgpu 19.1.0:";; esac cat <<\_ACEOF @@ -1622,7 +1622,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -xf86-video-amdgpu configure 19.0.1 +xf86-video-amdgpu configure 19.1.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2037,7 +2037,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by xf86-video-amdgpu $as_me 19.0.1, which was +It was created by xf86-video-amdgpu $as_me 19.1.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2869,7 +2869,7 @@ fi # Define the identity of the package. PACKAGE='xf86-video-amdgpu' - VERSION='19.0.1' + VERSION='19.1.0' cat >>confdefs.h <<_ACEOF @@ -20012,7 +20012,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by xf86-video-amdgpu $as_me 19.0.1, which was +This file was extended by xf86-video-amdgpu $as_me 19.1.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -20078,7 +20078,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -xf86-video-amdgpu config.status 19.0.1 +xf86-video-amdgpu config.status 19.1.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/driver/xf86-video-amdgpu/configure.ac b/driver/xf86-video-amdgpu/configure.ac index 867d3ce97..6f5cdd89e 100644 --- a/driver/xf86-video-amdgpu/configure.ac +++ b/driver/xf86-video-amdgpu/configure.ac @@ -23,7 +23,7 @@ # Initialize Autoconf AC_PREREQ([2.60]) AC_INIT([xf86-video-amdgpu], - [19.0.1], + [19.1.0], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu], [xf86-video-amdgpu]) diff --git a/driver/xf86-video-amdgpu/src/amdgpu_dri2.c b/driver/xf86-video-amdgpu/src/amdgpu_dri2.c index 44316ac94..a77e4e31b 100644 --- a/driver/xf86-video-amdgpu/src/amdgpu_dri2.c +++ b/driver/xf86-video-amdgpu/src/amdgpu_dri2.c @@ -414,18 +414,20 @@ static Bool amdgpu_dri2_get_crtc_msc(xf86CrtcPtr crtc, CARD64 *ust, CARD64 *msc) } static -xf86CrtcPtr amdgpu_dri2_drawable_crtc(DrawablePtr pDraw, Bool consider_disabled) +xf86CrtcPtr amdgpu_dri2_drawable_crtc(DrawablePtr pDraw) { ScreenPtr pScreen = pDraw->pScreen; ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); - xf86CrtcPtr crtc = amdgpu_pick_best_crtc(pScrn, consider_disabled, + xf86CrtcPtr crtc = amdgpu_pick_best_crtc(pScrn, TRUE, pDraw->x, pDraw->x + pDraw->width, pDraw->y, pDraw->y + pDraw->height); - if (crtc && pDraw->type == DRAWABLE_WINDOW) { + if (pDraw->type == DRAWABLE_WINDOW) { struct dri2_window_priv *priv = get_dri2_window_priv((WindowPtr)pDraw); - if (priv->crtc && priv->crtc != crtc) { + if (!crtc) { + crtc = priv->crtc; + } else if (priv->crtc && priv->crtc != crtc) { CARD64 ust, mscold, mscnew; if (amdgpu_dri2_get_crtc_msc(priv->crtc, &ust, &mscold) && @@ -831,7 +833,7 @@ CARD32 amdgpu_dri2_extrapolate_msc_delay(xf86CrtcPtr crtc, CARD64 * target_msc, */ static int amdgpu_dri2_get_msc(DrawablePtr draw, CARD64 * ust, CARD64 * msc) { - xf86CrtcPtr crtc = amdgpu_dri2_drawable_crtc(draw, TRUE); + xf86CrtcPtr crtc = amdgpu_dri2_drawable_crtc(draw); /* Drawable not displayed, make up a value */ if (!crtc) { @@ -946,7 +948,7 @@ static int amdgpu_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw, ScrnInfoPtr scrn = xf86ScreenToScrn(screen); DRI2FrameEventPtr wait_info = NULL; uintptr_t drm_queue_seq = 0; - xf86CrtcPtr crtc = amdgpu_dri2_drawable_crtc(draw, TRUE); + xf86CrtcPtr crtc = amdgpu_dri2_drawable_crtc(draw); uint32_t msc_delta; uint32_t seq; CARD64 current_msc; @@ -1062,6 +1064,9 @@ static int amdgpu_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw, out_complete: if (wait_info) amdgpu_dri2_deferred_event(NULL, 0, wait_info); + else + DRI2WaitMSCComplete(client, draw, 0, 0, 0); + return TRUE; } @@ -1093,7 +1098,7 @@ static int amdgpu_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, { ScreenPtr screen = draw->pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); - xf86CrtcPtr crtc = amdgpu_dri2_drawable_crtc(draw, TRUE); + xf86CrtcPtr crtc = amdgpu_dri2_drawable_crtc(draw); uint32_t msc_delta; drmVBlankSeqType type; uint32_t seq; diff --git a/driver/xf86-video-amdgpu/src/amdgpu_dri3.c b/driver/xf86-video-amdgpu/src/amdgpu_dri3.c index 7f1745e61..ed1e2f967 100644 --- a/driver/xf86-video-amdgpu/src/amdgpu_dri3.c +++ b/driver/xf86-video-amdgpu/src/amdgpu_dri3.c @@ -221,29 +221,13 @@ static int amdgpu_dri3_fd_from_pixmap(ScreenPtr screen, AMDGPUInfoPtr info = AMDGPUPTR(scrn); if (info->use_glamor) { - Bool need_flush = TRUE; - int ret = -1; -#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,19,99,904,0) - struct gbm_bo *gbm_bo = glamor_gbm_bo_from_pixmap(screen, pixmap); + int ret = glamor_fd_from_pixmap(screen, pixmap, stride, size); - if (gbm_bo) { - ret = gbm_bo_get_fd(gbm_bo); - gbm_bo_destroy(gbm_bo); - - if (ret >= 0) - need_flush = FALSE; - } -#endif - - if (ret < 0) - ret = glamor_fd_from_pixmap(screen, pixmap, stride, size); - - /* glamor might have needed to reallocate the pixmap storage and - * copy the pixmap contents to the new storage. The copy - * operation needs to be flushed to the kernel driver before the - * client starts using the pixmap storage for direct rendering. + /* Any pending drawing operations need to be flushed to the + * kernel driver before the client starts using the pixmap + * storage for direct rendering. */ - if (ret >= 0 && need_flush) + if (ret >= 0) amdgpu_glamor_flush(scrn); return ret; diff --git a/driver/xf86-video-amdgpu/src/amdgpu_kms.c b/driver/xf86-video-amdgpu/src/amdgpu_kms.c index 74d5806c8..6a60f5457 100644 --- a/driver/xf86-video-amdgpu/src/amdgpu_kms.c +++ b/driver/xf86-video-amdgpu/src/amdgpu_kms.c @@ -1537,7 +1537,6 @@ Bool AMDGPUPreInit_KMS(ScrnInfoPtr pScrn, int flags) int cpp; uint64_t heap_size = 0; uint64_t max_allocation = 0; - Bool sw_cursor; if (flags & PROBE_DETECT) return TRUE; @@ -1645,19 +1644,15 @@ Bool AMDGPUPreInit_KMS(ScrnInfoPtr pScrn, int flags) } if (!pScrn->is_gpu) { - sw_cursor = xf86ReturnOptValBool(info->Options, - OPTION_SW_CURSOR, FALSE); - info->allowPageFlip = xf86ReturnOptValBool(info->Options, OPTION_PAGE_FLIP, TRUE); - if (sw_cursor || info->shadow_primary) { + if (info->shadow_primary) { xf86DrvMsg(pScrn->scrnIndex, info->allowPageFlip ? X_WARNING : X_DEFAULT, "KMS Pageflipping: disabled%s\n", info->allowPageFlip ? - (sw_cursor ? " because of SWcursor" : - " because of ShadowPrimary") : ""); + " because of ShadowPrimary" : ""); info->allowPageFlip = FALSE; } else { xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -2245,16 +2240,25 @@ Bool AMDGPUEnterVT_KMS(ScrnInfoPtr pScrn) } static void -pixmap_unref_fb(void *value, XID id, void *cdata) +pixmap_unref_fb(PixmapPtr pixmap) { - PixmapPtr pixmap = value; - AMDGPUEntPtr pAMDGPUEnt = cdata; + ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); struct drmmode_fb **fb_ptr = amdgpu_pixmap_get_fb_ptr(pixmap); + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); if (fb_ptr) drmmode_fb_reference(pAMDGPUEnt->fd, fb_ptr, NULL); } +static void +client_pixmap_unref_fb(void *value, XID id, void *pScreen) +{ + PixmapPtr pixmap = value; + + if (pixmap->drawable.pScreen == pScreen) + pixmap_unref_fb(pixmap); +} + void AMDGPULeaveVT_KMS(ScrnInfoPtr pScrn) { AMDGPUInfoPtr info = AMDGPUPTR(pScrn); @@ -2272,6 +2276,12 @@ void AMDGPULeaveVT_KMS(ScrnInfoPtr pScrn) unsigned w = 0, h = 0; int i; + /* If we're called from CloseScreen, trying to clear the black + * scanout BO will likely crash and burn + */ + if (!pScreen->GCperDepth[0]) + goto hide_cursors; + /* Compute maximum scanout dimensions of active CRTCs */ for (i = 0; i < xf86_config->num_crtc; i++) { crtc = xf86_config->crtc[i]; @@ -2310,11 +2320,9 @@ void AMDGPULeaveVT_KMS(ScrnInfoPtr pScrn) if (pScrn->is_gpu) { if (drmmode_crtc->scanout[0].pixmap) - pixmap_unref_fb(drmmode_crtc->scanout[0].pixmap, - None, pAMDGPUEnt); + pixmap_unref_fb(drmmode_crtc->scanout[0].pixmap); if (drmmode_crtc->scanout[1].pixmap) - pixmap_unref_fb(drmmode_crtc->scanout[1].pixmap, - None, pAMDGPUEnt); + pixmap_unref_fb(drmmode_crtc->scanout[1].pixmap); } else { drmmode_crtc_scanout_free(crtc); } @@ -2334,18 +2342,20 @@ void AMDGPULeaveVT_KMS(ScrnInfoPtr pScrn) (!clients[i] || clients[i]->clientState != ClientStateRunning)) continue; - FindClientResourcesByType(clients[i], RT_PIXMAP, pixmap_unref_fb, - pAMDGPUEnt); + FindClientResourcesByType(clients[i], RT_PIXMAP, + client_pixmap_unref_fb, pScreen); } - pixmap_unref_fb(pScreen->GetScreenPixmap(pScreen), None, pAMDGPUEnt); + pixmap_unref_fb(pScreen->GetScreenPixmap(pScreen)); } else { memset(info->front_buffer->cpu_ptr, 0, pScrn->virtualX * info->pixel_bytes * pScrn->virtualY); } - TimerSet(NULL, 0, 1000, cleanup_black_fb, pScreen); + if (pScreen->GCperDepth[0]) + TimerSet(NULL, 0, 1000, cleanup_black_fb, pScreen); + hide_cursors: xf86_hide_cursors(pScrn); amdgpu_drop_drm_master(pScrn); diff --git a/driver/xf86-video-amdgpu/src/amdgpu_pixmap.h b/driver/xf86-video-amdgpu/src/amdgpu_pixmap.h index 0cff1952f..94ec210f4 100644 --- a/driver/xf86-video-amdgpu/src/amdgpu_pixmap.h +++ b/driver/xf86-video-amdgpu/src/amdgpu_pixmap.h @@ -36,6 +36,7 @@ struct amdgpu_pixmap { struct amdgpu_buffer *bo; struct drmmode_fb *fb; + Bool fb_failed; /* GEM handle for pixmaps shared via DRI2/3 */ Bool handle_valid; @@ -143,21 +144,22 @@ static inline struct drmmode_fb* amdgpu_pixmap_get_fb(PixmapPtr pix) { struct drmmode_fb **fb_ptr = amdgpu_pixmap_get_fb_ptr(pix); + uint32_t handle; - if (!fb_ptr) - return NULL; + if (fb_ptr && *fb_ptr) + return *fb_ptr; + + if (amdgpu_pixmap_get_handle(pix, &handle)) { + ScrnInfoPtr scrn = xf86ScreenToScrn(pix->drawable.pScreen); + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); - if (!*fb_ptr) { - uint32_t handle; + if (!fb_ptr) + fb_ptr = amdgpu_pixmap_get_fb_ptr(pix); - if (amdgpu_pixmap_get_handle(pix, &handle)) { - ScrnInfoPtr scrn = xf86ScreenToScrn(pix->drawable.pScreen); - AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); - - *fb_ptr = amdgpu_fb_create(scrn, pAMDGPUEnt->fd, pix->drawable.width, - pix->drawable.height, pix->devKind, - handle); - } + *fb_ptr = amdgpu_fb_create(scrn, pAMDGPUEnt->fd, + pix->drawable.width, + pix->drawable.height, pix->devKind, + handle); } return *fb_ptr; diff --git a/driver/xf86-video-amdgpu/src/amdgpu_present.c b/driver/xf86-video-amdgpu/src/amdgpu_present.c index fdedd3266..cc3d113eb 100644 --- a/driver/xf86-video-amdgpu/src/amdgpu_present.c +++ b/driver/xf86-video-amdgpu/src/amdgpu_present.c @@ -255,10 +255,12 @@ amdgpu_present_check_flip(RRCrtcPtr crtc, WindowPtr window, PixmapPtr pixmap, xf86CrtcPtr xf86_crtc = crtc->devPrivate; ScreenPtr screen = window->drawable.pScreen; ScrnInfoPtr scrn = xf86_crtc->scrn; + struct amdgpu_pixmap *priv = amdgpu_get_pixmap_private(pixmap); PixmapPtr screen_pixmap = screen->GetScreenPixmap(screen); xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); AMDGPUInfoPtr info = AMDGPUPTR(scrn); int num_crtcs_on; + Bool dc_enabled; int i; if (!scrn->vtSema) @@ -273,16 +275,37 @@ amdgpu_present_check_flip(RRCrtcPtr crtc, WindowPtr window, PixmapPtr pixmap, if (info->drmmode.dri2_flipping) return FALSE; -#if XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(1, 20, 99, 1, 0) - if (pixmap->devKind != screen_pixmap->devKind) + if (priv && priv->fb_failed) return FALSE; -#endif + + if (!amdgpu_pixmap_get_fb(pixmap)) { + if (!priv) + priv = amdgpu_get_pixmap_private(pixmap); + + if (priv && !priv->fb_failed) { + xf86DrvMsg(scrn->scrnIndex, X_WARNING, + "Cannot get FB for Present flip (may be " + "normal if using PRIME render offloading)\n"); + priv->fb_failed = TRUE; + } + + return FALSE; + } /* Only DC supports advanced color management features, so we can use * drmmode_cm_enabled as a proxy for "Is DC enabled?" */ - if (info->dri2.pKernelDRMVersion->version_minor < 31 || - !drmmode_cm_enabled(&info->drmmode)) { + dc_enabled = drmmode_cm_enabled(&info->drmmode); + + if (info->dri2.pKernelDRMVersion->version_minor < (dc_enabled ? 31 : 34)) { + /* The kernel driver doesn't handle flipping between BOs with + * different pitch correctly + */ + if (pixmap->devKind != screen_pixmap->devKind) + return FALSE; + } + + if (!dc_enabled || info->dri2.pKernelDRMVersion->version_minor < 31) { /* The kernel driver doesn't handle flipping between BOs with * different tiling parameters correctly */