Hello community, here is the log from the commit of package xf86-video-amdgpu for openSUSE:Factory checked in at 2019-10-17 12:16:14 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xf86-video-amdgpu (Old) and /work/SRC/openSUSE:Factory/.xf86-video-amdgpu.new.2352 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xf86-video-amdgpu" Thu Oct 17 12:16:14 2019 rev:25 rq:737890 version:19.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/xf86-video-amdgpu/xf86-video-amdgpu.changes 2019-08-05 10:30:09.351447080 +0200 +++ /work/SRC/openSUSE:Factory/.xf86-video-amdgpu.new.2352/xf86-video-amdgpu.changes 2019-10-17 12:16:16.328078039 +0200 @@ -1,0 +2,6 @@ +Sat Oct 12 13:39:40 UTC 2019 - Stefan Dirsch <sndir...@suse.com> + +- Update to version 19.1.0 + * bugfixes and minor improvements + +------------------------------------------------------------------- Old: ---- xf86-video-amdgpu-19.0.1.tar.bz2 xf86-video-amdgpu-19.0.1.tar.bz2.sig New: ---- xf86-video-amdgpu-19.1.0.tar.bz2 xf86-video-amdgpu-19.1.0.tar.bz2.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xf86-video-amdgpu.spec ++++++ --- /var/tmp/diff_new_pack.BMRnai/_old 2019-10-17 12:16:16.956076463 +0200 +++ /var/tmp/diff_new_pack.BMRnai/_new 2019-10-17 12:16:16.960076453 +0200 @@ -21,7 +21,7 @@ %define pci_ids_dir %{_sysconfdir}/X11/xorg_pci_ids %endif Name: xf86-video-amdgpu -Version: 19.0.1 +Version: 19.1.0 Release: 0 Summary: AMDGPU video driver for the Xorg X server License: MIT ++++++ xf86-video-amdgpu-19.0.1.tar.bz2 -> xf86-video-amdgpu-19.1.0.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-amdgpu-19.0.1/ChangeLog new/xf86-video-amdgpu-19.1.0/ChangeLog --- old/xf86-video-amdgpu-19.0.1/ChangeLog 2019-03-19 18:50:39.000000000 +0100 +++ new/xf86-video-amdgpu-19.1.0/ChangeLog 2019-10-11 17:21:22.000000000 +0200 @@ -1,3 +1,156 @@ +commit b467d2569a003da05ad222b0dc095bee5eec450a +Author: Michel Dänzer <mdaen...@redhat.com> +Date: Fri Oct 11 17:10:10 2019 +0200 + + Bump version for the 19.1.0 release + +commit a1b7263277c033e109629829c370c0e95978e061 +Author: Michel Dänzer <mdaen...@redhat.com> +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 <mdaen...@redhat.com> +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 <alexander.deuc...@amd.com> + +commit e6fce59a071220967fcd4e2c9e4a262c72870761 +Author: Michel Dänzer <michel.daen...@amd.com> +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 <nicholas.kazlaus...@amd.com> + +commit 5bb2580b266468f87843b5585ae64e056b63bb88 +Author: Michel Dänzer <michel.daen...@amd.com> +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 <nicholas.kazlaus...@amd.com> + +commit ac66086613cbd0974b421cd5eda872adc15242ed +Author: Michel Dänzer <michel.daen...@amd.com> +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 <nicholas.kazlaus...@amd.com> + +commit 98f172eb2d2353e19edd8167f22215ce596811f8 +Author: Michel Dänzer <michel.daen...@amd.com> +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 <michel.daen...@amd.com> +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 <michel.daen...@amd.com> +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 <michel.daen...@amd.com> +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 <flora....@amd.com> + +commit 3109f088fdbd89c2ee8078625d4f073852492656 +Author: Michel Dänzer <michel.daen...@amd.com> +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 <flora....@amd.com> + +commit fb06fb814700a47464abd756e1111dcc76d0d776 +Author: Flora Cui <flora....@amd.com> +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 <flora....@amd.com> + Acked-by: Feifei Xu <feifei...@amd.com> + Reviewed-by: Michel Dänzer <michel.daen...@amd.com> + +commit 4b17533fcb30842caf0035ba593b7d986520cc85 +Author: Michel Dänzer <michel.daen...@amd.com> +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 <michel.daen...@amd.com> +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 <alexander.deuc...@amd.com> + commit bd4ffd4ebbdf1c43ab9e1ef9ba8b812fd2dde4a4 Author: Michel Dänzer <michel.daen...@amd.com> Date: Tue Mar 19 18:44:31 2019 +0100 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-amdgpu-19.0.1/configure new/xf86-video-amdgpu-19.1.0/configure --- old/xf86-video-amdgpu-19.0.1/configure 2019-03-19 18:50:23.000000000 +0100 +++ new/xf86-video-amdgpu-19.1.0/configure 2019-10-11 17:21:05.000000000 +0200 @@ -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 <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu>. # @@ -591,8 +591,8 @@ # 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='' @@ -1404,7 +1404,7 @@ # 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]... @@ -1476,7 +1476,7 @@ 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 @@ -1635,7 +1635,7 @@ 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. @@ -2050,7 +2050,7 @@ 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 $@ @@ -2921,7 +2921,7 @@ # Define the identity of the package. PACKAGE='xf86-video-amdgpu' - VERSION='19.0.1' + VERSION='19.1.0' cat >>confdefs.h <<_ACEOF @@ -20619,7 +20619,7 @@ # 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 @@ -20685,7 +20685,7 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-amdgpu-19.0.1/configure.ac new/xf86-video-amdgpu-19.1.0/configure.ac --- old/xf86-video-amdgpu-19.0.1/configure.ac 2019-03-19 18:49:55.000000000 +0100 +++ new/xf86-video-amdgpu-19.1.0/configure.ac 2019-10-11 17:20:30.000000000 +0200 @@ -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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-amdgpu-19.0.1/src/amdgpu_dri2.c new/xf86-video-amdgpu-19.1.0/src/amdgpu_dri2.c --- old/xf86-video-amdgpu-19.0.1/src/amdgpu_dri2.c 2019-03-19 18:49:55.000000000 +0100 +++ new/xf86-video-amdgpu-19.1.0/src/amdgpu_dri2.c 2019-10-11 17:20:30.000000000 +0200 @@ -414,18 +414,20 @@ } 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 @@ */ 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 @@ 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 @@ 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 @@ { 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-amdgpu-19.0.1/src/amdgpu_dri3.c new/xf86-video-amdgpu-19.1.0/src/amdgpu_dri3.c --- old/xf86-video-amdgpu-19.0.1/src/amdgpu_dri3.c 2019-03-19 18:49:55.000000000 +0100 +++ new/xf86-video-amdgpu-19.1.0/src/amdgpu_dri3.c 2019-10-11 17:20:30.000000000 +0200 @@ -221,29 +221,13 @@ 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-amdgpu-19.0.1/src/amdgpu_kms.c new/xf86-video-amdgpu-19.1.0/src/amdgpu_kms.c --- old/xf86-video-amdgpu-19.0.1/src/amdgpu_kms.c 2019-03-19 18:49:55.000000000 +0100 +++ new/xf86-video-amdgpu-19.1.0/src/amdgpu_kms.c 2019-10-11 17:20:30.000000000 +0200 @@ -1537,7 +1537,6 @@ 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 @@ } 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 @@ } 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 @@ 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 @@ 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 @@ (!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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-amdgpu-19.0.1/src/amdgpu_pixmap.h new/xf86-video-amdgpu-19.1.0/src/amdgpu_pixmap.h --- old/xf86-video-amdgpu-19.0.1/src/amdgpu_pixmap.h 2019-03-19 18:49:55.000000000 +0100 +++ new/xf86-video-amdgpu-19.1.0/src/amdgpu_pixmap.h 2019-10-11 17:20:30.000000000 +0200 @@ -36,6 +36,7 @@ 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 @@ 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) { - uint32_t handle; - - 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); - } + 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) + fb_ptr = amdgpu_pixmap_get_fb_ptr(pix); + + *fb_ptr = amdgpu_fb_create(scrn, pAMDGPUEnt->fd, + pix->drawable.width, + pix->drawable.height, pix->devKind, + handle); } return *fb_ptr; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-amdgpu-19.0.1/src/amdgpu_present.c new/xf86-video-amdgpu-19.1.0/src/amdgpu_present.c --- old/xf86-video-amdgpu-19.0.1/src/amdgpu_present.c 2019-03-19 18:49:55.000000000 +0100 +++ new/xf86-video-amdgpu-19.1.0/src/amdgpu_present.c 2019-10-11 17:20:30.000000000 +0200 @@ -255,10 +255,12 @@ 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 @@ 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 */