summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/virgl/virgl_buffer.c21
-rw-r--r--src/gallium/drivers/virgl/virgl_resource.c3
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 */