diff options
-rw-r--r-- | src/gallium/drivers/virgl/virgl_buffer.c | 21 | ||||
-rw-r--r-- | src/gallium/drivers/virgl/virgl_resource.c | 3 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/gallium/drivers/virgl/virgl_buffer.c b/src/gallium/drivers/virgl/virgl_buffer.c index fb97ce15aae..b0684bcbf57 100644 --- a/src/gallium/drivers/virgl/virgl_buffer.c +++ b/src/gallium/drivers/virgl/virgl_buffer.c @@ -78,6 +78,27 @@ static void *virgl_buffer_transfer_map(struct pipe_context *ctx, return NULL; } + /* For the checks below to be able to use 'usage', we assume that + * transfer preparation doesn't affect the usage. + */ + assert(usage == trans->base.usage); + + /* If we are doing a whole resource discard with a hw_res map, the buffer + * storage can now be considered unused and we don't care about previous + * contents. We can thus mark the storage as uninitialized, but only if the + * buffer is not host writable (in which case we can't clear the valid + * range, since that would result in missed readbacks in future transfers). + * We only do this for VIRGL_TRANSFER_MAP_HW_RES, since for + * VIRGL_TRANSFER_MAP_REALLOC we already take care of the buffer range when + * reallocating and rebinding, and VIRGL_TRANSFER_MAP_STAGING is not + * currently used for whole resource discards. + */ + if (map_type == VIRGL_TRANSFER_MAP_HW_RES && + (usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) && + (vbuf->clean_mask & 1)) { + util_range_set_empty(&vbuf->valid_buffer_range); + } + if (usage & PIPE_TRANSFER_WRITE) util_range_add(&vbuf->valid_buffer_range, box->x, box->x + box->width); diff --git a/src/gallium/drivers/virgl/virgl_resource.c b/src/gallium/drivers/virgl/virgl_resource.c index 6199257a7c8..c47a154f400 100644 --- a/src/gallium/drivers/virgl/virgl_resource.c +++ b/src/gallium/drivers/virgl/virgl_resource.c @@ -655,6 +655,9 @@ virgl_resource_realloc(struct virgl_context *vctx, struct virgl_resource *res) vs->vws->resource_reference(vs->vws, &res->hw_res, NULL); res->hw_res = hw_res; + /* We can safely clear the range here, since it will be repopulated in the + * following rebind operation, according to the active buffer binds. + */ util_range_set_empty(&res->valid_buffer_range); /* count toward the staging resource size limit */ |