From d56f65f7ca4f35757e9ef41779181a99360ab806 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Wed, 13 Mar 2024 00:00:12 -0700 Subject: [PATCH] venus: ensure shmem is attached to renderer before use for guest vram For guest vram, there's already roundtrip to protect device memory alloc ordering. This change adds the same protection for shmem used in below scenarios and optimize to wait for new shmem only. - reply shmem - indirect upload shmem - cmd stream shmem Signed-off-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_command_buffer.c | 3 +++ src/virtio/vulkan/vn_cs.c | 16 ++++++++++++++++ src/virtio/vulkan/vn_cs.h | 3 +++ src/virtio/vulkan/vn_ring.c | 7 +++++++ 4 files changed, 29 insertions(+) diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index 0c975301beb..ad3aa627b87 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -1037,6 +1037,9 @@ vn_cmd_submit(struct vn_command_buffer *cmd) return; } + if (vn_cs_encoder_needs_roundtrip(&cmd->cs)) + vn_ring_roundtrip(ring); + if (vn_ring_submit_command_simple(ring, &cmd->cs) != VK_SUCCESS) { cmd->state = VN_COMMAND_BUFFER_STATE_INVALID; return; diff --git a/src/virtio/vulkan/vn_cs.c b/src/virtio/vulkan/vn_cs.c index 9300b123dc4..f1a2b27ee15 100644 --- a/src/virtio/vulkan/vn_cs.c +++ b/src/virtio/vulkan/vn_cs.c @@ -296,3 +296,19 @@ vn_cs_encoder_commit(struct vn_cs_encoder *enc) vn_cs_encoder_sanity_check(enc); } + +bool +vn_cs_encoder_needs_roundtrip(struct vn_cs_encoder *enc) +{ + if (!enc->instance->renderer->info.has_guest_vram) + return false; + + /* check pinned shmems for new shmem allocs */ + for (uint32_t i = 0; i < enc->buffer_count; i++) { + const struct vn_renderer_shmem *shmem = enc->buffers[i].shmem; + if (shmem && !shmem->cache_timestamp) + return true; + } + + return false; +} diff --git a/src/virtio/vulkan/vn_cs.h b/src/virtio/vulkan/vn_cs.h index 2916434d9e6..5624251c901 100644 --- a/src/virtio/vulkan/vn_cs.h +++ b/src/virtio/vulkan/vn_cs.h @@ -192,6 +192,9 @@ vn_cs_encoder_write(struct vn_cs_encoder *enc, void vn_cs_encoder_commit(struct vn_cs_encoder *enc); +bool +vn_cs_encoder_needs_roundtrip(struct vn_cs_encoder *enc); + static inline void vn_cs_decoder_init(struct vn_cs_decoder *dec, const void *data, size_t size) { diff --git a/src/virtio/vulkan/vn_ring.c b/src/virtio/vulkan/vn_ring.c index afe20b19817..919218719e9 100644 --- a/src/virtio/vulkan/vn_ring.c +++ b/src/virtio/vulkan/vn_ring.c @@ -569,6 +569,9 @@ vn_ring_cs_upload_locked(struct vn_ring *ring, const struct vn_cs_encoder *cs) vn_cs_encoder_write(upload, cs_size, cs_data, cs_size); vn_cs_encoder_commit(upload); + if (vn_cs_encoder_needs_roundtrip(upload)) + vn_ring_roundtrip(ring); + return upload; } @@ -657,6 +660,10 @@ vn_ring_submit_command(struct vn_ring *ring, ring->instance, submit->reply_size, &reply_offset); if (!submit->reply_shmem) return; + + if (ring->instance->renderer->info.has_guest_vram && + !submit->reply_shmem->cache_timestamp) + vn_ring_roundtrip(ring); } mtx_lock(&ring->mutex);