[Intel-gfx] [PATCH xf86-video-intel] sna: Forcibly relinquish the GPU bo cache of a SHM pixmap on flushing
Alexei Podtelezhnikov
apodtele at gmail.com
Fri Apr 17 19:26:22 UTC 2020
On Fri, Apr 17, 2020 at 10:05 AM Chris Wilson <chris at chris-wilson.co.uk> wrote:
>
> Before we indicate return control of the SHM Pixmap to the client (that
> is prior to the next XReply), we ensure that the original SHM buffer is
> uptodate with any changes made on the GPU. We must flush the GPU writes
> back to the CPU and so not allow ourselves to keep the dirty cache of
> the CPU bo.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Alexei Podtelezhnikov <apodtele at gmail.com>
The failed assertion is gone.
Tested-by: Alexei Podtelezhnikov <apodtele at gmail.com>
> ---
> src/sna/sna_accel.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
> index edbfe5a4a..6e14cf7b4 100644
> --- a/src/sna/sna_accel.c
> +++ b/src/sna/sna_accel.c
> @@ -2119,6 +2119,11 @@ static inline bool operate_inplace(struct sna_pixmap *priv, unsigned flags)
> if (!USE_INPLACE)
> return false;
>
> + if (flags & __MOVE_FORCE) {
> + DBG(("%s: no, inplace operation denied by force\n", __FUNCTION__));
> + return false;
> + }
> +
> if ((flags & MOVE_INPLACE_HINT) == 0) {
> DBG(("%s: no, inplace operation not suitable\n", __FUNCTION__));
> return false;
> @@ -2327,7 +2332,7 @@ skip_inplace_map:
>
> sna_pixmap_unmap(pixmap, priv);
>
> - if (USE_INPLACE &&
> + if (USE_INPLACE && !(flags & __MOVE_FORCE) &&
> (flags & MOVE_WRITE ? (void *)priv->gpu_bo : (void *)priv->gpu_damage) && priv->cpu_damage == NULL &&
> priv->gpu_bo->tiling == I915_TILING_NONE &&
> (flags & MOVE_READ || kgem_bo_can_map__cpu(&sna->kgem, priv->gpu_bo, flags & MOVE_WRITE)) &&
> @@ -17409,7 +17414,10 @@ void sna_accel_flush(struct sna *sna)
> priv->pixmap->refcnt));
> assert(!priv->flush);
> ret = sna_pixmap_move_to_cpu(priv->pixmap,
> - MOVE_READ | MOVE_WRITE);
> + MOVE_READ |
> + MOVE_WRITE |
> + MOVE_WHOLE_HINT |
> + __MOVE_FORCE);
> assert(!ret || priv->gpu_bo == NULL);
> if (priv->pixmap->refcnt == 0) {
> sna_damage_destroy(&priv->cpu_damage);
> --
> 2.26.0
>
More information about the Intel-gfx
mailing list