Update to xf86-video-ati 19.10.0. tested by jsg@

This commit is contained in:
matthieu 2019-10-26 09:37:25 +00:00
parent 0999e0299d
commit 049847108f
8 changed files with 208 additions and 68 deletions

View File

@ -1,3 +1,123 @@
commit b9bd8097e1d2c088b081f1b81799ea3892406214
Author: Michel Dänzer <mdaenzer@redhat.com>
Date: Tue Oct 15 17:54:12 2019 +0200
Bump version for 19.1.0 release
commit 2faaecc69b127248718e759c6c98c84d56dd1b6b
Author: Michel Dänzer <mdaenzer@redhat.com>
Date: Fri Sep 20 17:24:19 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: 06a465484101 ("Make all active CRTCs scan out an all-black
framebuffer in LeaveVT")
commit 2cbbd8648cdd27db8076565943b932ef81337053
Author: Michel Dänzer <mdaenzer@redhat.com>
Date: Fri Sep 20 18:47:02 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
(Ported from amdgpu commit 5b8bc9fc505c551dcd9b0ed5ab835a49fa4f9fda)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
commit c7ed12cb2ea76999351d7cb87877224bdc0664f0
Author: Michel Dänzer <michel.daenzer@amd.com>
Date: Thu Jul 18 18:14:48 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.
(Ported from amdgpu commit 87f41ace4920fd2069794211683659eb25b025a6)
commit 33803c85f761d343aa7300311b8e9489b1a89495
Author: Michel Dänzer <michel.daenzer@amd.com>
Date: Tue Jun 25 17:46:23 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.
(Ported from amdgpu commit 7d3fef72e0c871e1677e9e544f4cae5e238b5c52)
commit fee737e82837dc8282a832fc9391ed959c4c3737
Author: Michel Dänzer <michel.daenzer@amd.com>
Date: Fri Jun 14 11:23:34 2019 +0200
Remove dri2_drawable_crtc parameter consider_disabled
All callers were passing TRUE.
(Ported from amdgpu commit ea19a5207054bb159fc7fb6d88e0ceb10c3da010)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
commit 2a3f2d2089f603c99be54c98d7033155e771ce7b
Author: Michel Dänzer <michel.daenzer@amd.com>
Date: Fri Jun 14 11:21:40 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.
(Ported from amdgpu commit 3109f088fdbd89c2ee8078625d4f073852492656)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
commit d5f5bc5846ef06c3ecf9e5acf1ca357574f06f5a
Author: Flora Cui <flora.cui@amd.com>
Date: Fri Jun 14 11:20:12 2019 +0200
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.cui@amd.com>
(Ported from amdgpu commit fb06fb814700a47464abd756e1111dcc76d0d776)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
commit f758908db4e71406e5d437d32e43aabd38a63504
Author: Michel Dänzer <michel.daenzer@amd.com>
Date: Thu May 9 12:35:37 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.
(Ported from amdgpu commit 4b17533fcb30842caf0035ba593b7d986520cc85)
Acked-by: Alex Deucher <alexander.deucher@amd.com>
commit d1d8e3c8d0a0a0394d395eba171460501745209b
Author: Michel Dänzer <michel.daenzer@amd.com>
Date: Wed Apr 24 12:25:39 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
(Ported from amdgpu commit bf61e6d7ac1a5754b1026d7f80acf25ef622c491)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
commit 36703f66c3b06875651606a6280d5dc9d9dad51e commit 36703f66c3b06875651606a6280d5dc9d9dad51e
Author: Michel Dänzer <michel.daenzer@amd.com> Author: Michel Dänzer <michel.daenzer@amd.com>
Date: Tue Mar 19 18:01:02 2019 +0100 Date: Tue Mar 19 18:01:02 2019 +0100

View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for xf86-video-ati 19.0.1. # Generated by GNU Autoconf 2.69 for xf86-video-ati 19.1.0.
# #
# Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/Radeon>. # Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/Radeon>.
# #
@ -591,8 +591,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='xf86-video-ati' PACKAGE_NAME='xf86-video-ati'
PACKAGE_TARNAME='xf86-video-ati' PACKAGE_TARNAME='xf86-video-ati'
PACKAGE_VERSION='19.0.1' PACKAGE_VERSION='19.1.0'
PACKAGE_STRING='xf86-video-ati 19.0.1' PACKAGE_STRING='xf86-video-ati 19.1.0'
PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/Radeon' PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/Radeon'
PACKAGE_URL='' PACKAGE_URL=''
@ -1398,7 +1398,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # 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. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures xf86-video-ati 19.0.1 to adapt to many kinds of systems. \`configure' configures xf86-video-ati 19.1.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1468,7 +1468,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of xf86-video-ati 19.0.1:";; short | recursive ) echo "Configuration of xf86-video-ati 19.1.0:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1629,7 +1629,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
xf86-video-ati configure 19.0.1 xf86-video-ati configure 19.1.0
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@ -2044,7 +2044,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by xf86-video-ati $as_me 19.0.1, which was It was created by xf86-video-ati $as_me 19.1.0, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -2876,7 +2876,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='xf86-video-ati' PACKAGE='xf86-video-ati'
VERSION='19.0.1' VERSION='19.1.0'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -20122,7 +20122,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by xf86-video-ati $as_me 19.0.1, which was This file was extended by xf86-video-ati $as_me 19.1.0, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -20188,7 +20188,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
xf86-video-ati config.status 19.0.1 xf86-video-ati config.status 19.1.0
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@ -23,7 +23,7 @@
# Initialize Autoconf # Initialize Autoconf
AC_PREREQ([2.60]) AC_PREREQ([2.60])
AC_INIT([xf86-video-ati], AC_INIT([xf86-video-ati],
[19.0.1], [19.1.0],
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/Radeon], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/Radeon],
[xf86-video-ati]) [xf86-video-ati])

View File

@ -309,6 +309,7 @@ struct radeon_pixmap {
struct radeon_buffer *bo; struct radeon_buffer *bo;
struct drmmode_fb *fb; struct drmmode_fb *fb;
Bool fb_failed;
uint32_t tiling_flags; uint32_t tiling_flags;
@ -877,21 +878,22 @@ static inline struct drmmode_fb*
radeon_pixmap_get_fb(PixmapPtr pix) radeon_pixmap_get_fb(PixmapPtr pix)
{ {
struct drmmode_fb **fb_ptr = radeon_pixmap_get_fb_ptr(pix); struct drmmode_fb **fb_ptr = radeon_pixmap_get_fb_ptr(pix);
uint32_t handle;
if (!fb_ptr) if (fb_ptr && *fb_ptr)
return NULL; return *fb_ptr;
if (radeon_get_pixmap_handle(pix, &handle)) {
ScrnInfoPtr scrn = xf86ScreenToScrn(pix->drawable.pScreen);
RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn);
if (!*fb_ptr) { if (!fb_ptr)
uint32_t handle; fb_ptr = radeon_pixmap_get_fb_ptr(pix);
if (radeon_get_pixmap_handle(pix, &handle)) { *fb_ptr = radeon_fb_create(scrn, pRADEONEnt->fd,
ScrnInfoPtr scrn = xf86ScreenToScrn(pix->drawable.pScreen); pix->drawable.width,
RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn); pix->drawable.height, pix->devKind,
handle);
*fb_ptr = radeon_fb_create(scrn, pRADEONEnt->fd, pix->drawable.width,
pix->drawable.height, pix->devKind,
handle);
}
} }
return *fb_ptr; return *fb_ptr;

View File

@ -509,18 +509,20 @@ static Bool radeon_dri2_get_crtc_msc(xf86CrtcPtr crtc, CARD64 *ust, CARD64 *msc)
} }
static static
xf86CrtcPtr radeon_dri2_drawable_crtc(DrawablePtr pDraw, Bool consider_disabled) xf86CrtcPtr radeon_dri2_drawable_crtc(DrawablePtr pDraw)
{ {
ScreenPtr pScreen = pDraw->pScreen; ScreenPtr pScreen = pDraw->pScreen;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
xf86CrtcPtr crtc = radeon_pick_best_crtc(pScrn, consider_disabled, xf86CrtcPtr crtc = radeon_pick_best_crtc(pScrn, TRUE,
pDraw->x, pDraw->x + pDraw->width, pDraw->x, pDraw->x + pDraw->width,
pDraw->y, pDraw->y + pDraw->height); 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); 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; CARD64 ust, mscold, mscnew;
if (radeon_dri2_get_crtc_msc(priv->crtc, &ust, &mscold) && if (radeon_dri2_get_crtc_msc(priv->crtc, &ust, &mscold) &&
@ -926,7 +928,7 @@ CARD32 radeon_dri2_extrapolate_msc_delay(xf86CrtcPtr crtc, CARD64 *target_msc,
*/ */
static int radeon_dri2_get_msc(DrawablePtr draw, CARD64 *ust, CARD64 *msc) static int radeon_dri2_get_msc(DrawablePtr draw, CARD64 *ust, CARD64 *msc)
{ {
xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw, TRUE); xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw);
/* Drawable not displayed, make up a value */ /* Drawable not displayed, make up a value */
if (!crtc) { if (!crtc) {
@ -1041,7 +1043,7 @@ static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw,
ScrnInfoPtr scrn = xf86ScreenToScrn(screen); ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
DRI2FrameEventPtr wait_info = NULL; DRI2FrameEventPtr wait_info = NULL;
uintptr_t drm_queue_seq = 0; uintptr_t drm_queue_seq = 0;
xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw, TRUE); xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw);
uint32_t msc_delta; uint32_t msc_delta;
uint32_t seq; uint32_t seq;
CARD64 current_msc; CARD64 current_msc;
@ -1156,6 +1158,9 @@ static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw,
out_complete: out_complete:
if (wait_info) if (wait_info)
radeon_dri2_deferred_event(NULL, 0, wait_info); radeon_dri2_deferred_event(NULL, 0, wait_info);
else
DRI2WaitMSCComplete(client, draw, 0, 0, 0);
return TRUE; return TRUE;
} }
@ -1187,7 +1192,7 @@ static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw,
{ {
ScreenPtr screen = draw->pScreen; ScreenPtr screen = draw->pScreen;
ScrnInfoPtr scrn = xf86ScreenToScrn(screen); ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw, TRUE); xf86CrtcPtr crtc = radeon_dri2_drawable_crtc(draw);
uint32_t msc_delta; uint32_t msc_delta;
drmVBlankSeqType type; drmVBlankSeqType type;
uint32_t seq; uint32_t seq;

View File

@ -220,29 +220,13 @@ static int radeon_dri3_fd_from_pixmap(ScreenPtr screen,
RADEONInfoPtr info = RADEONPTR(scrn); RADEONInfoPtr info = RADEONPTR(scrn);
if (info->use_glamor) { if (info->use_glamor) {
Bool need_flush = TRUE; int ret = glamor_fd_from_pixmap(screen, pixmap, stride, size);
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);
if (gbm_bo) { /* Any pending drawing operations need to be flushed to the
ret = gbm_bo_get_fd(gbm_bo); * kernel driver before the client starts using the pixmap
gbm_bo_destroy(gbm_bo); * storage for direct rendering.
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.
*/ */
if (ret >= 0 && need_flush) if (ret >= 0)
radeon_cs_flush_indirect(scrn); radeon_cs_flush_indirect(scrn);
return ret; return ret;

View File

@ -1917,19 +1917,15 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
if (!pScrn->is_gpu) { if (!pScrn->is_gpu) {
if (info->dri2.pKernelDRMVersion->version_minor >= 8) { if (info->dri2.pKernelDRMVersion->version_minor >= 8) {
Bool sw_cursor = xf86ReturnOptValBool(info->Options,
OPTION_SW_CURSOR, FALSE);
info->allowPageFlip = xf86ReturnOptValBool(info->Options, info->allowPageFlip = xf86ReturnOptValBool(info->Options,
OPTION_PAGE_FLIP, TRUE); OPTION_PAGE_FLIP, TRUE);
if (sw_cursor || info->shadow_primary) { if (info->shadow_primary) {
xf86DrvMsg(pScrn->scrnIndex, xf86DrvMsg(pScrn->scrnIndex,
info->allowPageFlip ? X_WARNING : X_DEFAULT, info->allowPageFlip ? X_WARNING : X_DEFAULT,
"KMS Pageflipping: disabled%s\n", "KMS Pageflipping: disabled%s\n",
info->allowPageFlip ? info->allowPageFlip ?
(sw_cursor ? " because of SWcursor" : " because of ShadowPrimary" : "");
" because of ShadowPrimary") : "");
info->allowPageFlip = FALSE; info->allowPageFlip = FALSE;
} else { } else {
xf86DrvMsg(pScrn->scrnIndex, X_INFO, xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@ -2606,16 +2602,25 @@ CARD32 cleanup_black_fb(OsTimerPtr timer, CARD32 now, pointer data)
} }
static void static void
pixmap_unref_fb(void *value, XID id, void *cdata) pixmap_unref_fb(PixmapPtr pixmap)
{ {
PixmapPtr pixmap = value; ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
RADEONEntPtr pRADEONEnt = cdata;
struct drmmode_fb **fb_ptr = radeon_pixmap_get_fb_ptr(pixmap); struct drmmode_fb **fb_ptr = radeon_pixmap_get_fb_ptr(pixmap);
RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn);
if (fb_ptr) if (fb_ptr)
drmmode_fb_reference(pRADEONEnt->fd, fb_ptr, NULL); drmmode_fb_reference(pRADEONEnt->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 RADEONLeaveVT_KMS(ScrnInfoPtr pScrn) void RADEONLeaveVT_KMS(ScrnInfoPtr pScrn)
{ {
RADEONInfoPtr info = RADEONPTR(pScrn); RADEONInfoPtr info = RADEONPTR(pScrn);
@ -2633,6 +2638,12 @@ void RADEONLeaveVT_KMS(ScrnInfoPtr pScrn)
unsigned w = 0, h = 0; unsigned w = 0, h = 0;
int i; 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 */ /* Compute maximum scanout dimensions of active CRTCs */
for (i = 0; i < xf86_config->num_crtc; i++) { for (i = 0; i < xf86_config->num_crtc; i++) {
crtc = xf86_config->crtc[i]; crtc = xf86_config->crtc[i];
@ -2671,11 +2682,9 @@ void RADEONLeaveVT_KMS(ScrnInfoPtr pScrn)
if (pScrn->is_gpu) { if (pScrn->is_gpu) {
if (drmmode_crtc->scanout[0].pixmap) if (drmmode_crtc->scanout[0].pixmap)
pixmap_unref_fb(drmmode_crtc->scanout[0].pixmap, pixmap_unref_fb(drmmode_crtc->scanout[0].pixmap);
None, pRADEONEnt);
if (drmmode_crtc->scanout[1].pixmap) if (drmmode_crtc->scanout[1].pixmap)
pixmap_unref_fb(drmmode_crtc->scanout[1].pixmap, pixmap_unref_fb(drmmode_crtc->scanout[1].pixmap);
None, pRADEONEnt);
} else { } else {
drmmode_crtc_scanout_free(crtc); drmmode_crtc_scanout_free(crtc);
} }
@ -2695,18 +2704,20 @@ void RADEONLeaveVT_KMS(ScrnInfoPtr pScrn)
(!clients[i] || clients[i]->clientState != ClientStateRunning)) (!clients[i] || clients[i]->clientState != ClientStateRunning))
continue; continue;
FindClientResourcesByType(clients[i], RT_PIXMAP, pixmap_unref_fb, FindClientResourcesByType(clients[i], RT_PIXMAP,
pRADEONEnt); client_pixmap_unref_fb, pScreen);
} }
pixmap_unref_fb(pScreen->GetScreenPixmap(pScreen), None, pRADEONEnt); pixmap_unref_fb(pScreen->GetScreenPixmap(pScreen));
} else { } else {
memset(info->front_buffer->bo.radeon->ptr, 0, memset(info->front_buffer->bo.radeon->ptr, 0,
pScrn->displayWidth * info->pixel_bytes * pScrn->virtualY); pScrn->displayWidth * 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); xf86_hide_cursors (pScrn);
radeon_drop_drm_master(pScrn); radeon_drop_drm_master(pScrn);

View File

@ -254,6 +254,7 @@ radeon_present_check_flip(RRCrtcPtr crtc, WindowPtr window, PixmapPtr pixmap,
xf86CrtcPtr xf86_crtc = crtc->devPrivate; xf86CrtcPtr xf86_crtc = crtc->devPrivate;
ScreenPtr screen = window->drawable.pScreen; ScreenPtr screen = window->drawable.pScreen;
ScrnInfoPtr scrn = xf86_crtc->scrn; ScrnInfoPtr scrn = xf86_crtc->scrn;
struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap);
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
RADEONInfoPtr info = RADEONPTR(scrn); RADEONInfoPtr info = RADEONPTR(scrn);
PixmapPtr screen_pixmap = screen->GetScreenPixmap(screen); PixmapPtr screen_pixmap = screen->GetScreenPixmap(screen);
@ -277,6 +278,23 @@ radeon_present_check_flip(RRCrtcPtr crtc, WindowPtr window, PixmapPtr pixmap,
return FALSE; return FALSE;
#endif #endif
if (priv && priv->fb_failed)
return FALSE;
if (!radeon_pixmap_get_fb(pixmap)) {
if (!priv)
priv = radeon_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;
}
/* The kernel driver doesn't handle flipping between BOs with different /* The kernel driver doesn't handle flipping between BOs with different
* tiling parameters correctly yet * tiling parameters correctly yet
*/ */