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);