From 69c52a8fb3fde3043a7627c9f22160514df3a05b Mon Sep 17 00:00:00 2001 From: Alexandros Frantzis Date: Fri, 17 May 2019 14:55:46 +0300 Subject: [PATCH] vrend: Internal support for synchronized transfers Add an internal mechanism to support synchronized transfers. This will be used in upcoming commits to perform synchronized resource maps if the transfer type requires it. Signed-off-by: Alexandros Frantzis Reviewed-by: Chia-I Wu Reviewed-by: Gurchetan Singh --- src/virglrenderer.c | 2 ++ src/vrend_decode.c | 1 + src/vrend_renderer.c | 6 +++++- src/vrend_renderer.h | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/virglrenderer.c b/src/virglrenderer.c index 4a1c527..706b809 100644 --- a/src/virglrenderer.c +++ b/src/virglrenderer.c @@ -132,6 +132,7 @@ int virgl_renderer_transfer_write_iov(uint32_t handle, transfer_info.iovec = iovec; transfer_info.iovec_cnt = iovec_cnt; transfer_info.context0 = true; + transfer_info.synchronized = false; return vrend_renderer_transfer_iov(&transfer_info, VIRGL_TRANSFER_TO_HOST); } @@ -155,6 +156,7 @@ int virgl_renderer_transfer_read_iov(uint32_t handle, uint32_t ctx_id, transfer_info.iovec = iovec; transfer_info.iovec_cnt = iovec_cnt; transfer_info.context0 = true; + transfer_info.synchronized = false; return vrend_renderer_transfer_iov(&transfer_info, VIRGL_TRANSFER_FROM_HOST); } diff --git a/src/vrend_decode.c b/src/vrend_decode.c index b3fc7df..7dd901e 100644 --- a/src/vrend_decode.c +++ b/src/vrend_decode.c @@ -374,6 +374,7 @@ static int vrend_decode_resource_inline_write(struct vrend_decode_ctx *ctx, uint if (length + ctx->ds->buf_offset > ctx->ds->buf_total) return EINVAL; + memset(&info, 0, sizeof(info)); info.box = &box; vrend_decode_transfer_common(ctx, &info); data_len = (length - 11) * 4; diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index cd25dc0..dc09587 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -6494,12 +6494,16 @@ static int vrend_renderer_transfer_write_iov(struct vrend_context *ctx, } if (res->storage == VREND_RESOURCE_STORAGE_BUFFER) { + GLuint map_flags = GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_WRITE_BIT; struct virgl_sub_upload_data d; d.box = info->box; d.target = res->target; + if (!info->synchronized) + map_flags |= GL_MAP_UNSYNCHRONIZED_BIT; + glBindBufferARB(res->target, res->id); - data = glMapBufferRange(res->target, info->box->x, info->box->width, GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_WRITE_BIT); + data = glMapBufferRange(res->target, info->box->x, info->box->width, map_flags); if (data == NULL) { vrend_printf("map failed for element buffer\n"); vrend_read_from_iovec_cb(iov, num_iovs, info->offset, info->box->width, &iov_buffer_upload, &d); diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h index a595b3b..ce9704f 100644 --- a/src/vrend_renderer.h +++ b/src/vrend_renderer.h @@ -110,6 +110,7 @@ struct vrend_transfer_info { uint64_t offset; bool context0; struct pipe_box *box; + bool synchronized; }; struct vrend_if_cbs {