On Wed, Apr 22, 2015 at 5:45 AM, Michel Dänzer <[email protected]> wrote: > From: Michel Dänzer <[email protected]> > > Fixes garbage being intermittently visible during a screen resize. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=27757#c7 > Signed-off-by: Michel Dänzer <[email protected]>
Reviewed-by: Alex Deucher <[email protected]> > --- > src/drmmode_display.c | 23 ++++++++++++++++++++--- > src/radeon.h | 1 + > src/radeon_glamor_wrappers.c | 9 +++++++++ > 3 files changed, 30 insertions(+), 3 deletions(-) > > diff --git a/src/drmmode_display.c b/src/drmmode_display.c > index 326d863..5af5900 100644 > --- a/src/drmmode_display.c > +++ b/src/drmmode_display.c > @@ -1766,6 +1766,9 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, > int height) > uint32_t tiling_flags = 0, base_align; > PixmapPtr ppix = screen->GetScreenPixmap(screen); > void *fb_shadow; > + xRectangle rect; > + Bool force; > + GCPtr gc; > > if (scrn->virtualX == width && scrn->virtualY == height) > return TRUE; > @@ -1909,6 +1912,23 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, > int height) > scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr; > #endif > > + if (info->use_glamor) > + radeon_glamor_create_screen_resources(scrn->pScreen); > + > + /* Clear new buffer */ > + gc = GetScratchGC(ppix->drawable.depth, scrn->pScreen); > + force = info->accel_state->force; > + info->accel_state->force = TRUE; > + ValidateGC(&ppix->drawable, gc); > + rect.x = 0; > + rect.y = 0; > + rect.width = width; > + rect.height = height; > + (*gc->ops->PolyFillRect)(&ppix->drawable, gc, 1, &rect); > + FreeScratchGC(gc); > + info->accel_state->force = force; > + radeon_cs_flush_indirect(scrn); > + > for (i = 0; i < xf86_config->num_crtc; i++) { > xf86CrtcPtr crtc = xf86_config->crtc[i]; > > @@ -1919,9 +1939,6 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, > int height) > crtc->rotation, crtc->x, crtc->y); > } > > - if (info->use_glamor) > - radeon_glamor_create_screen_resources(scrn->pScreen); > - > if (old_fb_id) > drmModeRmFB(drmmode->fd, old_fb_id); > if (old_front) > diff --git a/src/radeon.h b/src/radeon.h > index cd03d53..7feed04 100644 > --- a/src/radeon.h > +++ b/src/radeon.h > @@ -544,6 +544,7 @@ typedef struct { > CreateGCProcPtr SavedCreateGC; > RegionPtr (*SavedCopyArea)(DrawablePtr, DrawablePtr, GCPtr, int, int, > int, int, int, int); > + void (*SavedPolyFillRect)(DrawablePtr, GCPtr, int, xRectangle*); > CloseScreenProcPtr SavedCloseScreen; > GetImageProcPtr SavedGetImage; > GetSpansProcPtr SavedGetSpans; > diff --git a/src/radeon_glamor_wrappers.c b/src/radeon_glamor_wrappers.c > index db2e85f..7a57bc1 100644 > --- a/src/radeon_glamor_wrappers.c > +++ b/src/radeon_glamor_wrappers.c > @@ -421,9 +421,17 @@ radeon_glamor_poly_fill_rect(DrawablePtr pDrawable, > GCPtr pGC, > int nrect, xRectangle *prect) > { > ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); > + RADEONInfoPtr info = RADEONPTR(scrn); > PixmapPtr pixmap = get_drawable_pixmap(pDrawable); > struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); > > + if ((info->accel_state->force || (priv && !priv->bo)) && > + radeon_glamor_prepare_access_gpu(priv)) { > + info->glamor.SavedPolyFillRect(pDrawable, pGC, nrect, prect); > + radeon_glamor_finish_access_gpu_rw(info, priv); > + return; > + } > + > if (radeon_glamor_prepare_access_cpu_rw(scrn, pixmap, priv)) { > if (radeon_glamor_prepare_access_gc(scrn, pGC)) { > fbPolyFillRect(pDrawable, pGC, nrect, prect); > @@ -622,6 +630,7 @@ radeon_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 (radeon_get_pixmap_private(get_drawable_pixmap(pDrawable)) || > (pGC->stipple && radeon_get_pixmap_private(pGC->stipple)) || > -- > 2.1.4 > > _______________________________________________ > xorg-driver-ati mailing list > [email protected] > http://lists.x.org/mailman/listinfo/xorg-driver-ati _______________________________________________ xorg-driver-ati mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-driver-ati
