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@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@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>
This commit is contained in:
Thomas Hellstrom 2020-03-31 09:10:17 +02:00 committed by Thomas Hellstrom (VMware)
parent 46fdc288fb
commit 15a9f6c072
2 changed files with 7 additions and 18 deletions

View File

@ -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);

View File

@ -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);
}
}
}
}