The latest xf86-video-amdgpu release was in 2019. xf86-video-amdgpu-19.1.0..origin/master
minus commits we already have cb27a5b Handle NULL fb_ptr in pixmap_get_fb e2cd67a Bail from amdgpu_pixmap_get_handle with ShadowFB edcbe5f Fix link failure with gcc 10 With a X_PRIVSEP path added to amdgpu_probe.c to handle the change from drmOpen() to open(). aedbf47 Include xf86drm.h instead of sarea.h 6ed4863 Drop dri.h includes 6234a1b Fix drmmode_crtc_scanout_create logic 6bd3dc6 Check for AMDGPU_CREATE_PIXMAP_SCANOUT in amdgpu_glamor_create_pixmap 2202cdf Replace a few more instances of "master" 0d1d479 Fix build against ABI_VIDEODRV_VERSION 25.2 442efe7 Make drmmode_crtc_scanout_create/destroy static 99f3c82 Drop struct drmmode_scanout altogether in favour of PixmapPtrs cfce4b3 Drop bo/width/height members from struct drmmode_scanout 680b9a2 Fix return value check of drmIoctl() e923642 gitlab CI: update to use the latest CI templates 0732f81 glamor: Make pixmap scanout compatible if its dimensions are 42a3148 Factor out common code to amdgpu_probe() eeaaf37 Introduce amdgpu_device_setup helper 1c9742e Kill off drmOpen/Close/drmSetInterfaceVersion in favour of drmDevices 2dd7307 Use the device_id straight from gpu_info 655b3c5 Reuse the existing busid string b357a84 Store the busid string in AMDGPUEnt 2c0c154 Remove NULL check after a "cannot fail" function 16ae0d0 Fixup the amdgpu_bus_id() string format abbe23f Remove drmCheckModesettingSupported and kernel module loading, on Linux 0b3bc7a Use ODEV_ATTRIB_PATH where possible for the device node. fd66f5c kms: Handle changes to SourceValidate call chain in xserver 19 Index: driver/xf86-video-amdgpu/Makefile.in =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/Makefile.in,v retrieving revision 1.2 diff -u -p -r1.2 Makefile.in --- driver/xf86-video-amdgpu/Makefile.in 16 Apr 2019 01:59:34 -0000 1.2 +++ driver/xf86-video-amdgpu/Makefile.in 8 Jul 2021 07:13:57 -0000 @@ -314,6 +314,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ Index: driver/xf86-video-amdgpu/README.md =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/README.md,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 README.md --- driver/xf86-video-amdgpu/README.md 16 Apr 2019 01:49:01 -0000 1.1.1.1 +++ driver/xf86-video-amdgpu/README.md 7 Jul 2021 13:42:19 -0000 @@ -9,7 +9,7 @@ Please to the Xorg bugzilla. The -[master development code repository](https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu) +[main development code repository](https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu) can be found at FreeDesktop Gitlab. Please use merge requests for patch submission. Index: driver/xf86-video-amdgpu/aclocal.m4 =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/aclocal.m4,v retrieving revision 1.2 diff -u -p -r1.2 aclocal.m4 --- driver/xf86-video-amdgpu/aclocal.m4 16 Apr 2019 01:59:34 -0000 1.2 +++ driver/xf86-video-amdgpu/aclocal.m4 8 Jul 2021 07:13:54 -0000 @@ -19,9 +19,9 @@ You have another version of autoconf. I If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -dnl serial 11 (pkg-config-0.29.1) -dnl +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 12 (pkg-config-0.29.2) + dnl Copyright © 2004 Scott James Remnant <sc...@netsplit.com>. dnl Copyright © 2012-2015 Dan Nicholson <dbn.li...@gmail.com> dnl @@ -62,7 +62,7 @@ dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], -[m4_define([PKG_MACROS_VERSION], [0.29.1]) +[m4_define([PKG_MACROS_VERSION], [0.29.2]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ @@ -163,7 +163,7 @@ AC_ARG_VAR([$1][_CFLAGS], [C compiler fl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no -AC_MSG_CHECKING([for $1]) +AC_MSG_CHECKING([for $2]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) @@ -173,11 +173,11 @@ and $1[]_LIBS to avoid the need to call See the pkg-config man page for more details.]) if test $pkg_failed = yes; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` - else + else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs @@ -194,7 +194,7 @@ installed software in a non-standard pre _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full Index: driver/xf86-video-amdgpu/configure =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/configure,v retrieving revision 1.3 diff -u -p -r1.3 configure --- driver/xf86-video-amdgpu/configure 26 Oct 2019 09:36:38 -0000 1.3 +++ driver/xf86-video-amdgpu/configure 8 Jul 2021 07:13:56 -0000 @@ -784,6 +784,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -892,6 +893,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1144,6 +1146,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1281,7 +1292,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1434,6 +1445,7 @@ Fine tuning of the installation director --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -18296,8 +18308,8 @@ $as_echo "$_EXT_CHECK" >&6; } # Checks for libraries. pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBDRM" >&5 -$as_echo_n "checking for LIBDRM... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libdrm >= 2.4.89" >&5 +$as_echo_n "checking for libdrm >= 2.4.89... " >&6; } if test -n "$LIBDRM_CFLAGS"; then pkg_cv_LIBDRM_CFLAGS="$LIBDRM_CFLAGS" @@ -18337,7 +18349,7 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -18364,7 +18376,7 @@ Alternatively, you may set the environme and LIBDRM_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} @@ -18387,8 +18399,8 @@ $as_echo "yes" >&6; } fi pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBDRM_AMDGPU" >&5 -$as_echo_n "checking for LIBDRM_AMDGPU... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libdrm_amdgpu >= 2.4.76" >&5 +$as_echo_n "checking for libdrm_amdgpu >= 2.4.76... " >&6; } if test -n "$LIBDRM_AMDGPU_CFLAGS"; then pkg_cv_LIBDRM_AMDGPU_CFLAGS="$LIBDRM_AMDGPU_CFLAGS" @@ -18428,7 +18440,7 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -18455,7 +18467,7 @@ Alternatively, you may set the environme and LIBDRM_AMDGPU_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} @@ -18478,8 +18490,8 @@ $as_echo "yes" >&6; } fi pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GBM" >&5 -$as_echo_n "checking for GBM... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gbm" >&5 +$as_echo_n "checking for gbm... " >&6; } if test -n "$GBM_CFLAGS"; then pkg_cv_GBM_CFLAGS="$GBM_CFLAGS" @@ -18519,7 +18531,7 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -18546,7 +18558,7 @@ Alternatively, you may set the environme and GBM_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} @@ -18571,8 +18583,8 @@ fi # Obtain compiler/linker options for the driver dependencies pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XORG" >&5 -$as_echo_n "checking for XORG... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for xorg-server >= 1.13 xproto fontsproto xf86driproto $REQUIRED_MODULES" >&5 +$as_echo_n "checking for xorg-server >= 1.13 xproto fontsproto xf86driproto $REQUIRED_MODULES... " >&6; } if test -n "$XORG_CFLAGS"; then pkg_cv_XORG_CFLAGS="$XORG_CFLAGS" @@ -18612,7 +18624,7 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -18639,7 +18651,7 @@ Alternatively, you may set the environme and XORG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} @@ -18662,8 +18674,8 @@ $as_echo "yes" >&6; } fi pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XEXT" >&5 -$as_echo_n "checking for XEXT... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for xextproto >= 7.0.99.1" >&5 +$as_echo_n "checking for xextproto >= 7.0.99.1... " >&6; } if test -n "$XEXT_CFLAGS"; then pkg_cv_XEXT_CFLAGS="$XEXT_CFLAGS" @@ -18703,7 +18715,7 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -18721,7 +18733,7 @@ fi HAVE_XEXTPROTO_71="no" elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_XEXTPROTO_71="no" else @@ -18783,8 +18795,8 @@ fi if test "x$enable_udev" != "xno"; then pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBUDEV" >&5 -$as_echo_n "checking for LIBUDEV... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libudev" >&5 +$as_echo_n "checking for libudev... " >&6; } if test -n "$LIBUDEV_CFLAGS"; then pkg_cv_LIBUDEV_CFLAGS="$LIBUDEV_CFLAGS" @@ -18824,7 +18836,7 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -18842,7 +18854,7 @@ fi LIBUDEV=no elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } LIBUDEV=no else @@ -18940,8 +18952,8 @@ $as_echo "#define HAVE_GLAMOR_FINISH 1" else pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGL" >&5 -$as_echo_n "checking for LIBGL... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gl" >&5 +$as_echo_n "checking for gl... " >&6; } if test -n "$LIBGL_CFLAGS"; then pkg_cv_LIBGL_CFLAGS="$LIBGL_CFLAGS" @@ -18981,7 +18993,7 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -19008,7 +19020,7 @@ Alternatively, you may set the environme and LIBGL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} @@ -19036,8 +19048,8 @@ fi if test "x$GLAMOR_XSERVER" != xyes; then pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGLAMOR" >&5 -$as_echo_n "checking for LIBGLAMOR... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glamor >= 0.6.0" >&5 +$as_echo_n "checking for glamor >= 0.6.0... " >&6; } if test -n "$LIBGLAMOR_CFLAGS"; then pkg_cv_LIBGLAMOR_CFLAGS="$LIBGLAMOR_CFLAGS" @@ -19077,7 +19089,7 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -19104,7 +19116,7 @@ Alternatively, you may set the environme and LIBGLAMOR_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} @@ -19127,8 +19139,8 @@ $as_echo "yes" >&6; } fi pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGLAMOR_EGL" >&5 -$as_echo_n "checking for LIBGLAMOR_EGL... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glamor-egl" >&5 +$as_echo_n "checking for glamor-egl... " >&6; } if test -n "$LIBGLAMOR_EGL_CFLAGS"; then pkg_cv_LIBGLAMOR_EGL_CFLAGS="$LIBGLAMOR_EGL_CFLAGS" @@ -19168,7 +19180,7 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -19195,7 +19207,7 @@ Alternatively, you may set the environme and LIBGLAMOR_EGL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} Index: driver/xf86-video-amdgpu/conf/Makefile.in =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/conf/Makefile.in,v retrieving revision 1.2 diff -u -p -r1.2 Makefile.in --- driver/xf86-video-amdgpu/conf/Makefile.in 16 Apr 2019 01:59:34 -0000 1.2 +++ driver/xf86-video-amdgpu/conf/Makefile.in 8 Jul 2021 07:13:57 -0000 @@ -284,6 +284,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ Index: driver/xf86-video-amdgpu/man/Makefile.in =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/man/Makefile.in,v retrieving revision 1.2 diff -u -p -r1.2 Makefile.in --- driver/xf86-video-amdgpu/man/Makefile.in 16 Apr 2019 01:59:34 -0000 1.2 +++ driver/xf86-video-amdgpu/man/Makefile.in 8 Jul 2021 07:13:57 -0000 @@ -285,6 +285,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ Index: driver/xf86-video-amdgpu/man/amdgpu.man =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/man/amdgpu.man,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 amdgpu.man --- driver/xf86-video-amdgpu/man/amdgpu.man 16 Apr 2019 01:49:36 -0000 1.1.1.1 +++ driver/xf86-video-amdgpu/man/amdgpu.man 7 Jul 2021 13:42:19 -0000 @@ -81,7 +81,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 \*qVariableRefresh\*q \*q" boolean \*q Enables support for enabling variable refresh on the Screen's CRTCs Index: driver/xf86-video-amdgpu/src/Makefile.in =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/src/Makefile.in,v retrieving revision 1.2 diff -u -p -r1.2 Makefile.in --- driver/xf86-video-amdgpu/src/Makefile.in 16 Apr 2019 01:59:34 -0000 1.2 +++ driver/xf86-video-amdgpu/src/Makefile.in 8 Jul 2021 07:13:58 -0000 @@ -333,6 +333,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ Index: driver/xf86-video-amdgpu/src/amdgpu_bo_helper.c =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/src/amdgpu_bo_helper.c,v retrieving revision 1.2 diff -u -p -r1.2 amdgpu_bo_helper.c --- driver/xf86-video-amdgpu/src/amdgpu_bo_helper.c 26 Oct 2020 14:15:50 -0000 1.2 +++ driver/xf86-video-amdgpu/src/amdgpu_bo_helper.c 7 Jul 2021 13:42:19 -0000 @@ -79,7 +79,7 @@ struct amdgpu_buffer *amdgpu_alloc_pixma } pixmap_buffer->ref_count = 1; - if ( bitsPerPixel == pScrn->bitsPerPixel) + if (usage_hint & AMDGPU_CREATE_PIXMAP_SCANOUT) bo_use |= GBM_BO_USE_SCANOUT; #ifdef HAVE_GBM_BO_USE_LINEAR Index: driver/xf86-video-amdgpu/src/amdgpu_dri3.c =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/src/amdgpu_dri3.c,v retrieving revision 1.3 diff -u -p -r1.3 amdgpu_dri3.c --- driver/xf86-video-amdgpu/src/amdgpu_dri3.c 21 Dec 2020 09:06:14 -0000 1.3 +++ driver/xf86-video-amdgpu/src/amdgpu_dri3.c 7 Jul 2021 13:42:19 -0000 @@ -47,7 +47,7 @@ extern int priv_open_device(const char * #define priv_open_device(n) open(n,O_RDWR|O_CLOEXEC) #endif -static int open_master_node(ScreenPtr screen, int *out) +static int open_card_node(ScreenPtr screen, int *out) { ScrnInfoPtr scrn = xf86ScreenToScrn(screen); AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); @@ -118,7 +118,7 @@ amdgpu_dri3_open(ScreenPtr screen, RRPro ret = open_render_node(screen, out); if (ret != Success) - ret = open_master_node(screen, out); + ret = open_card_node(screen, out); return ret; } Index: driver/xf86-video-amdgpu/src/amdgpu_drv.h =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/src/amdgpu_drv.h,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 amdgpu_drv.h --- driver/xf86-video-amdgpu/src/amdgpu_drv.h 16 Apr 2019 01:49:41 -0000 1.1.1.1 +++ driver/xf86-video-amdgpu/src/amdgpu_drv.h 7 Jul 2021 13:42:19 -0000 @@ -168,18 +168,18 @@ typedef enum { } AMDGPUOpts; static inline ScreenPtr -amdgpu_master_screen(ScreenPtr screen) +amdgpu_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 -amdgpu_dirty_master(PixmapDirtyUpdatePtr dirty) +amdgpu_dirty_primary(PixmapDirtyUpdatePtr dirty) { - return amdgpu_master_screen(dirty->slave_dst->drawable.pScreen); + return amdgpu_primary_screen(dirty->secondary_dst->drawable.pScreen); } static inline DrawablePtr @@ -248,8 +248,6 @@ extern DevScreenPrivateKeyRec amdgpu_dev typedef struct { EntityInfoPtr pEnt; - struct pci_device *PciInfo; - int Chipset; uint32_t family; struct gbm_device *gbm; Index: driver/xf86-video-amdgpu/src/amdgpu_glamor.c =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/src/amdgpu_glamor.c,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 amdgpu_glamor.c --- driver/xf86-video-amdgpu/src/amdgpu_glamor.c 16 Apr 2019 01:49:36 -0000 1.1.1.1 +++ driver/xf86-video-amdgpu/src/amdgpu_glamor.c 7 Jul 2021 13:42:19 -0000 @@ -201,14 +201,16 @@ amdgpu_glamor_create_pixmap(ScreenPtr sc unsigned usage) { ScrnInfoPtr scrn = xf86ScreenToScrn(screen); + PixmapFormatPtr format = xf86GetPixFormat(scrn, depth); AMDGPUInfoPtr info = AMDGPUPTR(scrn); struct amdgpu_pixmap *priv; PixmapPtr pixmap, new_pixmap = NULL; - if (!xf86GetPixFormat(scrn, depth)) + if (!format) return NULL; - if (!AMDGPU_CREATE_PIXMAP_SHARED(usage)) { + if (!(usage & AMDGPU_CREATE_PIXMAP_SCANOUT) && + !AMDGPU_CREATE_PIXMAP_SHARED(usage)) { if (info->shadow_primary) { if (usage != CREATE_PIXMAP_USAGE_BACKING_PIXMAP) return fbCreatePixmap(screen, w, h, depth, usage); @@ -216,9 +218,15 @@ amdgpu_glamor_create_pixmap(ScreenPtr sc usage |= AMDGPU_CREATE_PIXMAP_LINEAR | AMDGPU_CREATE_PIXMAP_GTT; } else if (usage != CREATE_PIXMAP_USAGE_BACKING_PIXMAP) { - pixmap = glamor_create_pixmap(screen, w, h, depth, usage); - if (pixmap) - return pixmap; + if (w < scrn->virtualX || w > scrn->displayWidth || + h != scrn->virtualY || + format->bitsPerPixel != scrn->bitsPerPixel) { + pixmap = glamor_create_pixmap(screen, w, h, depth, usage); + if (pixmap) + return pixmap; + } else { + usage |= AMDGPU_CREATE_PIXMAP_SCANOUT; + } } } @@ -342,7 +350,7 @@ amdgpu_glamor_set_pixmap_bo(DrawablePtr static Bool -amdgpu_glamor_share_pixmap_backing(PixmapPtr pixmap, ScreenPtr slave, +amdgpu_glamor_share_pixmap_backing(PixmapPtr pixmap, ScreenPtr secondary, void **handle_p) { ScreenPtr screen = pixmap->drawable.pScreen; Index: driver/xf86-video-amdgpu/src/amdgpu_kms.c =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/src/amdgpu_kms.c,v retrieving revision 1.2 diff -u -p -r1.2 amdgpu_kms.c --- driver/xf86-video-amdgpu/src/amdgpu_kms.c 26 Oct 2019 09:36:38 -0000 1.2 +++ driver/xf86-video-amdgpu/src/amdgpu_kms.c 7 Jul 2021 13:42:19 -0000 @@ -283,6 +283,7 @@ static void AMDGPUFreeRec(ScrnInfoPtr pS amdgpu_unwrap_property_requests(pScrn); amdgpu_device_deinitialize(pAMDGPUEnt->pDev); amdgpu_kernel_close_fd(pAMDGPUEnt); + free(pAMDGPUEnt->busid); free(pPriv->ptr); pPriv->ptr = NULL; } @@ -519,8 +520,8 @@ amdgpu_sync_scanout_pixmaps(xf86CrtcPtr int scanout_id) { drmmode_crtc_private_ptr drmmode_crtc = xf86_crtc->driver_private; - DrawablePtr dst = &drmmode_crtc->scanout[scanout_id].pixmap->drawable; - DrawablePtr src = &drmmode_crtc->scanout[scanout_id ^ 1].pixmap->drawable; + DrawablePtr dst = &drmmode_crtc->scanout[scanout_id]->drawable; + DrawablePtr src = &drmmode_crtc->scanout[scanout_id ^ 1]->drawable; RegionPtr last_region = &drmmode_crtc->scanout_last_region; ScrnInfoPtr scrn = xf86_crtc->scrn; ScreenPtr pScreen = scrn->pScreen; @@ -603,8 +604,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 { @@ -612,7 +613,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); } @@ -629,8 +630,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); @@ -639,8 +640,8 @@ redisplay_dirty(PixmapDirtyUpdatePtr dir #endif amdgpu_glamor_flush(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); @@ -657,12 +658,12 @@ amdgpu_prime_scanout_update_abort(xf86Cr void amdgpu_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) { - ScreenPtr master_screen = amdgpu_dirty_master(dirty); + ScreenPtr primary_screen = amdgpu_dirty_primary(dirty); PixmapDirtyUpdatePtr ent; RegionPtr region; - xorg_list_for_each_entry(ent, &master_screen->pixmap_dirty_list, ent) { - if (!amdgpu_dirty_src_equals(dirty, ent->slave_dst)) + xorg_list_for_each_entry(ent, &primary_screen->pixmap_dirty_list, ent) { + if (!amdgpu_dirty_src_equals(dirty, ent->secondary_dst)) continue; region = dirty_region(ent); @@ -675,45 +676,45 @@ amdgpu_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 = amdgpu_dirty_master(dirty); + ScreenPtr primary_screen = amdgpu_dirty_primary(dirty); - return master_screen->SyncSharedPixmap != NULL; + return primary_screen->SyncSharedPixmap != NULL; } 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 != NULL; + return secondary_screen->SyncSharedPixmap != NULL; } static void call_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) { - ScreenPtr master_screen = amdgpu_dirty_master(dirty); + ScreenPtr primary_screen = amdgpu_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(amdgpu_dirty_master(dirty)); + ScrnInfoPtr primary_scrn = xf86ScreenToScrn(amdgpu_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 @@ -728,12 +729,12 @@ call_sync_shared_pixmap(PixmapDirtyUpdat static xf86CrtcPtr amdgpu_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; @@ -758,7 +759,7 @@ amdgpu_prime_scanout_do_update(xf86CrtcP if (amdgpu_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); @@ -771,7 +772,7 @@ amdgpu_prime_scanout_do_update(xf86CrtcP amdgpu_glamor_flush(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]; } redisplay_dirty(dirty, region); @@ -798,7 +799,7 @@ amdgpu_prime_scanout_update_handler(xf86 static void amdgpu_prime_scanout_update(PixmapDirtyUpdatePtr dirty) { - ScreenPtr screen = dirty->slave_dst->drawable.pScreen; + ScreenPtr screen = dirty->secondary_dst->drawable.pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); xf86CrtcPtr xf86_crtc = amdgpu_prime_dirty_to_crtc(dirty); @@ -810,7 +811,7 @@ amdgpu_prime_scanout_update(PixmapDirtyU drmmode_crtc = xf86_crtc->driver_private; if (drmmode_crtc->scanout_update_pending || - !drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap || + !drmmode_crtc->scanout[drmmode_crtc->scanout_id] || drmmode_crtc->dpms_mode != DPMSModeOn) return; @@ -862,7 +863,7 @@ amdgpu_prime_scanout_update(PixmapDirtyU static void amdgpu_prime_scanout_flip(PixmapDirtyUpdatePtr ent) { - ScreenPtr screen = ent->slave_dst->drawable.pScreen; + ScreenPtr screen = ent->secondary_dst->drawable.pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); xf86CrtcPtr crtc = amdgpu_prime_dirty_to_crtc(ent); @@ -877,14 +878,14 @@ amdgpu_prime_scanout_flip(PixmapDirtyUpd drmmode_crtc = crtc->driver_private; scanout_id = drmmode_crtc->scanout_id ^ 1; if (drmmode_crtc->scanout_update_pending || - !drmmode_crtc->scanout[scanout_id].pixmap || + !drmmode_crtc->scanout[scanout_id] || drmmode_crtc->dpms_mode != DPMSModeOn) return; if (!amdgpu_prime_scanout_do_update(crtc, scanout_id)) return; - fb = amdgpu_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap); + fb = amdgpu_pixmap_get_fb(drmmode_crtc->scanout[scanout_id]); if (!fb) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "Failed to get FB for PRIME flip.\n"); @@ -937,11 +938,11 @@ amdgpu_dirty_update(ScrnInfoPtr scrn) if (screen->isGPU) { PixmapDirtyUpdatePtr region_ent = ent; - if (master_has_sync_shared_pixmap(scrn, ent)) { - ScreenPtr master_screen = amdgpu_dirty_master(ent); + if (primary_has_sync_shared_pixmap(scrn, ent)) { + ScreenPtr primary_screen = amdgpu_dirty_primary(ent); - xorg_list_for_each_entry(region_ent, &master_screen->pixmap_dirty_list, ent) { - if (amdgpu_dirty_src_equals(ent, region_ent->slave_dst)) + xorg_list_for_each_entry(region_ent, &primary_screen->pixmap_dirty_list, ent) { + if (amdgpu_dirty_src_equals(ent, region_ent->secondary_dst)) break; } } @@ -965,7 +966,7 @@ amdgpu_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); @@ -975,6 +976,11 @@ amdgpu_dirty_update(ScrnInfoPtr scrn) } } +static void +amdgpuSourceValidate(DrawablePtr draw, int x, int y, int w, int h, + unsigned int subWindowMode) +{ +} Bool amdgpu_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id, @@ -987,11 +993,11 @@ amdgpu_scanout_do_update(xf86CrtcPtr xf8 DrawablePtr pDraw; if (!xf86_crtc->enabled || - !drmmode_crtc->scanout[scanout_id].pixmap || + !drmmode_crtc->scanout[scanout_id] || extents.x1 >= extents.x2 || extents.y1 >= extents.y2) return FALSE; - pDraw = &drmmode_crtc->scanout[scanout_id].pixmap->drawable; + pDraw = &drmmode_crtc->scanout[scanout_id]->drawable; if (!amdgpu_scanout_extents_intersect(xf86_crtc, &extents)) return FALSE; @@ -1031,7 +1037,7 @@ amdgpu_scanout_do_update(xf86CrtcPtr xf8 SetPicturePictFilter(src, xf86_crtc->filter, xf86_crtc->params, xf86_crtc->nparams); - pScreen->SourceValidate = NULL; + pScreen->SourceValidate = amdgpuSourceValidate; CompositePicture(PictOpSrc, src, NULL, dst, extents.x1, extents.y1, 0, 0, extents.x1, @@ -1192,7 +1198,7 @@ amdgpu_scanout_flip(ScreenPtr pScreen, A amdgpu_glamor_flush(scrn); RegionEmpty(region); - fb = amdgpu_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap); + fb = amdgpu_pixmap_get_fb(drmmode_crtc->scanout[scanout_id]); if (!fb) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "Failed to get FB for scanout flip.\n"); @@ -1225,8 +1231,7 @@ amdgpu_scanout_flip(ScreenPtr pScreen, A &drmmode_crtc->scanout_last_region); RegionEmpty(&drmmode_crtc->scanout_last_region); amdgpu_scanout_update(xf86_crtc); - drmmode_crtc_scanout_destroy(drmmode_crtc->drmmode, - &drmmode_crtc->scanout[scanout_id]); + drmmode_crtc_scanout_destroy(&drmmode_crtc->scanout[scanout_id]); drmmode_crtc->tear_free = FALSE; return; } @@ -1252,7 +1257,7 @@ static void AMDGPUBlockHandler_KMS(BLOCK (*pScreen->BlockHandler) (BLOCKHANDLER_ARGS); pScreen->BlockHandler = AMDGPUBlockHandler_KMS; - if (!xf86ScreenToScrn(amdgpu_master_screen(pScreen))->vtSema) + if (!xf86ScreenToScrn(amdgpu_primary_screen(pScreen))->vtSema) return; if (!pScreen->isGPU) @@ -1261,12 +1266,12 @@ static void AMDGPUBlockHandler_KMS(BLOCK xf86CrtcPtr crtc = xf86_config->crtc[c]; drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - if (drmmode_crtc->rotate.pixmap) + if (drmmode_crtc->rotate) continue; if (drmmode_crtc->tear_free) amdgpu_scanout_flip(pScreen, info, crtc); - else if (drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap) + else if (drmmode_crtc->scanout[drmmode_crtc->scanout_id]) amdgpu_scanout_update(crtc); } } @@ -1415,20 +1420,13 @@ static Bool AMDGPUPreInitChipType_KMS(Sc AMDGPUInfoPtr info = AMDGPUPTR(pScrn); AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); - info->Chipset = info->PciInfo->device_id; pScrn->chipset = (char*)amdgpu_get_marketing_name(pAMDGPUEnt->pDev); if (!pScrn->chipset) pScrn->chipset = "Unknown AMD Radeon GPU"; - if (info->Chipset < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Chipset \"%s\" is not recognized\n", - pScrn->chipset); - return FALSE; - } xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Chipset: \"%s\" (ChipID = 0x%04x)\n", - pScrn->chipset, info->Chipset); + pScrn->chipset, gpu_info->asic_id); info->family = gpu_info->family_id; @@ -1570,7 +1568,6 @@ Bool AMDGPUPreInit_KMS(ScrnInfoPtr pScrn xf86SetPrimInitDone(pScrn->entityList[0]); } - info->PciInfo = xf86GetPciInfoForEntity(info->pEnt->index); pScrn->monitor = pScrn->confScreen->monitor; if (!AMDGPUPreInitVisual(pScrn)) @@ -1853,7 +1850,7 @@ CARD32 cleanup_black_fb(OsTimerPtr timer xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); int c; - if (xf86ScreenToScrn(amdgpu_master_screen(screen))->vtSema) + if (xf86ScreenToScrn(amdgpu_primary_screen(screen))->vtSema) return 0; /* Unreference the all-black FB created by AMDGPULeaveVT_KMS. After @@ -2209,6 +2206,7 @@ Bool AMDGPUEnterVT_KMS(ScrnInfoPtr pScrn struct amdgpu_buffer *front_buffer = amdgpu_alloc_pixmap_bo(pScrn, pScrn->virtualX, pScrn->virtualY, pScrn->depth, + AMDGPU_CREATE_PIXMAP_SCANOUT | AMDGPU_CREATE_PIXMAP_LINEAR, pScrn->bitsPerPixel, &pitch); @@ -2270,7 +2268,6 @@ void AMDGPULeaveVT_KMS(ScrnInfoPtr pScrn if (!info->shadow_fb) { AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - struct drmmode_scanout black_scanout = { .pixmap = NULL, .bo = NULL }; xf86CrtcPtr crtc; drmmode_crtc_private_ptr drmmode_crtc; unsigned w = 0, h = 0; @@ -2296,11 +2293,15 @@ void AMDGPULeaveVT_KMS(ScrnInfoPtr pScrn /* Make all active CRTCs scan out from an all-black framebuffer */ if (w > 0 && h > 0) { - if (drmmode_crtc_scanout_create(crtc, &black_scanout, w, h)) { + PixmapPtr black_scanout = + pScreen->CreatePixmap(pScreen, w, h, pScrn->depth, + AMDGPU_CREATE_PIXMAP_SCANOUT); + + if (black_scanout) { struct drmmode_fb *black_fb = - amdgpu_pixmap_get_fb(black_scanout.pixmap); + amdgpu_pixmap_get_fb(black_scanout); - amdgpu_pixmap_clear(black_scanout.pixmap); + amdgpu_pixmap_clear(black_scanout); amdgpu_glamor_finish(pScrn); for (i = 0; i < xf86_config->num_crtc; i++) { @@ -2319,20 +2320,21 @@ void AMDGPULeaveVT_KMS(ScrnInfoPtr pScrn } if (pScrn->is_gpu) { - if (drmmode_crtc->scanout[0].pixmap) - pixmap_unref_fb(drmmode_crtc->scanout[0].pixmap); - if (drmmode_crtc->scanout[1].pixmap) - pixmap_unref_fb(drmmode_crtc->scanout[1].pixmap); + if (drmmode_crtc->scanout[0]) + pixmap_unref_fb(drmmode_crtc->scanout[0]); + if (drmmode_crtc->scanout[1]) + pixmap_unref_fb(drmmode_crtc->scanout[1]); } else { drmmode_crtc_scanout_free(crtc); } } } + + pScreen->DestroyPixmap(black_scanout); } } xf86RotateFreeShadow(pScrn); - drmmode_crtc_scanout_destroy(&info->drmmode, &black_scanout); /* Unreference FBs of all pixmaps. After this, the only FB remaining * should be the all-black one being scanned out by active CRTCs @@ -2415,12 +2417,12 @@ static Bool amdgpu_setup_kernel_mem(Scre if (!info->front_buffer) { int pitch; - int hint = 0; + int hint = AMDGPU_CREATE_PIXMAP_SCANOUT; if (info->shadow_primary) - hint = AMDGPU_CREATE_PIXMAP_LINEAR | AMDGPU_CREATE_PIXMAP_GTT; + hint |= AMDGPU_CREATE_PIXMAP_LINEAR | AMDGPU_CREATE_PIXMAP_GTT; else if (!info->use_glamor) - hint = AMDGPU_CREATE_PIXMAP_LINEAR; + hint |= AMDGPU_CREATE_PIXMAP_LINEAR; info->front_buffer = amdgpu_alloc_pixmap_bo(pScrn, pScrn->virtualX, Index: driver/xf86-video-amdgpu/src/amdgpu_probe.c =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/src/amdgpu_probe.c,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 amdgpu_probe.c --- driver/xf86-video-amdgpu/src/amdgpu_probe.c 16 Apr 2019 01:49:39 -0000 1.1.1.1 +++ driver/xf86-video-amdgpu/src/amdgpu_probe.c 8 Jul 2021 01:24:40 -0000 @@ -33,6 +33,8 @@ #include <errno.h> #include <string.h> #include <stdlib.h> +#include <sys/stat.h> +#include <fcntl.h> /* * Authors: @@ -48,12 +50,17 @@ #include "xf86.h" #include "xf86drmMode.h" -#include "dri.h" #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #include <xf86_OSproc.h> #endif +#ifdef X_PRIVSEP +extern int priv_open_device(const char *); +#else +#define priv_open_device(n) open(n,O_RDWR|O_CLOEXEC) +#endif + #include <xf86platformBus.h> _X_EXPORT int gAMDGPUEntityIndex = -1; @@ -75,36 +82,34 @@ static void AMDGPUIdentify(int flags) xf86PrintChipsets(AMDGPU_NAME, "Driver for AMD Radeon", AMDGPUAny); } -static char *amdgpu_bus_id(ScrnInfoPtr pScrn, struct pci_device *dev) +static Bool amdgpu_device_matches(const drmDevicePtr device, + const struct pci_device *dev) { - char *busid; - - XNFasprintf(&busid, "pci:%04x:%02x:%02x.%d", - dev->domain, dev->bus, dev->dev, dev->func); - - if (!busid) - xf86DrvMsgVerb(pScrn->scrnIndex, X_ERROR, 0, - "AMDGPU: Failed to generate bus ID string\n"); - - return busid; + return (device->bustype == DRM_BUS_PCI && + device->businfo.pci->domain == dev->domain && + device->businfo.pci->bus == dev->bus && + device->businfo.pci->dev == dev->dev && + device->businfo.pci->func == dev->func); } -static Bool amdgpu_kernel_mode_enabled(ScrnInfoPtr pScrn, char *busIdString) +static Bool amdgpu_kernel_mode_enabled(ScrnInfoPtr pScrn) { +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); + const char *busIdString = pAMDGPUEnt->busid; int ret = drmCheckModesettingSupported(busIdString); -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) if (ret) { if (xf86LoadKernelModule("amdgpukms")) ret = drmCheckModesettingSupported(busIdString); } -#endif if (ret) { xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, "[KMS] drm report modesetting isn't supported.\n"); return FALSE; } +#endif xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, "[KMS] Kernel modesetting enabled.\n"); return TRUE; @@ -112,42 +117,66 @@ static Bool amdgpu_kernel_mode_enabled(S static int amdgpu_kernel_open_fd(ScrnInfoPtr pScrn, struct pci_device *pci_dev, - struct xf86_platform_device *platform_dev) + struct xf86_platform_device *platform_dev, + AMDGPUEntPtr pAMDGPUEnt) { +#define MAX_DRM_DEVICES 64 + drmDevicePtr devices[MAX_DRM_DEVICES]; struct pci_device *dev; - char *busid; - int fd; + const char *path; + int fd = -1, i, ret; + + if (platform_dev) + dev = platform_dev->pdev; + else + dev = pci_dev; + + XNFasprintf(&pAMDGPUEnt->busid, "pci:%04x:%02x:%02x.%u", + dev->domain, dev->bus, dev->dev, dev->func); -#ifdef ODEV_ATTRIB_FD if (platform_dev) { +#ifdef ODEV_ATTRIB_FD fd = xf86_get_platform_device_int_attrib(platform_dev, ODEV_ATTRIB_FD, -1); if (fd != -1) return fd; - } #endif - if (platform_dev) - dev = platform_dev->pdev; - else - dev = pci_dev; +#ifdef ODEV_ATTRIB_PATH + path = xf86_get_platform_device_attrib(platform_dev, + ODEV_ATTRIB_PATH); - busid = amdgpu_bus_id(pScrn, dev); - if (!busid) + fd = priv_open_device(path); + if (fd != -1) + return fd; +#endif + } + + if (!amdgpu_kernel_mode_enabled(pScrn)) return -1; - if (!amdgpu_kernel_mode_enabled(pScrn, busid)) { - free(busid); + ret = drmGetDevices2(0, devices, ARRAY_SIZE(devices)); + if (ret == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] Failed to retrieve DRM devices information.\n"); return -1; } + for (i = 0; i < ret; i++) { + if (amdgpu_device_matches(devices[i], dev) && + devices[i]->available_nodes & (1 << DRM_NODE_PRIMARY)) { + path = devices[i]->nodes[DRM_NODE_PRIMARY]; + fd = priv_open_device(path); + break; + } + } + drmFreeDevices(devices, ret); - fd = drmOpen(NULL, busid); if (fd == -1) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] Failed to open DRM device for %s: %s\n", - busid, strerror(errno)); - free(busid); + pAMDGPUEnt->busid, strerror(errno)); return fd; +#undef MAX_DRM_DEVICES } void amdgpu_kernel_close_fd(AMDGPUEntPtr pAMDGPUEnt) @@ -156,32 +185,31 @@ void amdgpu_kernel_close_fd(AMDGPUEntPtr if (!(pAMDGPUEnt->platform_dev && pAMDGPUEnt->platform_dev->flags & XF86_PDEV_SERVER_FD)) #endif - drmClose(pAMDGPUEnt->fd); + close(pAMDGPUEnt->fd); pAMDGPUEnt->fd = -1; } -static Bool amdgpu_open_drm_master(ScrnInfoPtr pScrn, AMDGPUEntPtr pAMDGPUEnt, - struct pci_device *pci_dev) +/* Pull a local version of the helper. It's available since 2.4.98 yet + * it may be too new for some distributions. + */ +static int local_drmIsMaster(int fd) { - drmSetVersion sv; - int err; + return drmAuthMagic(fd, 0) != -EACCES; +} - pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, pci_dev, NULL); +static Bool amdgpu_open_drm_master(ScrnInfoPtr pScrn, + struct pci_device *pci_dev, + struct xf86_platform_device *platform_dev, + AMDGPUEntPtr pAMDGPUEnt) +{ + pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, pci_dev, platform_dev, pAMDGPUEnt); if (pAMDGPUEnt->fd == -1) return FALSE; - /* 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) - */ - sv.drm_di_major = 1; - sv.drm_di_minor = 1; - sv.drm_dd_major = -1; - sv.drm_dd_minor = -1; - err = drmSetInterfaceVersion(pAMDGPUEnt->fd, &sv); - if (err != 0) { + /* Check that what we opened is a master or a master-capable FD */ + if (!local_drmIsMaster(pAMDGPUEnt->fd)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] failed to set drm interface version.\n"); + "[drm] device is not DRM master.\n"); amdgpu_kernel_close_fd(pAMDGPUEnt); return FALSE; } @@ -189,16 +217,43 @@ static Bool amdgpu_open_drm_master(ScrnI return TRUE; } -static Bool amdgpu_get_scrninfo(int entity_num, struct pci_device *pci_dev) +static Bool amdgpu_device_setup(ScrnInfoPtr pScrn, + struct pci_device *pci_dev, + struct xf86_platform_device *platform_dev, + AMDGPUEntPtr pAMDGPUEnt) +{ + uint32_t major_version; + uint32_t minor_version; + + pAMDGPUEnt->platform_dev = platform_dev; + if (!amdgpu_open_drm_master(pScrn, pci_dev, platform_dev, + pAMDGPUEnt)) + return FALSE; + + if (amdgpu_device_initialize(pAMDGPUEnt->fd, + &major_version, + &minor_version, + &pAMDGPUEnt->pDev)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "amdgpu_device_initialize failed\n"); + goto error_amdgpu; + } + + return TRUE; + +error_amdgpu: + amdgpu_kernel_close_fd(pAMDGPUEnt); + return FALSE; +} + +static Bool +amdgpu_probe(ScrnInfoPtr pScrn, int entity_num, + struct pci_device *pci_dev, struct xf86_platform_device *dev) { - ScrnInfoPtr pScrn = NULL; EntityInfoPtr pEnt = NULL; DevUnion *pPriv; AMDGPUEntPtr pAMDGPUEnt; - pScrn = xf86ConfigPciEntity(pScrn, 0, entity_num, NULL, - NULL, NULL, NULL, NULL, NULL); - if (!pScrn) return FALSE; @@ -206,7 +261,6 @@ static Bool amdgpu_get_scrninfo(int enti pScrn->driverName = AMDGPU_DRIVER_NAME; pScrn->name = AMDGPU_NAME; pScrn->Probe = NULL; - pScrn->PreInit = AMDGPUPreInit_KMS; pScrn->ScreenInit = AMDGPUScreenInit_KMS; pScrn->SwitchMode = AMDGPUSwitchMode_KMS; @@ -229,27 +283,16 @@ static Bool amdgpu_get_scrninfo(int enti pPriv = xf86GetEntityPrivate(pEnt->index, gAMDGPUEntityIndex); if (!pPriv->ptr) { - uint32_t major_version; - uint32_t minor_version; - pPriv->ptr = xnfcalloc(sizeof(AMDGPUEntRec), 1); if (!pPriv->ptr) goto error; pAMDGPUEnt = pPriv->ptr; - if (!amdgpu_open_drm_master(pScrn, pAMDGPUEnt, pci_dev)) + if (!amdgpu_device_setup(pScrn, pci_dev, dev, pAMDGPUEnt)) goto error; pAMDGPUEnt->fd_ref = 1; - if (amdgpu_device_initialize(pAMDGPUEnt->fd, - &major_version, - &minor_version, - &pAMDGPUEnt->pDev)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "amdgpu_device_initialize failed\n"); - goto error_amdgpu; - } } else { pAMDGPUEnt = pPriv->ptr; @@ -271,8 +314,6 @@ static Bool amdgpu_get_scrninfo(int enti return TRUE; -error_amdgpu: - amdgpu_kernel_close_fd(pAMDGPUEnt); error: free(pEnt); return FALSE; @@ -282,7 +323,10 @@ static Bool amdgpu_pci_probe(DriverPtr pDriver, int entity_num, struct pci_device *device, intptr_t match_data) { - return amdgpu_get_scrninfo(entity_num, device); + ScrnInfoPtr pScrn = xf86ConfigPciEntity(NULL, 0, entity_num, NULL, + NULL, NULL, NULL, NULL, NULL); + + return amdgpu_probe(pScrn, entity_num, device, NULL); } static Bool AMDGPUDriverFunc(ScrnInfoPtr scrn, xorgDriverFuncOp op, void *data) @@ -311,9 +355,6 @@ amdgpu_platform_probe(DriverPtr pDriver, { ScrnInfoPtr pScrn; int scr_flags = 0; - EntityInfoPtr pEnt = NULL; - DevUnion *pPriv; - AMDGPUEntPtr pAMDGPUEnt; if (!dev->pdev) return FALSE; @@ -326,78 +367,7 @@ amdgpu_platform_probe(DriverPtr pDriver, xf86SetEntityShared(entity_num); xf86AddEntityToScreen(pScrn, entity_num); - pScrn->driverVersion = AMDGPU_VERSION_CURRENT; - pScrn->driverName = AMDGPU_DRIVER_NAME; - pScrn->name = AMDGPU_NAME; - pScrn->Probe = NULL; - pScrn->PreInit = AMDGPUPreInit_KMS; - pScrn->ScreenInit = AMDGPUScreenInit_KMS; - pScrn->SwitchMode = AMDGPUSwitchMode_KMS; - pScrn->AdjustFrame = AMDGPUAdjustFrame_KMS; - pScrn->EnterVT = AMDGPUEnterVT_KMS; - pScrn->LeaveVT = AMDGPULeaveVT_KMS; - pScrn->FreeScreen = AMDGPUFreeScreen_KMS; - pScrn->ValidMode = AMDGPUValidMode; - - pEnt = xf86GetEntityInfo(entity_num); - - /* Create a AMDGPUEntity for all chips, even with old single head - * Radeon, need to use pAMDGPUEnt for new monitor detection routines. - */ - xf86SetEntitySharable(entity_num); - - if (gAMDGPUEntityIndex == -1) - gAMDGPUEntityIndex = xf86AllocateEntityPrivateIndex(); - - pPriv = xf86GetEntityPrivate(pEnt->index, gAMDGPUEntityIndex); - - if (!pPriv->ptr) { - uint32_t major_version; - uint32_t minor_version; - - pPriv->ptr = xnfcalloc(sizeof(AMDGPUEntRec), 1); - pAMDGPUEnt = pPriv->ptr; - pAMDGPUEnt->platform_dev = dev; - pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, NULL, dev); - if (pAMDGPUEnt->fd < 0) - goto error; - - pAMDGPUEnt->fd_ref = 1; - - if (amdgpu_device_initialize(pAMDGPUEnt->fd, - &major_version, - &minor_version, - &pAMDGPUEnt->pDev)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "amdgpu_device_initialize failed\n"); - goto error_amdgpu; - } - } else { - pAMDGPUEnt = pPriv->ptr; - - if (pAMDGPUEnt->fd_ref == ARRAY_SIZE(pAMDGPUEnt->scrn)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Only up to %u Zaphod instances supported\n", - (unsigned)ARRAY_SIZE(pAMDGPUEnt->scrn)); - goto error; - } - - pAMDGPUEnt->fd_ref++; - } - - xf86SetEntityInstanceForScreen(pScrn, pEnt->index, - xf86GetNumEntityInstances(pEnt-> - index) - - 1); - free(pEnt); - - return TRUE; - -error_amdgpu: - amdgpu_kernel_close_fd(pAMDGPUEnt); -error: - free(pEnt); - return FALSE; + return amdgpu_probe(pScrn, entity_num, NULL, dev); } #endif Index: driver/xf86-video-amdgpu/src/amdgpu_probe.h =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/src/amdgpu_probe.h,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 amdgpu_probe.h --- driver/xf86-video-amdgpu/src/amdgpu_probe.h 16 Apr 2019 01:49:40 -0000 1.1.1.1 +++ driver/xf86-video-amdgpu/src/amdgpu_probe.h 7 Jul 2021 13:42:25 -0000 @@ -69,6 +69,7 @@ typedef struct { ScrnInfoPtr scrn[6]; struct xf86_platform_device *platform_dev; char *render_node; + char *busid; } AMDGPUEntRec, *AMDGPUEntPtr; extern void amdgpu_kernel_close_fd(AMDGPUEntPtr pAMDGPUEnt); Index: driver/xf86-video-amdgpu/src/compat-api.h =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/src/compat-api.h,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 compat-api.h --- driver/xf86-video-amdgpu/src/compat-api.h 16 Apr 2019 01:49:36 -0000 1.1.1.1 +++ driver/xf86-video-amdgpu/src/compat-api.h 7 Jul 2021 13:42:25 -0000 @@ -38,4 +38,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 Index: driver/xf86-video-amdgpu/src/drmmode_display.c =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/src/drmmode_display.c,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 drmmode_display.c --- driver/xf86-video-amdgpu/src/drmmode_display.c 16 Apr 2019 01:49:44 -0000 1.1.1.1 +++ driver/xf86-video-amdgpu/src/drmmode_display.c 7 Jul 2021 13:42:25 -0000 @@ -40,15 +40,13 @@ #include "mipointrst.h" #include "xf86cmap.h" #include "xf86Priv.h" -#include "sarea.h" +#include <xf86drm.h> #include "drmmode_display.h" #include "amdgpu_bo_helper.h" #include "amdgpu_glamor.h" #include "amdgpu_pixmap.h" -#include <dri.h> - /* DPMS */ #ifdef HAVE_XEXTPROTO_71 #include <X11/extensions/dpmsconst.h> @@ -97,42 +95,6 @@ AMDGPUZaphodStringMatches(ScrnInfoPtr pS } -static PixmapPtr drmmode_create_bo_pixmap(ScrnInfoPtr pScrn, - int width, int height, - int depth, int bpp, - int pitch, - struct amdgpu_buffer *bo) -{ - ScreenPtr pScreen = pScrn->pScreen; - PixmapPtr pixmap; - - pixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, depth, - AMDGPU_CREATE_PIXMAP_SCANOUT); - if (!pixmap) - return NULL; - - if (!(*pScreen->ModifyPixmapHeader) (pixmap, width, height, - depth, bpp, pitch, NULL)) - goto fail; - - if (!amdgpu_glamor_create_textured_pixmap(pixmap, bo)) - goto fail; - - if (amdgpu_set_pixmap_bo(pixmap, bo)) - return pixmap; - -fail: - pScreen->DestroyPixmap(pixmap); - return NULL; -} - -static void drmmode_destroy_bo_pixmap(PixmapPtr pixmap) -{ - ScreenPtr pScreen = pixmap->drawable.pScreen; - - (*pScreen->DestroyPixmap) (pixmap); -} - static void drmmode_ConvertFromKMode(ScrnInfoPtr scrn, drmModeModeInfo * kmode, DisplayModePtr mode) @@ -505,22 +467,6 @@ void drmmode_copy_fb(ScrnInfoPtr pScrn, } void -drmmode_crtc_scanout_destroy(drmmode_ptr drmmode, - struct drmmode_scanout *scanout) -{ - - if (scanout->pixmap) { - drmmode_destroy_bo_pixmap(scanout->pixmap); - scanout->pixmap = NULL; - } - - if (scanout->bo) { - amdgpu_bo_unref(&scanout->bo); - scanout->bo = NULL; - } -} - -void drmmode_crtc_scanout_free(xf86CrtcPtr crtc) { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; @@ -532,60 +478,43 @@ drmmode_crtc_scanout_free(xf86CrtcPtr cr amdgpu_drm_queue_handle_deferred(crtc); } - drmmode_crtc_scanout_destroy(drmmode_crtc->drmmode, - &drmmode_crtc->scanout[0]); - drmmode_crtc_scanout_destroy(drmmode_crtc->drmmode, - &drmmode_crtc->scanout[1]); + drmmode_crtc_scanout_destroy(&drmmode_crtc->scanout[0]); + drmmode_crtc_scanout_destroy(&drmmode_crtc->scanout[1]); if (drmmode_crtc->scanout_damage) DamageDestroy(drmmode_crtc->scanout_damage); } -PixmapPtr -drmmode_crtc_scanout_create(xf86CrtcPtr crtc, struct drmmode_scanout *scanout, +static Bool +drmmode_crtc_scanout_create(xf86CrtcPtr crtc, PixmapPtr *scanout, int width, int height) { ScrnInfoPtr pScrn = crtc->scrn; - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - int pitch; + ScreenPtr screen = pScrn->pScreen; - if (scanout->pixmap) { - if (scanout->width == width && scanout->height == height) - return scanout->pixmap; + if (*scanout) { + if ((*scanout)->drawable.width == width && + (*scanout)->drawable.height == height) + return TRUE; - drmmode_crtc_scanout_destroy(drmmode, scanout); + drmmode_crtc_scanout_destroy(scanout); } - scanout->bo = amdgpu_alloc_pixmap_bo(pScrn, width, height, - pScrn->depth, 0, - pScrn->bitsPerPixel, &pitch); - if (!scanout->bo) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate scanout buffer memory\n"); - return NULL; - } - - scanout->pixmap = drmmode_create_bo_pixmap(pScrn, - width, height, - pScrn->depth, - pScrn->bitsPerPixel, - pitch, scanout->bo); - if (!scanout->pixmap) { + *scanout = screen->CreatePixmap(screen, width, height, pScrn->depth, + AMDGPU_CREATE_PIXMAP_SCANOUT); + if (!*scanout) { ErrorF("failed to create CRTC scanout pixmap\n"); goto error; } - if (amdgpu_pixmap_get_fb(scanout->pixmap)) { - scanout->width = width; - scanout->height = height; - } else { + if (!amdgpu_pixmap_get_fb(*scanout)) { ErrorF("failed to create CRTC scanout FB\n"); error: - drmmode_crtc_scanout_destroy(drmmode, scanout); + drmmode_crtc_scanout_destroy(scanout); + return FALSE; } - return scanout->pixmap; + return TRUE; } static void @@ -705,8 +634,7 @@ drmmode_crtc_prime_scanout_update(xf86Cr ScreenPtr screen = scrn->pScreen; drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - if (drmmode_crtc->tear_free && - !drmmode_crtc->scanout[1].pixmap) { + if (drmmode_crtc->tear_free && !drmmode_crtc->scanout[1]) { RegionPtr region; BoxPtr box; @@ -729,8 +657,8 @@ drmmode_crtc_prime_scanout_update(xf86Cr xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list, ent) { if (amdgpu_dirty_src_equals(dirty, drmmode_crtc->prime_scanout_pixmap)) { - dirty->slave_dst = - drmmode_crtc->scanout[scanout_id].pixmap; + dirty->secondary_dst = + drmmode_crtc->scanout[scanout_id]; break; } } @@ -738,9 +666,9 @@ drmmode_crtc_prime_scanout_update(xf86Cr if (!drmmode_crtc->tear_free) { GCPtr gc = GetScratchGC(scrn->depth, screen); - ValidateGC(&drmmode_crtc->scanout[0].pixmap->drawable, gc); - gc->ops->CopyArea(&drmmode_crtc->scanout[1].pixmap->drawable, - &drmmode_crtc->scanout[0].pixmap->drawable, + ValidateGC(&drmmode_crtc->scanout[0]->drawable, gc); + gc->ops->CopyArea(&drmmode_crtc->scanout[1]->drawable, + &drmmode_crtc->scanout[0]->drawable, gc, 0, 0, mode->HDisplay, mode->VDisplay, 0, 0); FreeScratchGC(gc); @@ -748,7 +676,7 @@ drmmode_crtc_prime_scanout_update(xf86Cr } } - *fb = amdgpu_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap); + *fb = amdgpu_pixmap_get_fb(drmmode_crtc->scanout[scanout_id]); *x = *y = 0; drmmode_crtc->scanout_id = scanout_id; } @@ -771,9 +699,9 @@ drmmode_crtc_scanout_update(xf86CrtcPtr mode->HDisplay, mode->VDisplay); } - if (drmmode_crtc->scanout[scanout_id].pixmap && + if (drmmode_crtc->scanout[scanout_id] && (!drmmode_crtc->tear_free || - drmmode_crtc->scanout[scanout_id ^ 1].pixmap)) { + drmmode_crtc->scanout[scanout_id ^ 1])) { BoxRec extents = { .x1 = 0, .y1 = 0, .x2 = scrn->virtualX, .y2 = scrn->virtualY }; @@ -787,7 +715,7 @@ drmmode_crtc_scanout_update(xf86CrtcPtr drmmode_crtc->scanout_damage); } - *fb = amdgpu_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap); + *fb = amdgpu_pixmap_get_fb(drmmode_crtc->scanout[scanout_id]); *x = *y = 0; if (amdgpu_scanout_do_update(crtc, scanout_id, @@ -1370,7 +1298,6 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; Bool handle_deferred = FALSE; unsigned scanout_id = 0; - drmmode_ptr drmmode = drmmode_crtc->drmmode; int saved_x, saved_y; Rotation saved_rotation; DisplayModeRec saved_mode; @@ -1407,8 +1334,8 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, if (drmmode_crtc->prime_scanout_pixmap) { drmmode_crtc_prime_scanout_update(crtc, mode, scanout_id, &fb, &x, &y); - } else if (drmmode_crtc->rotate.pixmap) { - fb = amdgpu_pixmap_get_fb(drmmode_crtc->rotate.pixmap); + } else if (drmmode_crtc->rotate) { + fb = amdgpu_pixmap_get_fb(drmmode_crtc->rotate); x = y = 0; } else if (!pScreen->isGPU && @@ -1489,13 +1416,11 @@ done: } else { crtc->active = TRUE; - if (drmmode_crtc->scanout[scanout_id].pixmap && - fb != amdgpu_pixmap_get_fb(drmmode_crtc-> - scanout[scanout_id].pixmap)) { + if (drmmode_crtc->scanout[scanout_id] && + fb != amdgpu_pixmap_get_fb(drmmode_crtc->scanout[scanout_id])) { drmmode_crtc_scanout_free(crtc); } else if (!drmmode_crtc->tear_free) { - drmmode_crtc_scanout_destroy(drmmode, - &drmmode_crtc->scanout[1]); + drmmode_crtc_scanout_destroy(&drmmode_crtc->scanout[1]); } } @@ -1784,7 +1709,7 @@ static void drmmode_show_cursor(xf86Crtc arg.hot_y = yhot; ret = drmIoctl(pAMDGPUEnt->fd, DRM_IOCTL_MODE_CURSOR2, &arg); - if (ret == -EINVAL) + if (ret == -1 && errno == EINVAL) use_set_cursor2 = FALSE; else return; @@ -1819,7 +1744,7 @@ drmmode_crtc_shadow_create(xf86CrtcPtr c height); } - return drmmode_crtc->rotate.pixmap; + return drmmode_crtc->rotate; } static void @@ -1827,9 +1752,8 @@ drmmode_crtc_shadow_destroy(xf86CrtcPtr void *data) { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - drmmode_crtc_scanout_destroy(drmmode, &drmmode_crtc->rotate); + drmmode_crtc_scanout_destroy(&drmmode_crtc->rotate); } static void @@ -1865,7 +1789,7 @@ static Bool drmmode_set_scanout_pixmap(x xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list, ent) { if (amdgpu_dirty_src_equals(dirty, drmmode_crtc->prime_scanout_pixmap)) { - PixmapStopDirtyTracking(dirty->src, dirty->slave_dst); + PixmapStopDirtyTracking(dirty->src, dirty->secondary_dst); break; } } @@ -1893,16 +1817,16 @@ static Bool drmmode_set_scanout_pixmap(x #ifdef HAS_DIRTYTRACKING_DRAWABLE_SRC PixmapStartDirtyTracking(&ppix->drawable, - drmmode_crtc->scanout[scanout_id].pixmap, + drmmode_crtc->scanout[scanout_id], 0, 0, 0, 0, RR_Rotate_0); #elif defined(HAS_DIRTYTRACKING_ROTATION) - PixmapStartDirtyTracking(ppix, drmmode_crtc->scanout[scanout_id].pixmap, + PixmapStartDirtyTracking(ppix, drmmode_crtc->scanout[scanout_id], 0, 0, 0, 0, RR_Rotate_0); #elif defined(HAS_DIRTYTRACKING2) - PixmapStartDirtyTracking2(ppix, drmmode_crtc->scanout[scanout_id].pixmap, + PixmapStartDirtyTracking2(ppix, drmmode_crtc->scanout[scanout_id], 0, 0, 0, 0); #else - PixmapStartDirtyTracking(ppix, drmmode_crtc->scanout[scanout_id].pixmap, 0, 0); + PixmapStartDirtyTracking(ppix, drmmode_crtc->scanout[scanout_id], 0, 0); #endif return TRUE; } @@ -2975,8 +2899,8 @@ static Bool drmmode_xf86crtc_resize(Scrn int i, pitch, old_width, old_height, old_pitch; int cpp = info->pixel_bytes; PixmapPtr ppix = screen->GetScreenPixmap(screen); + int hint = AMDGPU_CREATE_PIXMAP_SCANOUT; void *fb_shadow; - int hint = 0; if (scrn->virtualX == width && scrn->virtualY == height) return TRUE; @@ -2990,9 +2914,9 @@ static Bool drmmode_xf86crtc_resize(Scrn } if (info->shadow_primary) - hint = AMDGPU_CREATE_PIXMAP_LINEAR | AMDGPU_CREATE_PIXMAP_GTT; + hint |= AMDGPU_CREATE_PIXMAP_LINEAR | AMDGPU_CREATE_PIXMAP_GTT; else if (!info->use_glamor) - hint = AMDGPU_CREATE_PIXMAP_LINEAR; + hint |= AMDGPU_CREATE_PIXMAP_LINEAR; xf86DrvMsg(scrn->scrnIndex, X_INFO, "Allocate new frame buffer %dx%d\n", width, height); @@ -3432,7 +3356,7 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, unsigned int crtcs_needed = 0; unsigned int crtcs_got = 0; drmModeResPtr mode_res; - char *bus_id_string, *provider_name; + char *provider_name; xf86CrtcConfigInit(pScrn, &drmmode_xf86crtc_config_funcs); @@ -3495,9 +3419,7 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, /* workout clones */ drmmode_clones_init(pScrn, drmmode, mode_res); - bus_id_string = DRICreatePCIBusID(info->PciInfo); - XNFasprintf(&provider_name, "%s @ %s", pScrn->chipset, bus_id_string); - free(bus_id_string); + XNFasprintf(&provider_name, "%s @ %s", pScrn->chipset, pAMDGPUEnt->busid); xf86ProviderSetup(pScrn, NULL, provider_name); free(provider_name); @@ -4127,7 +4049,7 @@ Bool amdgpu_do_pageflip(ScrnInfoPtr scrn } drmmode_fb_reference(pAMDGPUEnt->fd, &flipdata->fb[crtc_id], - amdgpu_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap)); + amdgpu_pixmap_get_fb(drmmode_crtc->scanout[scanout_id])); if (!flipdata->fb[crtc_id]) { ErrorF("Failed to get FB for TearFree flip\n"); goto error; Index: driver/xf86-video-amdgpu/src/drmmode_display.h =================================================================== RCS file: /cvs/xenocara/driver/xf86-video-amdgpu/src/drmmode_display.h,v retrieving revision 1.2 diff -u -p -r1.2 drmmode_display.h --- driver/xf86-video-amdgpu/src/drmmode_display.h 18 Jan 2021 01:31:19 -0000 1.2 +++ driver/xf86-video-amdgpu/src/drmmode_display.h 7 Jul 2021 13:42:25 -0000 @@ -96,12 +96,6 @@ enum drmmode_scanout_status { DRMMODE_SCANOUT_VBLANK_FAILED = 1u << 1, }; -struct drmmode_scanout { - struct amdgpu_buffer *bo; - PixmapPtr pixmap; - int width, height; -}; - typedef struct { drmmode_ptr drmmode; drmModeCrtcPtr mode_crtc; @@ -115,8 +109,8 @@ typedef struct { unsigned cursor_id; struct amdgpu_buffer *cursor_buffer[2]; - struct drmmode_scanout rotate; - struct drmmode_scanout scanout[2]; + PixmapPtr rotate; + PixmapPtr scanout[2]; DamagePtr scanout_damage; Bool ignore_damage; RegionRec scanout_last_region; @@ -202,9 +196,9 @@ drmmode_crtc_can_flip(xf86CrtcPtr crtc) return crtc->enabled && drmmode_crtc->dpms_mode == DPMSModeOn && - !drmmode_crtc->rotate.bo && + !drmmode_crtc->rotate && (drmmode_crtc->tear_free || - !drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo); + !drmmode_crtc->scanout[drmmode_crtc->scanout_id]); } @@ -240,6 +234,17 @@ drmmode_fb_reference_loc(int drm_fd, str drmmode_fb_reference_loc(fd, old, new, __func__, __LINE__) +static inline void +drmmode_crtc_scanout_destroy(PixmapPtr *scanout) +{ + if (!*scanout) + return; + + (*scanout)->drawable.pScreen->DestroyPixmap(*scanout); + (*scanout) = NULL; +} + + extern int drmmode_page_flip_target_absolute(AMDGPUEntPtr pAMDGPUEnt, drmmode_crtc_private_ptr drmmode_crtc, int fb_id, uint32_t flags, @@ -259,12 +264,7 @@ extern Bool drmmode_set_desired_modes(Sc extern void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode); extern Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn); -extern void drmmode_crtc_scanout_destroy(drmmode_ptr drmmode, - struct drmmode_scanout *scanout); void drmmode_crtc_scanout_free(xf86CrtcPtr crtc); -PixmapPtr drmmode_crtc_scanout_create(xf86CrtcPtr crtc, - struct drmmode_scanout *scanout, - int width, int height); extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode); extern void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode);