From 46396e97bea603a5cef8177b66a760a11a78af2a Mon Sep 17 00:00:00 2001 From: Dmitry Osipenko Date: Fri, 5 Aug 2022 16:30:22 +0300 Subject: [PATCH] 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 Part-of: --- 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);