From: Michel Dänzer <[email protected]> Fixes garbage being intermittently visible during a screen resize.
(Ported from radeon commit 80f3d727f93cb6efedd2b39338d2301035965fe2) Signed-off-by: Michel Dänzer <[email protected]> --- src/amdgpu_drv.h | 1 + src/amdgpu_glamor_wrappers.c | 9 +++++++++ src/drmmode_display.c | 21 ++++++++++++++++++--- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/amdgpu_drv.h b/src/amdgpu_drv.h index 7194a48..3a8144f 100644 --- a/src/amdgpu_drv.h +++ b/src/amdgpu_drv.h @@ -206,6 +206,7 @@ typedef struct { uint_fast32_t gpu_flushed; uint_fast32_t gpu_synced; Bool use_glamor; + Bool force_accel; Bool shadow_primary; Bool tear_free; diff --git a/src/amdgpu_glamor_wrappers.c b/src/amdgpu_glamor_wrappers.c index 8edfde0..7ff2f30 100644 --- a/src/amdgpu_glamor_wrappers.c +++ b/src/amdgpu_glamor_wrappers.c @@ -428,9 +428,17 @@ amdgpu_glamor_poly_fill_rect(DrawablePtr pDrawable, GCPtr pGC, int nrect, xRectangle *prect) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); + AMDGPUInfoPtr info = AMDGPUPTR(scrn); PixmapPtr pixmap = get_drawable_pixmap(pDrawable); struct amdgpu_pixmap *priv = amdgpu_get_pixmap_private(pixmap); + if ((info->force_accel || amdgpu_glamor_use_gpu(pixmap)) && + amdgpu_glamor_prepare_access_gpu(priv)) { + info->glamor.SavedPolyFillRect(pDrawable, pGC, nrect, prect); + amdgpu_glamor_finish_access_gpu_rw(info, priv); + return; + } + if (amdgpu_glamor_prepare_access_cpu_rw(scrn, pixmap, priv)) { if (amdgpu_glamor_prepare_access_gc(scrn, pGC)) { fbPolyFillRect(pDrawable, pGC, nrect, prect); @@ -629,6 +637,7 @@ amdgpu_glamor_validate_gc(GCPtr pGC, unsigned long changes, DrawablePtr pDrawabl glamor_validate_gc(pGC, changes, pDrawable); info->glamor.SavedCopyArea = pGC->ops->CopyArea; + info->glamor.SavedPolyFillRect = pGC->ops->PolyFillRect; if (amdgpu_get_pixmap_private(get_drawable_pixmap(pDrawable)) || (pGC->stipple && amdgpu_get_pixmap_private(pGC->stipple)) || diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 161c2ca..98dd3b1 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -1541,6 +1541,8 @@ static Bool drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) uint32_t bo_handle; void *fb_shadow; int hint = 0; + xRectangle rect; + GCPtr gc; if (scrn->virtualX == width && scrn->virtualY == height) return TRUE; @@ -1614,6 +1616,22 @@ static Bool drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr; #endif + if (info->use_glamor) + amdgpu_glamor_create_screen_resources(scrn->pScreen); + + /* Clear new buffer */ + gc = GetScratchGC(ppix->drawable.depth, scrn->pScreen); + ValidateGC(&ppix->drawable, gc); + rect.x = 0; + rect.y = 0; + rect.width = width; + rect.height = height; + info->force_accel = TRUE; + (*gc->ops->PolyFillRect)(&ppix->drawable, gc, 1, &rect); + info->force_accel = FALSE; + FreeScratchGC(gc); + amdgpu_glamor_flush(scrn); + for (i = 0; i < xf86_config->num_crtc; i++) { xf86CrtcPtr crtc = xf86_config->crtc[i]; @@ -1624,9 +1642,6 @@ static Bool drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) crtc->rotation, crtc->x, crtc->y); } - if (info->use_glamor) - amdgpu_glamor_create_screen_resources(scrn->pScreen); - if (old_fb_id) drmModeRmFB(drmmode->fd, old_fb_id); if (old_front) { -- 2.5.0 _______________________________________________ xorg-driver-ati mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-driver-ati
