From 05a2cea14c4c77024b2e38fda3f15a3eb5de4098 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Sat, 29 Jan 2022 06:09:36 +0000 Subject: [PATCH] venus: no roundtrip needed for shmem backed by BLOB_MEM_HOST3D A successful DRM_IOCTL_VIRTGPU_MAP on BLOB_MEM_HOST3D implies a roundtrip. Signed-off-by: Yiwei Zhang Reviewed-by: Chia-I Wu Reviewed-by: Ryan Neph Part-of: --- src/virtio/vulkan/vn_command_buffer.c | 4 +++- src/virtio/vulkan/vn_cs.c | 16 ++++++++++------ src/virtio/vulkan/vn_cs.h | 2 ++ src/virtio/vulkan/vn_instance.c | 8 ++++++-- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index 00d5193c7ae..f4914775913 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -689,7 +689,9 @@ vn_cmd_submit(struct vn_command_buffer *cmd) return VK_ERROR_OUT_OF_HOST_MEMORY; } - vn_instance_wait_roundtrip(instance, cmd->cs.current_buffer_roundtrip); + if (unlikely(!instance->renderer->info.supports_blob_id_0)) + vn_instance_wait_roundtrip(instance, cmd->cs.current_buffer_roundtrip); + VkResult result = vn_instance_ring_submit(instance, &cmd->cs); if (result != VK_SUCCESS) { cmd->state = VN_COMMAND_BUFFER_STATE_INVALID; diff --git a/src/virtio/vulkan/vn_cs.c b/src/virtio/vulkan/vn_cs.c index d1c8a9baa6e..d56bfe22c49 100644 --- a/src/virtio/vulkan/vn_cs.c +++ b/src/virtio/vulkan/vn_cs.c @@ -232,17 +232,21 @@ vn_cs_encoder_reserve_internal(struct vn_cs_encoder *enc, size_t size) if (!shmem) return false; - uint32_t roundtrip; - VkResult result = vn_instance_submit_roundtrip(enc->instance, &roundtrip); - if (result != VK_SUCCESS) { - vn_renderer_shmem_unref(enc->instance->renderer, shmem); - return false; + if (unlikely(!enc->instance->renderer->info.supports_blob_id_0)) { + uint32_t roundtrip; + VkResult result = + vn_instance_submit_roundtrip(enc->instance, &roundtrip); + if (result != VK_SUCCESS) { + vn_renderer_shmem_unref(enc->instance->renderer, shmem); + return false; + } + + enc->current_buffer_roundtrip = roundtrip; } vn_cs_encoder_add_buffer(enc, shmem, buf_offset, shmem->mmap_ptr + buf_offset, buf_size); enc->current_buffer_size = buf_size; - enc->current_buffer_roundtrip = roundtrip; vn_cs_encoder_sanity_check(enc); diff --git a/src/virtio/vulkan/vn_cs.h b/src/virtio/vulkan/vn_cs.h index 989b0f5d433..3a04738fee1 100644 --- a/src/virtio/vulkan/vn_cs.h +++ b/src/virtio/vulkan/vn_cs.h @@ -65,6 +65,8 @@ struct vn_cs_encoder { /* the current buffer is buffers[buffer_count - 1].shmem */ size_t current_buffer_size; + + /* TODO remove when blob_id_0 support gets required */ uint32_t current_buffer_roundtrip; /* cur is the write pointer. When cur passes end, the slow path is diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c index 9ba98e340f8..6ebf5061f33 100644 --- a/src/virtio/vulkan/vn_instance.c +++ b/src/virtio/vulkan/vn_instance.c @@ -491,7 +491,9 @@ vn_instance_ring_cs_upload_locked(struct vn_instance *instance, vn_cs_encoder_write(upload, cs_size, cs_data, cs_size); vn_cs_encoder_commit(upload); - vn_instance_wait_roundtrip(instance, upload->current_buffer_roundtrip); + + if (unlikely(!instance->renderer->info.supports_blob_id_0)) + vn_instance_wait_roundtrip(instance, upload->current_buffer_roundtrip); return upload; } @@ -582,7 +584,9 @@ vn_instance_get_reply_shmem_locked(struct vn_instance *instance, * created */ if (likely(instance->ring.id)) { - vn_instance_roundtrip(instance); + if (unlikely(!instance->renderer->info.supports_blob_id_0)) + vn_instance_roundtrip(instance); + vn_instance_ring_submit_locked(instance, &local_enc, NULL, NULL); } else { vn_renderer_submit_simple(instance->renderer,