diff --git a/src/gallium/drivers/virgl/virgl_buffer.c b/src/gallium/drivers/virgl/virgl_buffer.c index 061836aa5a1..63bf078020e 100644 --- a/src/gallium/drivers/virgl/virgl_buffer.c +++ b/src/gallium/drivers/virgl/virgl_buffer.c @@ -33,8 +33,10 @@ static void virgl_buffer_transfer_unmap(struct pipe_context *ctx, { struct virgl_context *vctx = virgl_context(ctx); struct virgl_transfer *trans = virgl_transfer(transfer); + bool persistent_coherent = trans->base.usage & (PIPE_MAP_PERSISTENT | + PIPE_MAP_COHERENT); - if (trans->base.usage & PIPE_MAP_WRITE) { + if ((trans->base.usage & PIPE_MAP_WRITE) && !persistent_coherent) { if (transfer->usage & PIPE_MAP_FLUSH_EXPLICIT) { if (trans->range.end <= trans->range.start) { virgl_resource_destroy_transfer(vctx, trans); diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index b7cd406dbca..526aca505c5 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -291,6 +291,10 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param) return !!(vscreen->caps.caps.v2.capability_bits & VIRGL_CAP_MULTI_DRAW_INDIRECT); case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS: return !!(vscreen->caps.caps.v2.capability_bits & VIRGL_CAP_INDIRECT_PARAMS); + case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT: + return (vscreen->caps.caps.v2.capability_bits & VIRGL_CAP_ARB_BUFFER_STORAGE) && + (vscreen->caps.caps.v2.host_feature_check_version >= 4) && + vscreen->vws->supports_coherent; case PIPE_CAP_PCI_GROUP: case PIPE_CAP_PCI_BUS: case PIPE_CAP_PCI_DEVICE: diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c index bca47da2805..27225346b35 100644 --- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c +++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c @@ -369,9 +369,17 @@ virgl_drm_winsys_resource_cache_create(struct virgl_winsys *qws, mtx_unlock(&qdws->mutex); alloc: - res = virgl_drm_winsys_resource_create(qws, target, format, bind, - width, height, depth, array_size, - last_level, nr_samples, size, false); + if (flags & (VIRGL_RESOURCE_FLAG_MAP_PERSISTENT | + VIRGL_RESOURCE_FLAG_MAP_COHERENT)) + res = virgl_drm_winsys_resource_create_blob(qws, target, format, bind, + width, height, depth, + array_size, last_level, + nr_samples, flags, size); + else + res = virgl_drm_winsys_resource_create(qws, target, format, bind, width, + height, depth, array_size, + last_level, nr_samples, size, + false); return res; }