Update to xf86-video-amdgpu 23.0.0. Tested by op@ and jsg@

pull/1/head
matthieu 2023-03-01 20:21:10 +00:00
parent 8af6982775
commit f20d5d564b
12 changed files with 394 additions and 140 deletions

View File

@ -1,3 +1,170 @@
commit 7025aefcdf9673665588cf291c5d71beb39cce89
Author: Shashank Sharma <shashank.sharma@amd.com>
Date: Wed Feb 22 18:00:23 2023 +0100
Bump version for the 23.0.0 release
This release includes some bug fixes.
Signed-off-by: Shashank Sharma <shashank.sharma@amd.com>
commit 6ee320917093ad0f7d68e516d3224d3c04ca13ee
Author: Shashank Sharma <shashank.sharma@amd.com>
Date: Mon Nov 28 13:08:36 2022 +0100
config: Add hotplug driver name
This patch adds the PCI-hotplug handler driver name in the
DDX config file with respect to Xorg commit:82bf391c
Cc: Alexander Deucher <alexander.deucher@amd.com>
Signed-off-by: Shashank Sharma <shashank.sharma@amd.com>
commit 2ec854d48e0e44fc60c3955663f700cbefea3553
Author: Mario Kleiner <mario.kleiner.de@gmail.com>
Date: Fri Nov 11 02:18:07 2022 +0100
Fix primary output handling in amdgpu_crtc_covering_box().
Commit e39a3ee07c9dea73b0452b71b1ef633b6cd6f389
tries to reintroduce the RandR primary output as a tie breaker
in amdgpu_crtc_covering_box(), but that function wrongly
assigns a void* devPrivate, which is actually a xf86CrtcPtr,
to the RRCrtcPtr primary_crtc, a pointer target type mismatch!
This causes a later pointer comparison of primary_crtc with
RRCrtcPtr crtc to always fail, so that the user selected
primary output can not ever successfully act as a tie-breaker
when multiple candidate crtcs cover the same box area,
defeating the whole purpose of that commit! Not sure how
this failure could have ever evaded any basic testing.
Fix this trivially by assigning the right variable.
Successfully tested on a multi-display setup, verifying
that the primary output now works as tie breaker as
intended.
Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
Fixes: e39a3ee07c9d ("Prefer crtc of primary output for synchronization when screen has to crtcs with the same coverage")
commit 9c959fac3af28d191105f63236096ad456dca614
Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Date: Thu Sep 29 16:42:09 2022 +0200
Use DRM_CAP_CURSOR_WIDTH/HEIGHT if possible
There's no need to hardcode the cursor size if the kernel can
report the value it wants.
commit 4e011b91fa3ef58b85327d3429889efd934b3531
Author: Alan Coopersmith <alan.coopersmith@oracle.com>
Date: Tue Aug 2 15:03:19 2022 -0700
gitlab CI: enable gitlab's builtin static analysis
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
commit dc81177ef342bf8c2aa5a6fd6687c7a09b4f9709
Author: tiancyin <tianci.yin@amd.com>
Date: Wed Aug 10 16:46:15 2022 +0800
Fix screen corruption on secondary GPU
[why]
On RHEL9+, xorg-server.pc shows that the Xorg no longer depends on dri,
and dri.pc provides "/opt/amdgpu/include" path for pkg-config, this
cause pkg-config no longer output "-I/opt/amdgpu/include", consequently
the configure can't find gbm.h and HAVE_GBM_BO_USE_LINEAR is not
declared, that cause the corruption.
[how]
Since the gbm.pc also provides the "/opt/amdgpu/include" path, in module
dependence checking, GBM_CFLAGS get this path, so just explicitly add
GBM_CFLAGS into CPPFLAGS can fix this issue.
Signed-off-by: tiancyin <tianci.yin@amd.com>
commit a3a012b649eb9b3066abefe163a72854514792fa
Author: Kai-Heng Feng <kai.heng.feng@canonical.com>
Date: Mon Aug 8 10:49:11 2022 +0800
Initialize present extension for GPU screen
Some laptops have the external outputs routed to dGPU, when the external
output over dGPU is the only display in reverse prime mode, we need
present extension so fake CRTC won't be used.
commit f3f57a58342c286808220bdbe6dc6bb7098763b9
Author: Lukasz Spintzyk <lukasz.spintzyk@displaylink.com>
Date: Fri Jun 11 14:54:35 2021 +0200
Do not consider disabled crtc anymore when looking for xf86crtc covering drawable.
This is commit is removing obsolete switch done in
xf86-video-ati at sha 61d0aec40e2521488c2fe43e7a6823e5c87d94d7: video: add option to include disabled CRTCs in best CRTC search
This is not required anymore as with commit done in
xorg-server at sha 5c5c1b77982a9af7279a90bc3c2be48adaa9c778: present: Add Present extension
That in case of lack of crtc is using fake_crtc with render 1Hz frequency
When consider_disabled is removed then amdgpu_pick_best_crtc is doing the same what rr_crtc_covering_box is doing
so it can be reimplemented to reuse that function.
Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk@synaptics.com>
Signed-off-by: Shashank Sharma <contactshashanksharma@gmail.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
commit e39a3ee07c9dea73b0452b71b1ef633b6cd6f389
Author: Lukasz Spintzyk <lukasz.spintzyk@displaylink.com>
Date: Mon Jun 21 11:41:40 2021 +0200
Prefer crtc of primary output for synchronization when screen has to crtcs with the same coverage
This is adjusting randr_crtc_covering_drawable to cover scenario fixed in
9151f3b1c2ebcc34e63195888ba696f2183ba5e2
Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk@synaptics.com>
Signed-off-by: Shashank Sharma <contactshashanksharma@gmail.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
commit 92fb43b8e96bbda77e03b7313ccbba75a304a1b1
Author: Lukasz Spintzyk <lukasz.spintzyk@displaylink.com>
Date: Fri Jun 11 08:52:58 2021 +0200
Use randr_crtc_covering_drawable used in modesetting
Use implementation from modesetting driver that is fixing issue:
https://gitlab.freedesktop.org/xorg/xserver/-/issues/1028
Instead of returning primary crtc as fallback we can now find and return crtc that belongs to secondary outputs.
v2:
restore original naming scheme for amdgpu_crtc_is_enabled, amdgpu_box_intersect, amdgpu_box_area functions
Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk@synaptics.com>
Signed-off-by: Emilia Majewska <emilia.majewska@synaptics.com>
Signed-off-by: Shashank Sharma <contactshashanksharma@gmail.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
commit 57740ae2357ca7b973f78be31327365aaa60ed41
Author: Łukasz Spintzyk <lukasz.spintzyk@synaptics.com>
Date: Tue Jun 22 07:36:42 2021 +0200
amdgpu: fixup driver for new X server ABI
Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk@synaptics.com>
Signed-off-by: Shashank Sharma <contactshashanksharma@gmail.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
commit 89b3eb9fffe2ead4257eee6d65accbac135aedc9
Author: Alan Coopersmith <alan.coopersmith@oracle.com>
Date: Sat Feb 19 12:07:46 2022 -0800
Update URLs to reflect gitlab migration
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
commit 533bd30ceaa373788b3d0bfd4d486f0f1c624d0c
Author: Shashank Sharma <shashank.sharma@amd.com>
Date: Tue Feb 22 16:25:01 2022 +0100

View File

@ -4,15 +4,11 @@ xf86-video-amdgpu - Xorg driver for AMD Radeon GPUs using the amdgpu kernel driv
Questions regarding this software should be directed at the
[amd-gfx mailing list](https://lists.freedesktop.org/mailman/listinfo/amd-gfx).
Please
[submit bug reports](https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu)
to the Xorg bugzilla.
The
[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.
Please submit bug reports there and use merge requests for patch submission.
See the X.org wiki for
[further patch submission instructions](https://www.x.org/wiki/Development/Documentation/SubmittingPatches)

View File

@ -2,4 +2,5 @@ Section "OutputClass"
Identifier "AMDgpu"
MatchDriver "amdgpu"
Driver "amdgpu"
EndSection
Option "HotplugDriver" "amdgpu"
EndSection

View File

@ -1,8 +1,8 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for xf86-video-amdgpu 22.0.0.
# Generated by GNU Autoconf 2.69 for xf86-video-amdgpu 23.0.0.
#
# Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu>.
# Report bugs to <https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/-/issues>.
#
#
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@ -275,7 +275,7 @@ fi
$as_echo "$0: be upgraded to zsh 4.3.4 or later."
else
$as_echo "$0: Please tell bug-autoconf@gnu.org and
$0: https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu
$0: https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/-/issues
$0: about your system, including any error possibly output
$0: before this message. Then install a modern shell, or
$0: manually run the script under such a shell if you do
@ -591,9 +591,9 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='xf86-video-amdgpu'
PACKAGE_TARNAME='xf86-video-amdgpu'
PACKAGE_VERSION='22.0.0'
PACKAGE_STRING='xf86-video-amdgpu 22.0.0'
PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu'
PACKAGE_VERSION='23.0.0'
PACKAGE_STRING='xf86-video-amdgpu 23.0.0'
PACKAGE_BUGREPORT='https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/-/issues'
PACKAGE_URL=''
ac_unique_file="Makefile.am"
@ -1405,7 +1405,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 22.0.0 to adapt to many kinds of systems.
\`configure' configures xf86-video-amdgpu 23.0.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1477,7 +1477,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of xf86-video-amdgpu 22.0.0:";;
short | recursive ) echo "Configuration of xf86-video-amdgpu 23.0.0:";;
esac
cat <<\_ACEOF
@ -1571,7 +1571,7 @@ Some influential environment variables:
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu>.
Report bugs to <https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/-/issues>.
_ACEOF
ac_status=$?
fi
@ -1634,7 +1634,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
xf86-video-amdgpu configure 22.0.0
xf86-video-amdgpu configure 23.0.0
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@ -2025,9 +2025,9 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
( $as_echo "## ---------------------------------------------------------------------------------------------- ##
## Report this to https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu ##
## ---------------------------------------------------------------------------------------------- ##"
( $as_echo "## ------------------------------------------------------------------------------------ ##
## Report this to https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/-/issues ##
## ------------------------------------------------------------------------------------ ##"
) | sed "s/^/$as_me: WARNING: /" >&2
;;
esac
@ -2049,7 +2049,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 22.0.0, which was
It was created by xf86-video-amdgpu $as_me 23.0.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@ -2881,7 +2881,7 @@ fi
# Define the identity of the package.
PACKAGE='xf86-video-amdgpu'
VERSION='22.0.0'
VERSION='23.0.0'
cat >>confdefs.h <<_ACEOF
@ -18882,7 +18882,7 @@ fi
SAVE_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $XORG_CFLAGS"
CPPFLAGS="$CPPFLAGS $XORG_CFLAGS $GBM_CFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to include GLAMOR support" >&5
$as_echo_n "checking whether to include GLAMOR support... " >&6; }
@ -20024,7 +20024,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 22.0.0, which was
This file was extended by xf86-video-amdgpu $as_me 23.0.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@ -20084,13 +20084,13 @@ $config_headers
Configuration commands:
$config_commands
Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu>."
Report bugs to <https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/-/issues>."
_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 22.0.0
xf86-video-amdgpu config.status 23.0.0
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"

View File

@ -23,8 +23,8 @@
# Initialize Autoconf
AC_PREREQ([2.60])
AC_INIT([xf86-video-amdgpu],
[22.0.0],
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu],
[23.0.0],
[https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/-/issues],
[xf86-video-amdgpu])
AC_CONFIG_SRCDIR([Makefile.am])
@ -110,7 +110,7 @@ fi
AM_CONDITIONAL(LIBUDEV, test x$LIBUDEV = xyes)
SAVE_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $XORG_CFLAGS"
CPPFLAGS="$CPPFLAGS $XORG_CFLAGS $GBM_CFLAGS"
AC_MSG_CHECKING([whether to include GLAMOR support])
AC_ARG_ENABLE(glamor,

View File

@ -140,7 +140,7 @@ https://www.x.org/wiki/radeon
.IP " 2." 4
Overview about amdgpu development code:
.RS 4
https://cgit.freedesktop.org/xorg/driver/xf86-video-amdgpu/
https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu
.RE
.IP " 3." 4
Mailing list:
@ -153,14 +153,14 @@ IRC channel:
#radeon on irc.freenode.net
.RE
.IP " 5." 4
Query the bugtracker for amdgpu bugs:
The bugtracker for amdgpu bugs:
.RS 4
https://bugs.freedesktop.org/query.cgi?product=xorg&component=Driver/AMDgpu
https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/-/issues
.RE
.IP " 6." 4
Submit bugs & patches:
Submit merge requests:
.RS 4
https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/AMDgpu
https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/-/merge_requests
.RE
.SH AUTHORS

View File

@ -417,8 +417,7 @@ static
xf86CrtcPtr amdgpu_dri2_drawable_crtc(DrawablePtr pDraw)
{
ScreenPtr pScreen = pDraw->pScreen;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
xf86CrtcPtr crtc = amdgpu_pick_best_crtc(pScrn, TRUE,
xf86CrtcPtr crtc = amdgpu_pick_best_crtc(pScreen,
pDraw->x, pDraw->x + pDraw->width,
pDraw->y, pDraw->y + pDraw->height);

View File

@ -372,9 +372,9 @@ extern void amdgpu_sync_close(ScreenPtr screen);
/* amdgpu_video.c */
extern void AMDGPUInitVideo(ScreenPtr pScreen);
extern void AMDGPUResetVideo(ScrnInfoPtr pScrn);
extern xf86CrtcPtr amdgpu_pick_best_crtc(ScrnInfoPtr pScrn,
Bool consider_disabled,
extern xf86CrtcPtr amdgpu_pick_best_crtc(ScreenPtr pScreen,
int x1, int x2, int y1, int y2);
extern RRCrtcPtr amdgpu_randr_crtc_covering_drawable(DrawablePtr pDraw);
extern AMDGPUEntPtr AMDGPUEntPriv(ScrnInfoPtr pScrn);

View File

@ -1503,6 +1503,25 @@ static Bool AMDGPUCreateWindow_oneshot(WindowPtr pWin)
return ret;
}
static void amdgpu_determine_cursor_size(int fd, AMDGPUInfoPtr info)
{
uint64_t value;
if (drmGetCap(fd, DRM_CAP_CURSOR_WIDTH, &value) == 0)
info->cursor_w = value;
else if (info->family < AMDGPU_FAMILY_CI)
info->cursor_w = CURSOR_WIDTH;
else
info->cursor_w = CURSOR_WIDTH_CIK;
if (drmGetCap(fd, DRM_CAP_CURSOR_HEIGHT, &value) == 0)
info->cursor_h = value;
else if (info->family < AMDGPU_FAMILY_CI)
info->cursor_h = CURSOR_HEIGHT;
else
info->cursor_h = CURSOR_HEIGHT_CIK;
}
/* When the root window is mapped, set the initial modes */
void AMDGPUWindowExposures_oneshot(WindowPtr pWin, RegionPtr pRegion
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,16,99,901,0)
@ -1686,13 +1705,7 @@ Bool AMDGPUPreInit_KMS(ScrnInfoPtr pScrn, int flags)
else
pAMDGPUEnt->HasCRTC2 = TRUE;
if (info->family < AMDGPU_FAMILY_CI) {
info->cursor_w = CURSOR_WIDTH;
info->cursor_h = CURSOR_HEIGHT;
} else {
info->cursor_w = CURSOR_WIDTH_CIK;
info->cursor_h = CURSOR_HEIGHT_CIK;
}
amdgpu_determine_cursor_size(pAMDGPUEnt->fd, info);
amdgpu_query_heap_size(pAMDGPUEnt->pDev, AMDGPU_GEM_DOMAIN_GTT,
&heap_size, &max_allocation);
@ -2048,36 +2061,34 @@ Bool AMDGPUScreenInit_KMS(ScreenPtr pScreen, int argc, char **argv)
}
#endif
if (!pScreen->isGPU) {
if (xorgGetVersion() >= XORG_VERSION_NUMERIC(1,18,3,0,0))
value = info->use_glamor;
else
value = FALSE;
from = X_DEFAULT;
if (xorgGetVersion() >= XORG_VERSION_NUMERIC(1,18,3,0,0))
value = info->use_glamor;
else
value = FALSE;
from = X_DEFAULT;
if (info->use_glamor) {
if (xf86GetOptValBool(info->Options, OPTION_DRI3, &value))
from = X_CONFIG;
if (info->use_glamor) {
if (xf86GetOptValBool(info->Options, OPTION_DRI3, &value))
from = X_CONFIG;
if (xf86GetOptValInteger(info->Options, OPTION_DRI, &driLevel) &&
(driLevel == 2 || driLevel == 3)) {
from = X_CONFIG;
value = driLevel == 3;
}
if (xf86GetOptValInteger(info->Options, OPTION_DRI, &driLevel) &&
(driLevel == 2 || driLevel == 3)) {
from = X_CONFIG;
value = driLevel == 3;
}
if (value) {
value = amdgpu_sync_init(pScreen) &&
amdgpu_present_screen_init(pScreen) &&
amdgpu_dri3_screen_init(pScreen);
if (!value)
from = X_WARNING;
}
xf86DrvMsg(pScrn->scrnIndex, from, "DRI3 %sabled\n", value ? "en" : "dis");
}
if (value) {
value = amdgpu_sync_init(pScreen) &&
amdgpu_present_screen_init(pScreen) &&
amdgpu_dri3_screen_init(pScreen);
if (!value)
from = X_WARNING;
}
xf86DrvMsg(pScrn->scrnIndex, from, "DRI3 %sabled\n", value ? "en" : "dis");
pScrn->vtSema = TRUE;
xf86SetBackingStore(pScreen);

View File

@ -58,21 +58,7 @@ struct amdgpu_present_vblank_event {
static RRCrtcPtr
amdgpu_present_get_crtc(WindowPtr window)
{
ScreenPtr screen = window->drawable.pScreen;
ScrnInfoPtr pScrn = xf86ScreenToScrn(screen);
xf86CrtcPtr crtc;
RRCrtcPtr randr_crtc = NULL;
crtc = amdgpu_pick_best_crtc(pScrn, FALSE,
window->drawable.x,
window->drawable.x + window->drawable.width,
window->drawable.y,
window->drawable.y + window->drawable.height);
if (crtc)
randr_crtc = crtc->randr_crtc;
return randr_crtc;
return amdgpu_randr_crtc_covering_drawable(&window->drawable);
}
static int

View File

@ -39,89 +39,180 @@ static void amdgpu_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
{
dest->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
dest->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
if (dest->x1 >= dest->x2) {
dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
return;
}
dest->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
dest->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
if (dest->x1 >= dest->x2 || dest->y1 >= dest->y2)
if (dest->y1 >= dest->y2)
dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
}
static void amdgpu_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box)
{
if (crtc->enabled) {
crtc_box->x1 = crtc->x;
crtc_box->x2 =
crtc->x + xf86ModeWidth(&crtc->mode, crtc->rotation);
crtc_box->y1 = crtc->y;
crtc_box->y2 =
crtc->y + xf86ModeHeight(&crtc->mode, crtc->rotation);
} else
crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
}
static int amdgpu_box_area(BoxPtr box)
{
return (int)(box->x2 - box->x1) * (int)(box->y2 - box->y1);
}
Bool amdgpu_crtc_is_enabled(xf86CrtcPtr crtc)
Bool
amdgpu_crtc_is_enabled(xf86CrtcPtr crtc)
{
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
return drmmode_crtc->dpms_mode == DPMSModeOn;
return crtc->enabled && drmmode_crtc->dpms_mode == DPMSModeOn;
}
static void amdgpu_crtc_box(RRCrtcPtr crtc, BoxPtr crtc_box)
{
if (crtc->mode) {
crtc_box->x1 = crtc->x;
crtc_box->y1 = crtc->y;
switch (crtc->rotation) {
case RR_Rotate_0:
case RR_Rotate_180:
default:
crtc_box->x2 = crtc->x + crtc->mode->mode.width;
crtc_box->y2 = crtc->y + crtc->mode->mode.height;
break;
case RR_Rotate_90:
case RR_Rotate_270:
crtc_box->x2 = crtc->x + crtc->mode->mode.height;
crtc_box->y2 = crtc->y + crtc->mode->mode.width;
break;
}
} else
crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
}
static Bool amdgpu_crtc_on(RRCrtcPtr crtc, Bool crtc_is_xf86_hint)
{
if (!crtc) {
return FALSE;
}
if (crtc_is_xf86_hint && crtc->devPrivate) {
return amdgpu_crtc_is_enabled(crtc->devPrivate);
} else {
return !!crtc->mode;
}
}
/*
* Return the crtc covering 'box'. If two crtcs cover a portion of
* 'box', then prefer the crtc with greater coverage.
*/
static RRCrtcPtr
amdgpu_crtc_covering_box(ScreenPtr pScreen, BoxPtr box, Bool screen_is_xf86_hint)
{
rrScrPrivPtr pScrPriv;
RRCrtcPtr crtc, best_crtc, primary_crtc;
int coverage, best_coverage;
int c;
BoxRec crtc_box, cover_box;
RROutputPtr primary_output;
best_crtc = NULL;
best_coverage = 0;
primary_crtc = NULL;
primary_output = NULL;
if (!dixPrivateKeyRegistered(rrPrivKey))
return NULL;
pScrPriv = rrGetScrPriv(pScreen);
if (!pScrPriv)
return NULL;
primary_output = RRFirstOutput(pScreen);
if (primary_output && primary_output->crtc)
primary_crtc = primary_output->crtc;
for (c = 0; c < pScrPriv->numCrtcs; c++) {
crtc = pScrPriv->crtcs[c];
/* If the CRTC is off, treat it as not covering */
if (!amdgpu_crtc_on(crtc, screen_is_xf86_hint))
continue;
amdgpu_crtc_box(crtc, &crtc_box);
amdgpu_box_intersect(&cover_box, &crtc_box, box);
coverage = amdgpu_box_area(&cover_box);
if (coverage > best_coverage ||
(crtc == primary_crtc && coverage == best_coverage)) {
best_crtc = crtc;
best_coverage = coverage;
}
}
return best_crtc;
}
#if ABI_VIDEODRV_VERSION >= SET_ABI_VERSION(23, 0)
static RRCrtcPtr
amdgpu_crtc_covering_box_on_secondary(ScreenPtr pScreen, BoxPtr box)
{
if (!pScreen->isGPU) {
ScreenPtr secondary;
RRCrtcPtr crtc = NULL;
xorg_list_for_each_entry(secondary, &pScreen->secondary_list, secondary_head) {
if (!secondary->is_output_secondary)
continue;
crtc = amdgpu_crtc_covering_box(secondary, box, FALSE);
if (crtc)
return crtc;
}
}
return NULL;
}
#endif
RRCrtcPtr
amdgpu_randr_crtc_covering_drawable(DrawablePtr pDraw)
{
ScreenPtr pScreen = pDraw->pScreen;
RRCrtcPtr crtc = NULL;
BoxRec box;
box.x1 = pDraw->x;
box.y1 = pDraw->y;
box.x2 = box.x1 + pDraw->width;
box.y2 = box.y1 + pDraw->height;
crtc = amdgpu_crtc_covering_box(pScreen, &box, TRUE);
#if ABI_VIDEODRV_VERSION >= SET_ABI_VERSION(23, 0)
if (!crtc) {
crtc = amdgpu_crtc_covering_box_on_secondary(pScreen, &box);
}
#endif
return crtc;
}
xf86CrtcPtr
amdgpu_pick_best_crtc(ScrnInfoPtr pScrn, Bool consider_disabled,
amdgpu_pick_best_crtc(ScreenPtr pScreen,
int x1, int x2, int y1, int y2)
{
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
int coverage, best_coverage, c, cd;
BoxRec box, crtc_box, cover_box;
RROutputPtr primary_output = NULL;
xf86CrtcPtr best_crtc = NULL, primary_crtc = NULL;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
if (!pScrn->vtSema)
return NULL;
RRCrtcPtr crtc = NULL;
BoxRec box;
box.x1 = x1;
box.x2 = x2;
box.y1 = y1;
box.y2 = y2;
best_coverage = 0;
/* Prefer the CRTC of the primary output */
if (dixPrivateKeyRegistered(rrPrivKey))
{
primary_output = RRFirstOutput(pScrn->pScreen);
crtc = amdgpu_crtc_covering_box(pScreen, &box, TRUE);
if (crtc) {
return crtc->devPrivate;
}
if (primary_output && primary_output->crtc)
primary_crtc = primary_output->crtc->devPrivate;
/* first consider only enabled CRTCs
* then on second pass consider disabled ones
*/
for (cd = 0; cd < (consider_disabled ? 2 : 1); cd++) {
for (c = 0; c < xf86_config->num_crtc; c++) {
xf86CrtcPtr crtc = xf86_config->crtc[c];
if (!cd && !amdgpu_crtc_is_enabled(crtc))
continue;
amdgpu_crtc_box(crtc, &crtc_box);
amdgpu_box_intersect(&cover_box, &crtc_box, &box);
coverage = amdgpu_box_area(&cover_box);
if (coverage > best_coverage ||
(coverage == best_coverage &&
crtc == primary_crtc)) {
best_crtc = crtc;
best_coverage = coverage;
}
}
if (best_crtc)
break;
}
return best_crtc;
return NULL;
}
void AMDGPUInitVideo(ScreenPtr pScreen)

View File

@ -42,6 +42,9 @@
#define current_primary current_master
#define primary_pixmap master_pixmap
#define secondary_dst slave_dst
#define secondary_list slave_list
#define secondary_head slave_head
#define is_output_secondary is_output_slave
#endif
#endif