diff options
author | Chia-I Wu <[email protected]> | 2019-05-09 21:44:33 -0700 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2019-06-17 09:36:31 -0700 |
commit | 1fece5fa5f8284076d923be6937d9115055a533e (patch) | |
tree | 298fa1f76de034c3b1971c80355a6fae56919bb9 /src/gallium/drivers/virgl/virgl_buffer.c | |
parent | 9975a0a84ca2ee18a0f051df44932bd7b2284a02 (diff) |
virgl: better support for PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE
When the resource to be mapped is busy and the backing storage can
be discarded, reallocate the backing storage to avoid waiting.
In this new path, we allocate a new buffer, emit a state change,
write, and add the transfer to the queue . In the
PIPE_TRANSFER_DISCARD_RANGE path, we suballocate a staging buffer,
write, and emit a copy_transfer (which may allocate, memcpy, and
blit internally). The win might not always be clear. But another
win comes from that the new path clears res->valid_buffer_range and
does not clear res->clean_mask. This makes it much more preferable
in scenarios such as
access = enough_space ? GL_MAP_UNSYNCHRONIZED_BIT :
GL_MAP_INVALIDATE_BUFFER_BIT;
glMapBufferRange(..., GL_MAP_WRITE_BIT | access);
memcpy(...); // append new data
glUnmapBuffer(...);
Signed-off-by: Chia-I Wu <[email protected]>
Reviewed-by: Alexandros Frantzis <[email protected]>
Diffstat (limited to 'src/gallium/drivers/virgl/virgl_buffer.c')
-rw-r--r-- | src/gallium/drivers/virgl/virgl_buffer.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/gallium/drivers/virgl/virgl_buffer.c b/src/gallium/drivers/virgl/virgl_buffer.c index ddb632db483..ed001722ab4 100644 --- a/src/gallium/drivers/virgl/virgl_buffer.c +++ b/src/gallium/drivers/virgl/virgl_buffer.c @@ -47,6 +47,13 @@ static void *virgl_buffer_transfer_map(struct pipe_context *ctx, map_type = virgl_resource_transfer_prepare(vctx, trans); switch (map_type) { + case VIRGL_TRANSFER_MAP_REALLOC: + if (!virgl_resource_realloc(vctx, vbuf)) { + map_addr = NULL; + break; + } + vs->vws->resource_reference(vs->vws, &trans->hw_res, vbuf->hw_res); + /* fall through */ case VIRGL_TRANSFER_MAP_HW_RES: trans->hw_res_map = vs->vws->resource_map(vs->vws, vbuf->hw_res); if (trans->hw_res_map) |