diff options
author | Alexandros Frantzis <[email protected]> | 2019-06-22 01:18:27 +0300 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2019-07-03 09:59:55 -0700 |
commit | e5be4351c2f5cc7a639dc2727e0b38f56b4a2263 (patch) | |
tree | 4560150f342c23c0514bc1365c0f649e8ad694f5 /src/gallium | |
parent | 243db4980c77e9d55b016ea79c4ddf075101bde0 (diff) |
virgl: Clear the valid buffer range when possible
If we are discarding the whole resource, we don't care about previous contents,
and the resource storage is now unused, either because we have created new
resource storage, or because we have waited for the existing resource storage
to become unused, or because the transfer is unsynchronized.
In the last two cases this commit marks the storage as uninitialized, but only
if the resource is not host writable (in which case we can't clear the valid
range, since that would result in missed readbacks in future transfers).
In the first case, when the whole resource discard involves a reallocation, the
reallocation and subsequent rebinding already update the valid buffer range
appropriately.
Signed-off-by: Alexandros Frantzis <[email protected]>
Reviewed-by: Chia-I Wu <[email protected]>
Diffstat (limited to 'src/gallium')
-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 */ |