Timo Aaltonen pushed to branch debian-unstable at X Strike Force / driver / xserver-xorg-video-ati
Commits:
-
77d7abf4
by Michel Dänzer at 2019-01-28T17:00:20Z
-
6d1dfe25
by Michel Dänzer at 2019-01-28T17:04:41Z
-
27470308
by Michel Dänzer at 2019-01-28T17:06:50Z
-
dcd35272
by Michel Dänzer at 2019-01-28T17:08:35Z
-
1bfdccf7
by Michel Dänzer at 2019-01-28T17:11:10Z
-
227123de
by Michel Dänzer at 2019-01-28T17:24:41Z
-
15697ee2
by Michel Dänzer at 2019-02-11T11:12:34Z
-
705020b6
by Michel Dänzer at 2019-03-01T17:23:30Z
-
c301b8af
by Michel Dänzer at 2019-03-04T16:07:14Z
-
0d132d99
by Michel Dänzer at 2019-03-06T16:48:42Z
-
35d08acf
by Timo Aaltonen at 2019-03-07T08:43:06Z
-
bc0dc2bf
by Timo Aaltonen at 2019-03-07T08:44:04Z
9 changed files:
- configure.ac
- debian/changelog
- src/drmmode_display.c
- src/radeon_dri2.c
- src/radeon_dri3.c
- src/radeon_drm_queue.c
- src/radeon_glamor.c
- src/radeon_kms.c
- src/radeon_present.c
Changes:
| ... | ... | @@ -23,7 +23,7 @@ |
| 23 | 23 |
# Initialize Autoconf
|
| 24 | 24 |
AC_PREREQ([2.60])
|
| 25 | 25 |
AC_INIT([xf86-video-ati],
|
| 26 |
- [18.1.99],
|
|
| 26 |
+ [19.0.0],
|
|
| 27 | 27 |
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/Radeon],
|
| 28 | 28 |
[xf86-video-ati])
|
| 29 | 29 |
|
| 1 |
+xserver-xorg-video-ati (1:19.0.0-1) UNRELEASED; urgency=medium
|
|
| 2 |
+ |
|
| 3 |
+ * New upstream release.
|
|
| 4 |
+ |
|
| 5 |
+ -- Timo Aaltonen <tjaalton@debian.org> Thu, 07 Mar 2019 10:43:13 +0200
|
|
| 6 |
+ |
|
| 1 | 7 |
xserver-xorg-video-ati (1:18.1.99+git20190207-1) unstable; urgency=medium
|
| 2 | 8 |
|
| 3 | 9 |
* New upstream snapshot.
|
| ... | ... | @@ -2651,12 +2651,14 @@ drmmode_flip_handler(xf86CrtcPtr crtc, uint32_t frame, uint64_t usec, void *even |
| 2651 | 2651 |
flipdata->fe_usec = usec;
|
| 2652 | 2652 |
}
|
| 2653 | 2653 |
|
| 2654 |
- if (drmmode_crtc->flip_pending == *fb) {
|
|
| 2655 |
- drmmode_fb_reference(pRADEONEnt->fd,
|
|
| 2656 |
- &drmmode_crtc->flip_pending, NULL);
|
|
| 2654 |
+ if (*fb) {
|
|
| 2655 |
+ if (drmmode_crtc->flip_pending == *fb) {
|
|
| 2656 |
+ drmmode_fb_reference(pRADEONEnt->fd,
|
|
| 2657 |
+ &drmmode_crtc->flip_pending, NULL);
|
|
| 2658 |
+ }
|
|
| 2659 |
+ drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->fb, *fb);
|
|
| 2660 |
+ drmmode_fb_reference(pRADEONEnt->fd, fb, NULL);
|
|
| 2657 | 2661 |
}
|
| 2658 |
- drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->fb, *fb);
|
|
| 2659 |
- drmmode_fb_reference(pRADEONEnt->fd, fb, NULL);
|
|
| 2660 | 2662 |
|
| 2661 | 2663 |
if (--flipdata->flip_count == 0) {
|
| 2662 | 2664 |
/* Deliver MSC & UST from reference/current CRTC to flip event
|
| ... | ... | @@ -3492,9 +3494,10 @@ Bool radeon_do_pageflip(ScrnInfoPtr scrn, ClientPtr client, |
| 3492 | 3494 |
drmmode_crtc->ignore_damage = TRUE;
|
| 3493 | 3495 |
}
|
| 3494 | 3496 |
|
| 3495 |
- next:
|
|
| 3496 | 3497 |
drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->flip_pending,
|
| 3497 | 3498 |
flipdata->fb[crtc_id]);
|
| 3499 |
+ |
|
| 3500 |
+ next:
|
|
| 3498 | 3501 |
drm_queue_seq = 0;
|
| 3499 | 3502 |
}
|
| 3500 | 3503 |
|
| ... | ... | @@ -252,6 +252,12 @@ radeon_dri2_create_buffer2(ScreenPtr pScreen, |
| 252 | 252 |
} else if (is_glamor_pixmap) {
|
| 253 | 253 |
pixmap = radeon_glamor_set_pixmap_bo(drawable, pixmap);
|
| 254 | 254 |
pixmap->refcnt++;
|
| 255 |
+ |
|
| 256 |
+ /* The copy operation from radeon_glamor_set_pixmap_bo needs to
|
|
| 257 |
+ * be flushed to the kernel driver before the client starts
|
|
| 258 |
+ * using the pixmap storage for direct rendering.
|
|
| 259 |
+ */
|
|
| 260 |
+ radeon_cs_flush_indirect(pScrn);
|
|
| 255 | 261 |
}
|
| 256 | 262 |
|
| 257 | 263 |
if (!radeon_get_flink_name(pRADEONEnt, pixmap, &buffers->name))
|
| ... | ... | @@ -973,12 +979,18 @@ CARD32 radeon_dri2_deferred_event(OsTimerPtr timer, CARD32 now, pointer data) |
| 973 | 979 |
if (ret) {
|
| 974 | 980 |
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
| 975 | 981 |
"%s cannot get current time\n", __func__);
|
| 976 |
- if (event_info->drm_queue_seq)
|
|
| 982 |
+ |
|
| 983 |
+ if (event_info->drm_queue_seq) {
|
|
| 977 | 984 |
drmmode_crtc->drmmode->event_context.
|
| 978 | 985 |
vblank_handler(pRADEONEnt->fd, 0, 0, 0,
|
| 979 | 986 |
(void*)event_info->drm_queue_seq);
|
| 980 |
- else
|
|
| 987 |
+ drmmode_crtc->wait_flip_nesting_level++;
|
|
| 988 |
+ radeon_drm_queue_handle_deferred(crtc);
|
|
| 989 |
+ |
|
| 990 |
+ } else {
|
|
| 981 | 991 |
radeon_dri2_frame_event_handler(crtc, 0, 0, data);
|
| 992 |
+ }
|
|
| 993 |
+ |
|
| 982 | 994 |
return 0;
|
| 983 | 995 |
}
|
| 984 | 996 |
/*
|
| ... | ... | @@ -989,13 +1001,18 @@ CARD32 radeon_dri2_deferred_event(OsTimerPtr timer, CARD32 now, pointer data) |
| 989 | 1001 |
delta_seq = delta_t * drmmode_crtc->dpms_last_fps;
|
| 990 | 1002 |
delta_seq /= 1000000;
|
| 991 | 1003 |
frame = (CARD64)drmmode_crtc->dpms_last_seq + delta_seq;
|
| 992 |
- if (event_info->drm_queue_seq)
|
|
| 1004 |
+ |
|
| 1005 |
+ if (event_info->drm_queue_seq) {
|
|
| 993 | 1006 |
drmmode_crtc->drmmode->event_context.
|
| 994 | 1007 |
vblank_handler(pRADEONEnt->fd, frame, drm_now / 1000000,
|
| 995 | 1008 |
drm_now % 1000000,
|
| 996 | 1009 |
(void*)event_info->drm_queue_seq);
|
| 997 |
- else
|
|
| 1010 |
+ drmmode_crtc->wait_flip_nesting_level++;
|
|
| 1011 |
+ radeon_drm_queue_handle_deferred(crtc);
|
|
| 1012 |
+ } else {
|
|
| 998 | 1013 |
radeon_dri2_frame_event_handler(crtc, frame, drm_now, data);
|
| 1014 |
+ }
|
|
| 1015 |
+ |
|
| 999 | 1016 |
return 0;
|
| 1000 | 1017 |
}
|
| 1001 | 1018 |
|
| ... | ... | @@ -37,6 +37,7 @@ |
| 37 | 37 |
#include <sys/types.h>
|
| 38 | 38 |
#include <sys/stat.h>
|
| 39 | 39 |
#include <fcntl.h>
|
| 40 |
+#include <gbm.h>
|
|
| 40 | 41 |
#include <errno.h>
|
| 41 | 42 |
#include <libgen.h>
|
| 42 | 43 |
|
| ... | ... | @@ -218,8 +219,34 @@ static int radeon_dri3_fd_from_pixmap(ScreenPtr screen, |
| 218 | 219 |
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
|
| 219 | 220 |
RADEONInfoPtr info = RADEONPTR(scrn);
|
| 220 | 221 |
|
| 221 |
- if (info->use_glamor)
|
|
| 222 |
- return glamor_fd_from_pixmap(screen, pixmap, stride, size);
|
|
| 222 |
+ if (info->use_glamor) {
|
|
| 223 |
+ Bool need_flush = TRUE;
|
|
| 224 |
+ int ret = -1;
|
|
| 225 |
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,19,99,904,0)
|
|
| 226 |
+ struct gbm_bo *gbm_bo = glamor_gbm_bo_from_pixmap(screen, pixmap);
|
|
| 227 |
+ |
|
| 228 |
+ if (gbm_bo) {
|
|
| 229 |
+ ret = gbm_bo_get_fd(gbm_bo);
|
|
| 230 |
+ gbm_bo_destroy(gbm_bo);
|
|
| 231 |
+ |
|
| 232 |
+ if (ret >= 0)
|
|
| 233 |
+ need_flush = FALSE;
|
|
| 234 |
+ }
|
|
| 235 |
+#endif
|
|
| 236 |
+ |
|
| 237 |
+ if (ret < 0)
|
|
| 238 |
+ ret = glamor_fd_from_pixmap(screen, pixmap, stride, size);
|
|
| 239 |
+ |
|
| 240 |
+ /* glamor might have needed to reallocate the pixmap storage and
|
|
| 241 |
+ * copy the pixmap contents to the new storage. The copy
|
|
| 242 |
+ * operation needs to be flushed to the kernel driver before the
|
|
| 243 |
+ * client starts using the pixmap storage for direct rendering.
|
|
| 244 |
+ */
|
|
| 245 |
+ if (ret >= 0 && need_flush)
|
|
| 246 |
+ radeon_cs_flush_indirect(scrn);
|
|
| 247 |
+ |
|
| 248 |
+ return ret;
|
|
| 249 |
+ }
|
|
| 223 | 250 |
#endif
|
| 224 | 251 |
|
| 225 | 252 |
bo = radeon_get_pixmap_bo(pixmap);
|
| ... | ... | @@ -30,6 +30,8 @@ |
| 30 | 30 |
#include "config.h"
|
| 31 | 31 |
#endif
|
| 32 | 32 |
|
| 33 |
+#include <errno.h>
|
|
| 34 |
+ |
|
| 33 | 35 |
#include <xorg-server.h>
|
| 34 | 36 |
#include <X11/Xdefs.h>
|
| 35 | 37 |
#include <list.h>
|
| ... | ... | @@ -277,7 +279,20 @@ radeon_drm_handle_event(int fd, drmEventContext *event_context) |
| 277 | 279 |
struct radeon_drm_queue_entry *e;
|
| 278 | 280 |
int r;
|
| 279 | 281 |
|
| 280 |
- r = drmHandleEvent(fd, event_context);
|
|
| 282 |
+ /* Retry drmHandleEvent if it was interrupted by a signal in read() */
|
|
| 283 |
+ do {
|
|
| 284 |
+ r = drmHandleEvent(fd, event_context);
|
|
| 285 |
+ } while (r < 0 && (errno == EINTR || errno == EAGAIN));
|
|
| 286 |
+ |
|
| 287 |
+ if (r < 0) {
|
|
| 288 |
+ static Bool printed;
|
|
| 289 |
+ |
|
| 290 |
+ if (!printed) {
|
|
| 291 |
+ ErrorF("%s: drmHandleEvent returned %d, errno=%d (%s)\n",
|
|
| 292 |
+ __func__, r, errno, strerror(errno));
|
|
| 293 |
+ printed = TRUE;
|
|
| 294 |
+ }
|
|
| 295 |
+ }
|
|
| 281 | 296 |
|
| 282 | 297 |
while (!xorg_list_is_empty(&radeon_drm_flip_signalled)) {
|
| 283 | 298 |
e = xorg_list_first_entry(&radeon_drm_flip_signalled,
|
| ... | ... | @@ -310,7 +325,7 @@ void radeon_drm_wait_pending_flip(xf86CrtcPtr crtc) |
| 310 | 325 |
|
| 311 | 326 |
while (drmmode_crtc->flip_pending
|
| 312 | 327 |
&& radeon_drm_handle_event(pRADEONEnt->fd,
|
| 313 |
- &drmmode_crtc->drmmode->event_context) > 0);
|
|
| 328 |
+ &drmmode_crtc->drmmode->event_context) >= 0);
|
|
| 314 | 329 |
}
|
| 315 | 330 |
|
| 316 | 331 |
/*
|
| ... | ... | @@ -238,7 +238,7 @@ radeon_glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth, |
| 238 | 238 |
if (info->shadow_primary) {
|
| 239 | 239 |
if (usage != CREATE_PIXMAP_USAGE_BACKING_PIXMAP)
|
| 240 | 240 |
return fbCreatePixmap(screen, w, h, depth, usage);
|
| 241 |
- } else {
|
|
| 241 |
+ } else if (usage != CREATE_PIXMAP_USAGE_BACKING_PIXMAP) {
|
|
| 242 | 242 |
pixmap = glamor_create_pixmap(screen, w, h, depth, usage);
|
| 243 | 243 |
if (pixmap)
|
| 244 | 244 |
return pixmap;
|
| ... | ... | @@ -526,10 +526,14 @@ radeon_scanout_flip_abort(xf86CrtcPtr crtc, void *event_data) |
| 526 | 526 |
{
|
| 527 | 527 |
RADEONEntPtr pRADEONEnt = RADEONEntPriv(crtc->scrn);
|
| 528 | 528 |
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
|
| 529 |
+ struct drmmode_fb *fb = event_data;
|
|
| 529 | 530 |
|
| 530 | 531 |
drmmode_crtc->scanout_update_pending = 0;
|
| 531 |
- drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->flip_pending,
|
|
| 532 |
- NULL);
|
|
| 532 |
+ |
|
| 533 |
+ if (drmmode_crtc->flip_pending == fb) {
|
|
| 534 |
+ drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->flip_pending,
|
|
| 535 |
+ NULL);
|
|
| 536 |
+ }
|
|
| 533 | 537 |
}
|
| 534 | 538 |
|
| 535 | 539 |
static void
|
| ... | ... | @@ -538,9 +542,9 @@ radeon_scanout_flip_handler(xf86CrtcPtr crtc, uint32_t msc, uint64_t usec, |
| 538 | 542 |
{
|
| 539 | 543 |
RADEONEntPtr pRADEONEnt = RADEONEntPriv(crtc->scrn);
|
| 540 | 544 |
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
|
| 545 |
+ struct drmmode_fb *fb = event_data;
|
|
| 541 | 546 |
|
| 542 |
- drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->fb,
|
|
| 543 |
- drmmode_crtc->flip_pending);
|
|
| 547 |
+ drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->fb, fb);
|
|
| 544 | 548 |
radeon_scanout_flip_abort(crtc, event_data);
|
| 545 | 549 |
}
|
| 546 | 550 |
|
| ... | ... | @@ -821,24 +825,31 @@ radeon_prime_scanout_flip(PixmapDirtyUpdatePtr ent) |
| 821 | 825 |
drmmode_crtc_private_ptr drmmode_crtc;
|
| 822 | 826 |
uintptr_t drm_queue_seq;
|
| 823 | 827 |
unsigned scanout_id;
|
| 828 |
+ struct drmmode_fb *fb;
|
|
| 824 | 829 |
|
| 825 | 830 |
if (!crtc || !crtc->enabled)
|
| 826 | 831 |
return;
|
| 827 | 832 |
|
| 828 | 833 |
drmmode_crtc = crtc->driver_private;
|
| 834 |
+ scanout_id = drmmode_crtc->scanout_id ^ 1;
|
|
| 829 | 835 |
if (drmmode_crtc->scanout_update_pending ||
|
| 830 |
- !drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap ||
|
|
| 836 |
+ !drmmode_crtc->scanout[scanout_id].pixmap ||
|
|
| 831 | 837 |
drmmode_crtc->dpms_mode != DPMSModeOn)
|
| 832 | 838 |
return;
|
| 833 | 839 |
|
| 834 |
- scanout_id = drmmode_crtc->scanout_id ^ 1;
|
|
| 835 | 840 |
if (!radeon_prime_scanout_do_update(crtc, scanout_id))
|
| 836 | 841 |
return;
|
| 837 | 842 |
|
| 843 |
+ fb = radeon_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap);
|
|
| 844 |
+ if (!fb) {
|
|
| 845 |
+ xf86DrvMsg(scrn->scrnIndex, X_WARNING,
|
|
| 846 |
+ "Failed to get FB for PRIME flip.\n");
|
|
| 847 |
+ return;
|
|
| 848 |
+ }
|
|
| 849 |
+
|
|
| 838 | 850 |
drm_queue_seq = radeon_drm_queue_alloc(crtc,
|
| 839 | 851 |
RADEON_DRM_QUEUE_CLIENT_DEFAULT,
|
| 840 |
- RADEON_DRM_QUEUE_ID_DEFAULT,
|
|
| 841 |
- NULL,
|
|
| 852 |
+ RADEON_DRM_QUEUE_ID_DEFAULT, fb,
|
|
| 842 | 853 |
radeon_scanout_flip_handler,
|
| 843 | 854 |
radeon_scanout_flip_abort, TRUE);
|
| 844 | 855 |
if (drm_queue_seq == RADEON_DRM_QUEUE_ERROR) {
|
| ... | ... | @@ -847,18 +858,9 @@ radeon_prime_scanout_flip(PixmapDirtyUpdatePtr ent) |
| 847 | 858 |
return;
|
| 848 | 859 |
}
|
| 849 | 860 |
|
| 850 |
- drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->flip_pending,
|
|
| 851 |
- radeon_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap));
|
|
| 852 |
- if (!drmmode_crtc->flip_pending) {
|
|
| 853 |
- xf86DrvMsg(scrn->scrnIndex, X_WARNING,
|
|
| 854 |
- "Failed to get FB for PRIME flip.\n");
|
|
| 855 |
- radeon_drm_abort_entry(drm_queue_seq);
|
|
| 856 |
- return;
|
|
| 857 |
- }
|
|
| 858 |
- |
|
| 859 | 861 |
if (drmmode_page_flip_target_relative(pRADEONEnt, drmmode_crtc,
|
| 860 |
- drmmode_crtc->flip_pending->handle,
|
|
| 861 |
- 0, drm_queue_seq, 0) != 0) {
|
|
| 862 |
+ fb->handle, 0, drm_queue_seq, 1)
|
|
| 863 |
+ != 0) {
|
|
| 862 | 864 |
if (!(drmmode_crtc->scanout_status & DRMMODE_SCANOUT_FLIP_FAILED)) {
|
| 863 | 865 |
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
|
| 864 | 866 |
"flip queue failed in %s: %s, TearFree inactive\n",
|
| ... | ... | @@ -877,6 +879,7 @@ radeon_prime_scanout_flip(PixmapDirtyUpdatePtr ent) |
| 877 | 879 |
|
| 878 | 880 |
drmmode_crtc->scanout_id = scanout_id;
|
| 879 | 881 |
drmmode_crtc->scanout_update_pending = drm_queue_seq;
|
| 882 |
+ drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->flip_pending, fb);
|
|
| 880 | 883 |
}
|
| 881 | 884 |
|
| 882 | 885 |
static void
|
| ... | ... | @@ -1137,6 +1140,7 @@ radeon_scanout_flip(ScreenPtr pScreen, RADEONInfoPtr info, |
| 1137 | 1140 |
RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn);
|
| 1138 | 1141 |
uintptr_t drm_queue_seq;
|
| 1139 | 1142 |
unsigned scanout_id;
|
| 1143 |
+ struct drmmode_fb *fb;
|
|
| 1140 | 1144 |
|
| 1141 | 1145 |
if (drmmode_crtc->scanout_update_pending ||
|
| 1142 | 1146 |
drmmode_crtc->flip_pending ||
|
| ... | ... | @@ -1152,10 +1156,16 @@ radeon_scanout_flip(ScreenPtr pScreen, RADEONInfoPtr info, |
| 1152 | 1156 |
radeon_cs_flush_indirect(scrn);
|
| 1153 | 1157 |
RegionEmpty(region);
|
| 1154 | 1158 |
|
| 1159 |
+ fb = radeon_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap);
|
|
| 1160 |
+ if (!fb) {
|
|
| 1161 |
+ xf86DrvMsg(scrn->scrnIndex, X_WARNING,
|
|
| 1162 |
+ "Failed to get FB for scanout flip.\n");
|
|
| 1163 |
+ return;
|
|
| 1164 |
+ }
|
|
| 1165 |
+ |
|
| 1155 | 1166 |
drm_queue_seq = radeon_drm_queue_alloc(xf86_crtc,
|
| 1156 | 1167 |
RADEON_DRM_QUEUE_CLIENT_DEFAULT,
|
| 1157 |
- RADEON_DRM_QUEUE_ID_DEFAULT,
|
|
| 1158 |
- NULL,
|
|
| 1168 |
+ RADEON_DRM_QUEUE_ID_DEFAULT, fb,
|
|
| 1159 | 1169 |
radeon_scanout_flip_handler,
|
| 1160 | 1170 |
radeon_scanout_flip_abort, TRUE);
|
| 1161 | 1171 |
if (drm_queue_seq == RADEON_DRM_QUEUE_ERROR) {
|
| ... | ... | @@ -1164,18 +1174,9 @@ radeon_scanout_flip(ScreenPtr pScreen, RADEONInfoPtr info, |
| 1164 | 1174 |
return;
|
| 1165 | 1175 |
}
|
| 1166 | 1176 |
|
| 1167 |
- drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->flip_pending,
|
|
| 1168 |
- radeon_pixmap_get_fb(drmmode_crtc->scanout[scanout_id].pixmap));
|
|
| 1169 |
- if (!drmmode_crtc->flip_pending) {
|
|
| 1170 |
- xf86DrvMsg(scrn->scrnIndex, X_WARNING,
|
|
| 1171 |
- "Failed to get FB for scanout flip.\n");
|
|
| 1172 |
- radeon_drm_abort_entry(drm_queue_seq);
|
|
| 1173 |
- return;
|
|
| 1174 |
- }
|
|
| 1175 |
- |
|
| 1176 | 1177 |
if (drmmode_page_flip_target_relative(pRADEONEnt, drmmode_crtc,
|
| 1177 |
- drmmode_crtc->flip_pending->handle,
|
|
| 1178 |
- 0, drm_queue_seq, 0) != 0) {
|
|
| 1178 |
+ fb->handle, 0, drm_queue_seq, 1)
|
|
| 1179 |
+ != 0) {
|
|
| 1179 | 1180 |
if (!(drmmode_crtc->scanout_status & DRMMODE_SCANOUT_FLIP_FAILED)) {
|
| 1180 | 1181 |
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
|
| 1181 | 1182 |
"flip queue failed in %s: %s, TearFree inactive\n",
|
| ... | ... | @@ -1201,6 +1202,7 @@ radeon_scanout_flip(ScreenPtr pScreen, RADEONInfoPtr info, |
| 1201 | 1202 |
|
| 1202 | 1203 |
drmmode_crtc->scanout_id = scanout_id;
|
| 1203 | 1204 |
drmmode_crtc->scanout_update_pending = drm_queue_seq;
|
| 1205 |
+ drmmode_fb_reference(pRADEONEnt->fd, &drmmode_crtc->flip_pending, fb);
|
|
| 1204 | 1206 |
}
|
| 1205 | 1207 |
|
| 1206 | 1208 |
static void RADEONBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL)
|
| ... | ... | @@ -256,7 +256,7 @@ radeon_present_check_flip(RRCrtcPtr crtc, WindowPtr window, PixmapPtr pixmap, |
| 256 | 256 |
ScrnInfoPtr scrn = xf86_crtc->scrn;
|
| 257 | 257 |
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
|
| 258 | 258 |
RADEONInfoPtr info = RADEONPTR(scrn);
|
| 259 |
- PixmapPtr screen_pixmap;
|
|
| 259 |
+ PixmapPtr screen_pixmap = screen->GetScreenPixmap(screen);
|
|
| 260 | 260 |
int num_crtcs_on;
|
| 261 | 261 |
int i;
|
| 262 | 262 |
|
| ... | ... | @@ -272,10 +272,14 @@ radeon_present_check_flip(RRCrtcPtr crtc, WindowPtr window, PixmapPtr pixmap, |
| 272 | 272 |
if (info->drmmode.dri2_flipping)
|
| 273 | 273 |
return FALSE;
|
| 274 | 274 |
|
| 275 |
+#if XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(1, 20, 99, 1, 0)
|
|
| 276 |
+ if (pixmap->devKind != screen_pixmap->devKind)
|
|
| 277 |
+ return FALSE;
|
|
| 278 |
+#endif
|
|
| 279 |
+ |
|
| 275 | 280 |
/* The kernel driver doesn't handle flipping between BOs with different
|
| 276 | 281 |
* tiling parameters correctly yet
|
| 277 | 282 |
*/
|
| 278 |
- screen_pixmap = screen->GetScreenPixmap(screen);
|
|
| 279 | 283 |
if (radeon_present_get_pixmap_tiling_flags(info, pixmap) !=
|
| 280 | 284 |
radeon_present_get_pixmap_tiling_flags(info, screen_pixmap))
|
| 281 | 285 |
return FALSE;
|