aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/winsys
diff options
context:
space:
mode:
authorThomas Hellstrom <[email protected]>2020-03-28 18:02:25 +0100
committerThomas Hellstrom (VMware) <[email protected]>2020-04-01 08:38:04 +0200
commit46fdc288fb52345134fd9aacd6d7ff71c7b747bb (patch)
tree3d1a381738634955e77541a39520fe38e3e393be /src/gallium/winsys
parent1b16d6354bc9f64ed97fc400977e3ffcb4c09268 (diff)
svga, winsys/svga: Fix persistent memory discard maps
The kernel driver requires immediate notification using a BindGBSurface command when a graphics coherent memory resource changes backing MOB, so that it can start dirty-tracking the new MOB. Since we always use graphics coherent memory for persistent memory, enqueue and flush a BindGBSurface commmand at map time rather than at unmap time. Since we're dealing with persistent memory, It's OK to flush while mapped. This fixes an issue with gnome-shell / Wayland which uses persistent memory together with discard maps when we advertise ARB_buffer_storage. XWayland clients will render incorrectly. Fixes: 71b43490dd ("svga: Support ARB_buffer_storage") Signed-off-by: Thomas Hellstrom <[email protected]> Reviewed-by: Neha Bhende <[email protected]> Reviewed-by: Brian Paul <[email protected]> Reviewed-by: Reviewed-by: Roland Scheidegger <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4399>
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r--src/gallium/winsys/svga/drm/vmw_surface.c10
-rw-r--r--src/gallium/winsys/svga/drm/vmw_surface.h5
2 files changed, 12 insertions, 3 deletions
diff --git a/src/gallium/winsys/svga/drm/vmw_surface.c b/src/gallium/winsys/svga/drm/vmw_surface.c
index 6aa09e11b76..698cd11a28e 100644
--- a/src/gallium/winsys/svga/drm/vmw_surface.c
+++ b/src/gallium/winsys/svga/drm/vmw_surface.c
@@ -38,7 +38,8 @@
void *
vmw_svga_winsys_surface_map(struct svga_winsys_context *swc,
struct svga_winsys_surface *srf,
- unsigned flags, boolean *retry)
+ unsigned flags, boolean *retry,
+ boolean *rebind)
{
struct vmw_svga_winsys_surface *vsrf = vmw_svga_winsys_surface(srf);
void *data = NULL;
@@ -47,6 +48,7 @@ vmw_svga_winsys_surface_map(struct svga_winsys_context *swc,
struct vmw_winsys_screen *vws = vsrf->screen;
*retry = FALSE;
+ *rebind = FALSE;
assert((flags & (PIPE_TRANSFER_READ | PIPE_TRANSFER_WRITE)) != 0);
mtx_lock(&vsrf->mutex);
@@ -121,6 +123,12 @@ vmw_svga_winsys_surface_map(struct svga_winsys_context *swc,
if (vsrf->buf)
vmw_svga_winsys_buffer_destroy(&vws->base, vsrf->buf);
vsrf->buf = vbuf;
+
+ /* Rebind persistent maps immediately */
+ if (flags & PIPE_TRANSFER_PERSISTENT) {
+ *rebind = TRUE;
+ vsrf->rebind = FALSE;
+ }
goto out_mapped;
} else
vmw_svga_winsys_buffer_destroy(&vws->base, vbuf);
diff --git a/src/gallium/winsys/svga/drm/vmw_surface.h b/src/gallium/winsys/svga/drm/vmw_surface.h
index b1a1ce746b3..ab75fed5f97 100644
--- a/src/gallium/winsys/svga/drm/vmw_surface.h
+++ b/src/gallium/winsys/svga/drm/vmw_surface.h
@@ -88,8 +88,9 @@ vmw_svga_winsys_surface_reference(struct vmw_svga_winsys_surface **pdst,
struct vmw_svga_winsys_surface *src);
void *
vmw_svga_winsys_surface_map(struct svga_winsys_context *swc,
- struct svga_winsys_surface *srf,
- unsigned flags, boolean *retry);
+ struct svga_winsys_surface *srf,
+ unsigned flags, boolean *retry,
+ boolean *rebind);
void
vmw_svga_winsys_surface_unmap(struct svga_winsys_context *swc,
struct svga_winsys_surface *srf,