Mesa (master): winsys/svga: fix display corruption after surface_init
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Aug 21 18:13:15 UTC 2020
Module: Mesa
Branch: master
Commit: f41848a9df3c6eb81059edfd63347584790e0a3a
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f41848a9df3c6eb81059edfd63347584790e0a3a
Author: Charmaine Lee <charmainel at vmware.com>
Date: Thu Aug 20 16:43:00 2020 -0700
winsys/svga: fix display corruption after surface_init
When we initialize the buffer surface, do not map the existing storage
with DONTBLOCK, leave it as a synchronized map.
This patch also sets the surface rebind flag after it is bound to a
new buffer and sets the surface buffer pointer accordingly.
This fixes display corruption issue seen with running steam.
Reviewed-by: Neha Bhende <bhenden at vmware.com>
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6415>
---
.../drivers/svga/svga_resource_buffer_upload.c | 10 +++----
src/gallium/winsys/svga/drm/vmw_surface.c | 33 ++++++++++++----------
2 files changed, 23 insertions(+), 20 deletions(-)
diff --git a/src/gallium/drivers/svga/svga_resource_buffer_upload.c b/src/gallium/drivers/svga/svga_resource_buffer_upload.c
index 78535643563..fecc1ae54d0 100644
--- a/src/gallium/drivers/svga/svga_resource_buffer_upload.c
+++ b/src/gallium/drivers/svga/svga_resource_buffer_upload.c
@@ -229,12 +229,12 @@ svga_buffer_create_host_surface(struct svga_screen *ss,
/* Add the new surface to the buffer surface list */
ret = svga_buffer_add_host_surface(sbuf, sbuf->handle, &sbuf->key,
bind_flags);
- }
- if (ss->sws->have_gb_objects) {
- /* Initialize the surface with zero */
- ss->sws->surface_init(ss->sws, sbuf->handle, svga_surface_size(&sbuf->key),
- sbuf->key.flags);
+ if (ss->sws->have_gb_objects) {
+ /* Initialize the surface with zero */
+ ss->sws->surface_init(ss->sws, sbuf->handle, svga_surface_size(&sbuf->key),
+ sbuf->key.flags);
+ }
}
return ret;
diff --git a/src/gallium/winsys/svga/drm/vmw_surface.c b/src/gallium/winsys/svga/drm/vmw_surface.c
index f6f40fcdf20..25c6d320c74 100644
--- a/src/gallium/winsys/svga/drm/vmw_surface.c
+++ b/src/gallium/winsys/svga/drm/vmw_surface.c
@@ -44,15 +44,15 @@ vmw_svga_winsys_surface_init(struct svga_winsys_screen *sws,
struct pb_buffer *pb_buf;
uint32_t pb_flags;
struct vmw_winsys_screen *vws = vsrf->screen;
- pb_flags = PIPE_TRANSFER_READ_WRITE | PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE;
+ pb_flags = PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE;
struct pb_manager *provider;
struct pb_desc desc;
- data = vmw_svga_winsys_buffer_map(&vws->base, vsrf->buf,
- PIPE_TRANSFER_DONTBLOCK | pb_flags);
+ mtx_lock(&vsrf->mutex);
+ data = vmw_svga_winsys_buffer_map(&vws->base, vsrf->buf, pb_flags);
if (data)
- goto out_unlock;
+ goto out_mapped;
provider = vws->pools.mob_fenced;
memset(&desc, 0, sizeof(desc));
@@ -64,24 +64,25 @@ vmw_svga_winsys_surface_init(struct svga_winsys_screen *sws,
data = vmw_svga_winsys_buffer_map(&vws->base, vbuf, pb_flags);
if (data) {
- if (vsrf->buf) {
+ vsrf->rebind = TRUE;
+ if (vsrf->buf)
vmw_svga_winsys_buffer_destroy(&vws->base, vsrf->buf);
- vsrf->buf = vbuf;
- goto out_unlock;
- } else
- vmw_svga_winsys_buffer_destroy(&vws->base, vbuf);
+ vsrf->buf = vbuf;
+ goto out_mapped;
+ } else {
+ vmw_svga_winsys_buffer_destroy(&vws->base, vbuf);
+ goto out_unlock;
}
}
-
- data = vmw_svga_winsys_buffer_map(&vws->base, vsrf->buf, pb_flags);
- if (data == NULL)
+ else {
+ /* Cannot create a buffer, just unlock */
goto out_unlock;
+ }
-out_unlock:
+out_mapped:
mtx_unlock(&vsrf->mutex);
- if (data)
- {
+ if (data) {
if (flags & SVGA3D_SURFACE_BIND_STREAM_OUTPUT) {
memset(data, 0, surf_size + sizeof(SVGA3dDXSOState));
}
@@ -89,8 +90,10 @@ out_unlock:
memset(data, 0, surf_size);
}
}
+
mtx_lock(&vsrf->mutex);
vmw_svga_winsys_buffer_unmap(&vsrf->screen->base, vsrf->buf);
+out_unlock:
mtx_unlock(&vsrf->mutex);
}
More information about the mesa-commit
mailing list