On Tue, Jul 10, 2018 at 11:24 AM, Michel Dänzer <michel at daenzer.net> wrote: > From: Michel Dänzer <michel.daenzer at amd.com> > > Instead of only the BOs. > > This matches what amdgpu does, and fixes issues with DRI2 page flipping. > > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > src/radeon_dri2.c | 42 +++++++++++++++++++++++------------------- > 1 file changed, 23 insertions(+), 19 deletions(-) > > diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c > index ab3db6c5e..70ad1d92a 100644 > --- a/src/radeon_dri2.c > +++ b/src/radeon_dri2.c > @@ -720,9 +720,8 @@ radeon_dri2_exchange_buffers(DrawablePtr draw, DRI2BufferPtr front, DRI2BufferPt > { > struct dri2_buffer_priv *front_priv = front->driverPrivate; > struct dri2_buffer_priv *back_priv = back->driverPrivate; > - struct radeon_buffer *front_buffer, *back_buffer; > - ScreenPtr screen; > - RADEONInfoPtr info; > + ScreenPtr screen = draw->pScreen; > + RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(screen)); > RegionRec region; > int tmp; > > @@ -737,23 +736,28 @@ radeon_dri2_exchange_buffers(DrawablePtr draw, DRI2BufferPtr front, DRI2BufferPt > front->name = back->name; > back->name = tmp; > > - /* Swap pixmap bos */ > - front_buffer = radeon_get_pixmap_bo(front_priv->pixmap); > - back_buffer = radeon_get_pixmap_bo(back_priv->pixmap); > - radeon_set_pixmap_bo(front_priv->pixmap, back_buffer); > - radeon_set_pixmap_bo(back_priv->pixmap, front_buffer); > - > - /* Do we need to update the Screen? */ > - screen = draw->pScreen; > - info = RADEONPTR(xf86ScreenToScrn(screen)); > - if (front_buffer == info->front_buffer) { > - radeon_buffer_ref(back_buffer); > - radeon_buffer_unref(&info->front_buffer); > - info->front_buffer = back_buffer; > - radeon_set_pixmap_bo(screen->GetScreenPixmap(screen), back_buffer); > - } > + /* Swap pixmap privates */ > +#ifdef USE_GLAMOR > + if (info->use_glamor) { > + struct radeon_pixmap *front_pix, *back_pix; > + > + front_pix = radeon_get_pixmap_private(front_priv->pixmap); > + back_pix = radeon_get_pixmap_private(back_priv->pixmap); > + radeon_set_pixmap_private(front_priv->pixmap, back_pix); > + radeon_set_pixmap_private(back_priv->pixmap, front_pix); > > - radeon_glamor_exchange_buffers(front_priv->pixmap, back_priv->pixmap); > + radeon_glamor_exchange_buffers(front_priv->pixmap, back_priv->pixmap); > + } else > +#endif > + { > + struct radeon_exa_pixmap_priv driver_priv = *(struct radeon_exa_pixmap_priv*) > + exaGetPixmapDriverPrivate(front_priv->pixmap); > + > + *(struct radeon_exa_pixmap_priv*)exaGetPixmapDriverPrivate(front_priv->pixmap) = > + *(struct radeon_exa_pixmap_priv*)exaGetPixmapDriverPrivate(back_priv->pixmap); > + *(struct radeon_exa_pixmap_priv*)exaGetPixmapDriverPrivate(back_priv->pixmap) = > + driver_priv; > + } > > DamageRegionProcessPending(&front_priv->pixmap->drawable); > } > -- > 2.18.0 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx