mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 09:28:07 +02:00
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: 3b54e5837a ("virgl: support PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT")
Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17914>
This commit is contained in:
parent
b731be2e96
commit
46396e97be
1 changed files with 12 additions and 0 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue