Mesa (master): svga: Treat forced coherent maps as maps of persistent memory

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Apr 1 07:44:56 UTC 2020


Module: Mesa
Branch: master
Commit: 15a9f6c07228f59401954bb18b9c2f980297f634
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=15a9f6c07228f59401954bb18b9c2f980297f634

Author: Thomas Hellstrom <thellstrom at vmware.com>
Date:   Tue Mar 31 09:10:17 2020 +0200

svga: Treat forced coherent maps as maps of persistent memory

A previous commit made sure we sent a BindGBSurface command at map time
rather than at unmap time for persistent memory. To be consistent, do the
same for forced coherent maps. This makes it possible to avoid the
explicit UpdateGBSurface at unmap time for discard maps and to instead rely
on the kernel's dirty-tracking mechanism at the cost of an additional flush.

Tested with SVGA_FORCE_COHERENT=1, piglit run quick. No regressions.

Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
Reviewed-by: Brian Paul <brianp at vmware.com>
Reviewed-by: Charmaine Lee <charmainel at vmware.com>
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4399>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4399>

---

 src/gallium/drivers/svga/svga_resource_buffer.h  | 12 +++---------
 src/gallium/drivers/svga/svga_resource_texture.c | 13 ++++---------
 2 files changed, 7 insertions(+), 18 deletions(-)

diff --git a/src/gallium/drivers/svga/svga_resource_buffer.h b/src/gallium/drivers/svga/svga_resource_buffer.h
index b3559446fa9..bd219742e68 100644
--- a/src/gallium/drivers/svga/svga_resource_buffer.h
+++ b/src/gallium/drivers/svga/svga_resource_buffer.h
@@ -289,6 +289,9 @@ svga_buffer_hw_storage_map(struct svga_context *svga,
       boolean rebind;
       void *map;
 
+      if (swc->force_coherent) {
+         flags |= PIPE_TRANSFER_PERSISTENT | PIPE_TRANSFER_COHERENT;
+      }
       map = swc->surface_map(swc, sbuf->handle, flags, retry, &rebind);
       if (map && rebind) {
          enum pipe_error ret;
@@ -330,15 +333,6 @@ svga_buffer_hw_storage_unmap(struct svga_context *svga,
             ret = SVGA3D_BindGBSurface(swc, sbuf->handle);
             assert(ret == PIPE_OK);
          }
-         if (swc->force_coherent) {
-            ret = SVGA3D_UpdateGBSurface(swc, sbuf->handle);
-            if (ret != PIPE_OK) {
-               /* flush and retry */
-               svga_context_flush(svga, NULL);
-               ret = SVGA3D_UpdateGBSurface(swc, sbuf->handle);
-               assert(ret == PIPE_OK);
-            }
-         }
       }
    } else
       sws->buffer_unmap(sws, sbuf->hwbuf);
diff --git a/src/gallium/drivers/svga/svga_resource_texture.c b/src/gallium/drivers/svga/svga_resource_texture.c
index 58b2f64d0b7..2385da2e999 100644
--- a/src/gallium/drivers/svga/svga_resource_texture.c
+++ b/src/gallium/drivers/svga/svga_resource_texture.c
@@ -462,6 +462,10 @@ svga_texture_transfer_map_direct(struct svga_context *svga,
       unsigned offset, mip_width, mip_height;
       struct svga_winsys_context *swc = svga->swc;
 
+      if (swc->force_coherent) {
+         usage |= PIPE_TRANSFER_PERSISTENT | PIPE_TRANSFER_COHERENT;
+      }
+
       map = swc->surface_map(swc, surf, usage, &retry, &rebind);
       if (map == NULL && retry) {
          /*
@@ -709,15 +713,6 @@ svga_texture_surface_unmap(struct svga_context *svga,
          ret = SVGA3D_BindGBSurface(swc, surf);
          assert(ret == PIPE_OK);
       }
-      if (swc->force_coherent) {
-         ret = SVGA3D_UpdateGBSurface(swc, surf);
-         if (ret != PIPE_OK) {
-            /* flush and retry */
-            svga_context_flush(svga, NULL);
-            ret = SVGA3D_UpdateGBSurface(swc, surf);
-            assert(ret == PIPE_OK);
-         }
-      }
    }
 }
 



More information about the mesa-commit mailing list