<html>
    <head>
      <base href="https://bugs.freedesktop.org/" />
    </head>
    <body>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_ASSIGNED "
   title="ASSIGNED --- - 62102f505cd13840e4 causes icon corruption in thunar"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=80560#c21">Comment # 21</a>
              on <a class="bz_bug_link 
          bz_status_ASSIGNED "
   title="ASSIGNED --- - 62102f505cd13840e4 causes icon corruption in thunar"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=80560">bug 80560</a>
              from <span class="vcard"><a class="email" href="mailto:chris@chris-wilson.co.uk" title="Chris Wilson <chris@chris-wilson.co.uk>"> <span class="fn">Chris Wilson</span></a>
</span></b>
        <pre>I think I understand the bug now. I changed the transfer from GPU bo to CPU bo
paths, but missed that implied a change in synchronisation requirement. This
fixes the bug, but I want to see if I can choose the allocation flags more
accurately before committing;


diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index dd5c108..6efc5f3 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2157,7 +2157,8 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int
flags)
 skip_inplace_map:
                sna_damage_destroy(&priv->gpu_damage);
                priv->clear = false;
-               if (priv->cpu_bo && !priv->cpu_bo->flush &&
+               if ((flags & MOVE_ASYNC_HINT) == 0 &&
+                   priv->cpu_bo && !priv->cpu_bo->flush &&
                    __kgem_bo_is_busy(&sna->kgem, priv->cpu_bo)) {
                        DBG(("%s: discarding busy CPU bo\n", __FUNCTION__));
                        assert(!priv->shm);
@@ -2269,8 +2270,8 @@ skip_inplace_map:

        assert(priv->mapped == MAPPED_NONE);
        if (pixmap->devPrivate.ptr == NULL &&
-           !sna_pixmap_alloc_cpu(sna, pixmap, priv,
-                                 flags & MOVE_READ ? priv->gpu_damage &&
!priv->clear : 0))
+           !sna_pixmap_alloc_cpu(sna, pixmap, priv, 0))
+                                 //((flags & (MOVE_READ | MOVE_ASYNC_HINT)) ==
MOVE_READ) ? priv->gpu_damage && !priv->clear : 0))
                return false;
        assert(priv->mapped == MAPPED_NONE);
        assert(pixmap->devPrivate.ptr == PTR(priv->ptr));
@@ -2594,7 +2595,7 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
                sna_pixmap_unmap(pixmap, priv);
                assert(priv->mapped == MAPPED_NONE);
                if (pixmap->devPrivate.ptr == NULL &&
-                   !sna_pixmap_alloc_cpu(sna, pixmap, priv, false))
+                   !sna_pixmap_alloc_cpu(sna, pixmap, priv, flags &
MOVE_ASYNC_HINT))
                        return false;
                assert(priv->mapped == MAPPED_NONE);
                assert(pixmap->devPrivate.ptr == PTR(priv->ptr));
@@ -2780,8 +2781,8 @@ move_to_cpu:

        assert(priv->mapped == MAPPED_NONE);
        if (pixmap->devPrivate.ptr == NULL &&
-           !sna_pixmap_alloc_cpu(sna, pixmap, priv,
-                                 flags & MOVE_READ ? priv->gpu_damage &&
!priv->clear : 0)) {
+           !sna_pixmap_alloc_cpu(sna, pixmap, priv, 0)) {
+                                 //flags & MOVE_READ ? priv->gpu_damage &&
!priv->clear : 0)) {
                DBG(("%s: CPU bo allocation failed, trying full move-to-cpu\n",
__FUNCTION__));
                goto move_to_cpu;
        }</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are the QA Contact for the bug.</li>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>