From e0f5020117d0a6340f4208ec52bd3e3b3aa99a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Wed, 14 Mar 2018 16:54:52 +0100 Subject: Pass extents to radeon_scanout_do_update by value radeon_scanout_extents_intersect could leave the scanout damage region in an invalid state, triggering debugging checks in pixman: *** BUG *** In pixman_region_append_non_o: The expression r->x1 < r->x2 was false Set a breakpoint on '_pixman_log_error' to debug (Ported from amdgpu commit 8af989546907ad9fb491d940e1936d3bfc89276b) --- src/drmmode_display.c | 4 ++-- src/radeon.h | 2 +- src/radeon_kms.c | 24 ++++++++++++------------ 3 files changed, 15 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 93261dc8..f056bf3b 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -817,7 +817,7 @@ drmmode_crtc_scanout_update(xf86CrtcPtr crtc, DisplayModePtr mode, radeon_scanout_do_update(crtc, scanout_id, screen->GetWindowPixmap(screen->root), - box); + *box); radeon_bo_wait(drmmode_crtc->scanout[scanout_id].bo); } } @@ -3282,7 +3282,7 @@ Bool radeon_do_pageflip(ScrnInfoPtr scrn, ClientPtr client, } radeon_scanout_do_update(crtc, scanout_id, new_front, - &extents); + extents); drmmode_crtc_wait_pending_event(drmmode_crtc, pRADEONEnt->fd, drmmode_crtc->scanout_update_pending); diff --git a/src/radeon.h b/src/radeon.h index 0815cd98..598a83c1 100644 --- a/src/radeon.h +++ b/src/radeon.h @@ -672,7 +672,7 @@ Bool radeon_dri3_screen_init(ScreenPtr screen); /* radeon_kms.c */ Bool radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id, - PixmapPtr src_pix, BoxPtr extents); + PixmapPtr src_pix, BoxRec extents); void RADEONWindowExposures_oneshot(WindowPtr pWin, RegionPtr pRegion #if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,16,99,901,0) , RegionPtr pBSRegion diff --git a/src/radeon_kms.c b/src/radeon_kms.c index 8c3d15eb..26810e08 100644 --- a/src/radeon_kms.c +++ b/src/radeon_kms.c @@ -903,10 +903,10 @@ radeon_dirty_update(ScrnInfoPtr scrn) Bool radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id, - PixmapPtr src_pix, BoxPtr extents) + PixmapPtr src_pix, BoxRec extents) { drmmode_crtc_private_ptr drmmode_crtc = xf86_crtc->driver_private; - RegionRec region = { .extents = *extents, .data = NULL }; + RegionRec region = { .extents = extents, .data = NULL }; ScrnInfoPtr scrn = xf86_crtc->scrn; ScreenPtr pScreen = scrn->pScreen; RADEONInfoPtr info = RADEONPTR(scrn); @@ -915,11 +915,11 @@ radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id, if (!xf86_crtc->enabled || !drmmode_crtc->scanout[scanout_id].pixmap || - extents->x1 >= extents->x2 || extents->y1 >= extents->y2) + extents.x1 >= extents.x2 || extents.y1 >= extents.y2) return FALSE; pDraw = &drmmode_crtc->scanout[scanout_id].pixmap->drawable; - if (!radeon_scanout_extents_intersect(xf86_crtc, extents)) + if (!radeon_scanout_extents_intersect(xf86_crtc, &extents)) return FALSE; if (drmmode_crtc->tear_free) { @@ -965,9 +965,9 @@ radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id, pScreen->SourceValidate = NULL; CompositePicture(PictOpSrc, src, NULL, dst, - extents->x1, extents->y1, 0, 0, extents->x1, - extents->y1, extents->x2 - extents->x1, - extents->y2 - extents->y1); + extents.x1, extents.y1, 0, 0, extents.x1, + extents.y1, extents.x2 - extents.x1, + extents.y2 - extents.y1); pScreen->SourceValidate = SourceValidate; free_dst: @@ -981,9 +981,9 @@ radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id, ValidateGC(pDraw, gc); (*gc->ops->CopyArea)(&src_pix->drawable, pDraw, gc, - xf86_crtc->x + extents->x1, xf86_crtc->y + extents->y1, - extents->x2 - extents->x1, extents->y2 - extents->y1, - extents->x1, extents->y1); + xf86_crtc->x + extents.x1, xf86_crtc->y + extents.y1, + extents.x2 - extents.x1, extents.y2 - extents.y1, + extents.x1, extents.y1); FreeScratchGC(gc); } @@ -1015,7 +1015,7 @@ radeon_scanout_update_handler(xf86CrtcPtr crtc, uint32_t frame, uint64_t usec, drmmode_crtc->dpms_mode == DPMSModeOn) { if (radeon_scanout_do_update(crtc, drmmode_crtc->scanout_id, screen->GetWindowPixmap(screen->root), - ®ion->extents)) + region->extents)) RegionEmpty(region); } @@ -1096,7 +1096,7 @@ radeon_scanout_flip(ScreenPtr pScreen, RADEONInfoPtr info, scanout_id = drmmode_crtc->scanout_id ^ 1; if (!radeon_scanout_do_update(xf86_crtc, scanout_id, pScreen->GetWindowPixmap(pScreen->root), - ®ion->extents)) + region->extents)) return; RegionEmpty(region); -- cgit v1.2.3