Module: Mesa Branch: main Commit: 46396e97bea603a5cef8177b66a760a11a78af2a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=46396e97bea603a5cef8177b66a760a11a78af2a
Author: Dmitry Osipenko <[email protected]> Date: Fri Aug 5 16:30:22 2022 +0300 virgl: Fix unmapping of blob resources OpenGL API calls like glClearBufferData() result in mapping/unmapping of a given buffer by Mesa and unmapping of a host blob fails in virglrenderer because VirGL driver uses command that is intended for unmapping of a guest buffer. In particular this causes problem for the "Total War: Warhammer" game that gets GL_OUT_OF_MEMORY error due to the failed unmapping command. Fix this by setting the mapping usage flag in accordance to the resource flags, allowing virgl_buffer_transfer_unmap() to differentiate host buffer from guest. Fixes: 3b54e5837a152364 ("virgl: support PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT") Signed-off-by: Dmitry Osipenko <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17914> --- src/gallium/drivers/virgl/virgl_resource.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/gallium/drivers/virgl/virgl_resource.c b/src/gallium/drivers/virgl/virgl_resource.c index 6e3ff80e9e4..461c1768ed8 100644 --- a/src/gallium/drivers/virgl/virgl_resource.c +++ b/src/gallium/drivers/virgl/virgl_resource.c @@ -493,6 +493,18 @@ virgl_resource_transfer_map(struct pipe_context *ctx, /* Multisampled resources require resolve before mapping. */ assert(resource->nr_samples <= 1); + /* If virgl resource was created using persistence and coherency flags, + * then its memory mapping can be only made in accordance to these + * flags. We record the "usage" flags in struct virgl_transfer and + * then virgl_buffer_transfer_unmap() uses them to differentiate + * unmapping of a host blob resource from guest. + */ + if (resource->flags & PIPE_RESOURCE_FLAG_MAP_PERSISTENT) + usage |= PIPE_MAP_PERSISTENT; + + if (resource->flags & PIPE_RESOURCE_FLAG_MAP_COHERENT) + usage |= PIPE_MAP_COHERENT; + trans = virgl_resource_create_transfer(vctx, resource, &vres->metadata, level, usage, box);
